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

taosdata / TDengine / #3720

26 Mar 2025 06:20AM UTC coverage: 30.242% (-31.7%) from 61.936%
#3720

push

travis-ci

web-flow
feat(taosBenchmark): supports decimal data type (#30456)

* feat: taosBenchmark supports decimal data type

* build: decimal script not use pytest.sh

* fix: fix typo for decimal script

* test: insertBasic.py debug

71234 of 313946 branches covered (22.69%)

Branch coverage included in aggregate %.

38 of 423 new or added lines in 8 files covered. (8.98%)

120240 existing lines in 447 files now uncovered.

118188 of 312400 relevant lines covered (37.83%)

1450220.33 hits per line

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

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

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

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

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

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

44
  return "unknown task";
×
45
}
46

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

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

70
  return targetName[target];
×
71
}
72

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

78
  taosArrayDestroy(resNode->pExecInfo);
9,094✔
79

80
  SNode *node = NULL;
9,094✔
81
  FOREACH(node, resNode->pChildren) { qExplainFreeResNode((SExplainResNode *)node); }
14,408✔
82
  nodesClearList(resNode->pChildren);
9,094✔
83

84
  taosMemoryFreeClear(resNode);
9,094!
85
}
86

87
void qExplainFreeCtx(SExplainCtx *pCtx) {
7,569,039✔
88
  if (NULL == pCtx) {
7,569,039!
89
    return;
7,570,983✔
90
  }
91

UNCOV
92
  int32_t rowSize = taosArrayGetSize(pCtx->rows);
×
93
  for (int32_t i = 0; i < rowSize; ++i) {
34,740✔
94
    SQueryExplainRowInfo *row = taosArrayGet(pCtx->rows, i);
34,352✔
95
    taosMemoryFreeClear(row->buf);
34,352!
96
  }
97

98
  if (EXPLAIN_MODE_ANALYZE == pCtx->mode && pCtx->groupHash) {
388!
99
    void *pIter = taosHashIterate(pCtx->groupHash, NULL);
388✔
100
    while (pIter) {
2,168✔
101
      SExplainGroup *group = (SExplainGroup *)pIter;
1,780✔
102
      if (group->nodeExecInfo) {
1,780✔
103
        int32_t num = taosArrayGetSize(group->nodeExecInfo);
1,772✔
104
        for (int32_t i = 0; i < num; ++i) {
5,616✔
105
          SExplainRsp *rsp = taosArrayGet(group->nodeExecInfo, i);
3,844✔
106
          tFreeSExplainRsp(rsp);
3,844✔
107
        }
108
        taosArrayDestroy(group->nodeExecInfo);
1,772✔
109
      }
110

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

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

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

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

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

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

148
  *pCtx = ctx;
388✔
149

150
  return TSDB_CODE_SUCCESS;
388✔
151

152
_return:
×
153

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

158
  QRY_RET(code);
×
159
}
160

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

165
  if (pPhysiChildren) {
9,094✔
166
    int32_t code = nodesMakeList(pChildren);
2,742✔
167
    if (NULL == *pChildren) {
2,742!
168
      qError("nodesMakeList failed");
×
169
      QRY_ERR_RET(code);
×
170
    }
171
  }
172

173
  SNode           *node = NULL;
9,094✔
174
  SExplainResNode *pResNode = NULL;
9,094✔
175
  FOREACH(node, pPhysiChildren) {
14,408✔
176
    QRY_ERR_RET(qExplainGenerateResNode((SPhysiNode *)node, group, &pResNode));
5,314!
177
    QRY_ERR_RET(nodesListAppend(*pChildren, (SNode *)pResNode));
5,314!
178
  }
179

180
  return TSDB_CODE_SUCCESS;
9,094✔
181
}
182

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

190
  SExplainRsp *rsp = NULL;
9,094✔
191
  if (group->singleChannel) {
9,094✔
192
    if (0 == group->physiPlanExecIdx) {
3,416✔
193
      group->nodeIdx = 0;
3,080✔
194
    }
195

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

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

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

215
  ++group->physiPlanExecIdx;
9,094✔
216

217
  return TSDB_CODE_SUCCESS;
9,094✔
218
}
219

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

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

233
  int32_t code = 0;
9,094✔
234
  resNode->pNode = pNode;
9,094✔
235

236
  if (group->nodeExecInfo) {
9,094!
237
    QRY_ERR_JRET(qExplainGenerateResNodeExecInfo(pNode, &resNode->pExecInfo, group));
9,094!
238
  }
239

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

242
  *pResNode = resNode;
9,094✔
243

244
  return TSDB_CODE_SUCCESS;
9,094✔
245

246
_return:
×
247

248
  qExplainFreeResNode(resNode);
×
249

250
  QRY_RET(code);
×
251
}
252

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

258
  for (int32_t i = 0; i < nodeNum; ++i) {
18,204✔
259
    SExplainExecInfo *execInfo = taosArrayGet(pExecInfo, i);
9,110✔
260
    if (execInfo->startupCost > maxExecInfo.startupCost) {
9,110✔
261
      maxExecInfo.startupCost = execInfo->startupCost;
5,982✔
262
    }
263
    if (execInfo->totalCost > maxExecInfo.totalCost) {
9,110✔
264
      maxExecInfo.totalCost = execInfo->totalCost;
7,996✔
265
    }
266
    if (execInfo->numOfRows > maxExecInfo.numOfRows) {
9,110✔
267
      maxExecInfo.numOfRows = execInfo->numOfRows;
4,425✔
268
    }
269
  }
270

271
  EXPLAIN_ROW_APPEND(EXPLAIN_EXECINFO_FORMAT, maxExecInfo.startupCost, maxExecInfo.totalCost, maxExecInfo.numOfRows);
9,094✔
272

273
  *len = tlen;
9,094✔
274

275
  return TSDB_CODE_SUCCESS;
9,094✔
276
}
277

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

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

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

295
  *len = tlen;
4✔
296

297
  return TSDB_CODE_SUCCESS;
4✔
298
}
299

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

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

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

319
  return TSDB_CODE_SUCCESS;
34,352✔
320
}
321

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

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

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

343
  if ((isGroupByTbname && (pScan->groupSort || pScan->scan.groupOrderScan)) || (isGroupByTag && (pScan->groupSort || pScan->scan.groupOrderScan))) {
3,100!
UNCOV
344
    return "grp_order";
×
345
  }
346

347
  return "ts_order";
3,100✔
348
}
349

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

362
  return "unknown";
×
363
}
364

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

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

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

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

413
        if (pTagScanNode->scan.node.pConditions) {
4!
414
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
415
          QRY_ERR_RET(nodesNodeToSQL(pTagScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
416
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
417
          EXPLAIN_ROW_END();
×
418
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
419
        }
420
      }
421
      break;
4✔
422
    }
423
    case QUERY_NODE_PHYSICAL_PLAN_VIRTUAL_TABLE_SCAN: {
×
424
      SVirtualScanPhysiNode *pVirtualTableScanNode = (SVirtualScanPhysiNode *)pNode;
×
425
      EXPLAIN_ROW_NEW(level, EXPLAIN_VIRTUAL_TABLE_SCAN_FORMAT, pVirtualTableScanNode->scan.tableName.tname);
×
426
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
427
      if (pResNode->pExecInfo) {
×
428
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
429
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
430
      }
431
      if (pVirtualTableScanNode->scan.pScanPseudoCols) {
×
432
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pVirtualTableScanNode->scan.pScanPseudoCols->length);
×
433
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
434
      }
435
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pVirtualTableScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
×
436
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
437
      EXPLAIN_ROW_END();
×
438
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
439

440
      if (verbose) {
×
441
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
442
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
443
                           nodesGetOutputNumFromSlotList(pVirtualTableScanNode->scan.node.pOutputDataBlockDesc->pSlots));
444
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
445
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pVirtualTableScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
×
446
        EXPLAIN_ROW_APPEND_LIMIT(pVirtualTableScanNode->scan.node.pLimit);
×
447
        EXPLAIN_ROW_APPEND_SLIMIT(pVirtualTableScanNode->scan.node.pSlimit);
×
448
        EXPLAIN_ROW_END();
×
449
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
450

451
        if (pResNode->pExecInfo) {
×
452
          QRY_ERR_RET(qExplainBufAppendVerboseExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
453
          if (tlen) {
×
454
            EXPLAIN_ROW_END();
×
455
            QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
456
          }
457
        }
458

459
        if (pVirtualTableScanNode->scan.node.pConditions) {
×
460
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
461
          QRY_ERR_RET(nodesNodeToSQL(pVirtualTableScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
462
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
463
          EXPLAIN_ROW_END();
×
464
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
465
        }
466
      }
467
      break;
×
468
    }
469
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN:
3,100✔
470
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
471
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN: {
472
      STableScanPhysiNode *pTblScanNode = (STableScanPhysiNode *)pNode;
3,100✔
473
      EXPLAIN_ROW_NEW(level,
3,100!
474
                      QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN == pNode->type ? EXPLAIN_TBL_MERGE_SCAN_FORMAT
475
                                                                               : EXPLAIN_TBL_SCAN_FORMAT,
476
                      pTblScanNode->scan.tableName.tname);
477
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
3,100✔
478
      if (pResNode->pExecInfo) {
3,100!
479
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
3,100!
480
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,100✔
481
      }
482

483
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pTblScanNode->scan.pScanCols->length);
3,100✔
484
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,100✔
485
      if (pTblScanNode->scan.pScanPseudoCols) {
3,100✔
486
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pTblScanNode->scan.pScanPseudoCols->length);
76✔
487
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
76✔
488
      }
489
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTblScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
3,100✔
490
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,100✔
491
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_ORDER_FORMAT, pTblScanNode->scanSeq[0], pTblScanNode->scanSeq[1]);
3,100✔
492
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,100✔
493
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_MODE_FORMAT, qExplainGetScanMode(pTblScanNode));
3,100✔
494
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,100✔
495
      EXPLAIN_ROW_APPEND(EXPLAIN_SCAN_DATA_LOAD_FORMAT, qExplainGetScanDataLoad(pTblScanNode));
3,100✔
496
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
3,100✔
497
      EXPLAIN_ROW_END();
3,100✔
498
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
3,100!
499

500
      // basic analyze output
501
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
3,100!
502
        EXPLAIN_ROW_NEW(level + 1, "I/O: ");
3,100!
503

504
        int32_t                      nodeNum = taosArrayGetSize(pResNode->pExecInfo);
3,100✔
505
        struct STableScanAnalyzeInfo info = {0};
3,100✔
506

507
        int32_t maxIndex = 0;
3,100✔
508
        int32_t totalRows = 0;
3,100✔
509
        for (int32_t i = 0; i < nodeNum; ++i) {
6,208✔
510
          SExplainExecInfo      *execInfo = taosArrayGet(pResNode->pExecInfo, i);
3,108✔
511
          STableScanAnalyzeInfo *pScanInfo = (STableScanAnalyzeInfo *)execInfo->verboseInfo;
3,108✔
512

513
          info.totalBlocks += pScanInfo->totalBlocks;
3,108✔
514
          info.loadBlocks += pScanInfo->loadBlocks;
3,108✔
515
          info.totalRows += pScanInfo->totalRows;
3,108✔
516
          info.skipBlocks += pScanInfo->skipBlocks;
3,108✔
517
          info.filterTime += pScanInfo->filterTime;
3,108✔
518
          info.loadBlockStatis += pScanInfo->loadBlockStatis;
3,108✔
519
          info.totalCheckedRows += pScanInfo->totalCheckedRows;
3,108✔
520
          info.filterOutBlocks += pScanInfo->filterOutBlocks;
3,108✔
521

522
          if (pScanInfo->totalRows > totalRows) {
3,108✔
523
            totalRows = pScanInfo->totalRows;
469✔
524
            maxIndex = i;
469✔
525
          }
526
        }
527

528
        EXPLAIN_ROW_APPEND("total_blocks=%.1f", ((double)info.totalBlocks) / nodeNum);
3,100✔
529
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,100✔
530

531
        EXPLAIN_ROW_APPEND("load_blocks=%.1f", ((double)info.loadBlocks) / nodeNum);
3,100✔
532
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,100✔
533

534
        EXPLAIN_ROW_APPEND("load_block_SMAs=%.1f", ((double)info.loadBlockStatis) / nodeNum);
3,100✔
535
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,100✔
536

537
        EXPLAIN_ROW_APPEND("total_rows=%.1f", ((double)info.totalRows) / nodeNum);
3,100✔
538
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,100✔
539

540
        EXPLAIN_ROW_APPEND("check_rows=%.1f", ((double)info.totalCheckedRows) / nodeNum);
3,100✔
541
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,100✔
542
        EXPLAIN_ROW_END();
3,100✔
543

544
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
3,100!
545

546
        // 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,
547
        // start offset by 1.470 ms.
548
        SExplainExecInfo      *execInfo = taosArrayGet(pResNode->pExecInfo, maxIndex);
3,100✔
549
        STableScanAnalyzeInfo *p1 = (STableScanAnalyzeInfo *)execInfo->verboseInfo;
3,100✔
550

551
        EXPLAIN_ROW_NEW(level + 1, " ");
3,100!
552
        EXPLAIN_ROW_APPEND("max_row_task=%d, total_rows:%" PRId64 ", ep:%s (cost=%.3f..%.3f)", maxIndex, p1->totalRows,
3,100✔
553
                           "tbd", execInfo->startupCost, execInfo->totalCost);
554
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,100✔
555
        EXPLAIN_ROW_END();
3,100✔
556

557
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
3,100!
558
      }
559

560
      if (verbose) {
3,100!
561
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
3,100!
562
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
3,100✔
563
                           nodesGetOutputNumFromSlotList(pTblScanNode->scan.node.pOutputDataBlockDesc->pSlots));
564
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,100✔
565
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pTblScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
3,100✔
566
        EXPLAIN_ROW_APPEND_LIMIT(pTblScanNode->scan.node.pLimit);
3,100!
567
        EXPLAIN_ROW_APPEND_SLIMIT(pTblScanNode->scan.node.pSlimit);
3,100!
568
        EXPLAIN_ROW_END();
3,100✔
569
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
3,100!
570

571
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pTblScanNode->scanRange.skey,
3,100!
572
                        pTblScanNode->scanRange.ekey);
573
        EXPLAIN_ROW_END();
3,100✔
574
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
3,100!
575

576
        if (NULL != pTblScanNode->pGroupTags) {
3,100!
UNCOV
577
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PARTITION_KETS_FORMAT);
×
UNCOV
578
          EXPLAIN_ROW_APPEND(EXPLAIN_PARTITIONS_FORMAT, pTblScanNode->pGroupTags->length);
×
UNCOV
579
          EXPLAIN_ROW_END();
×
UNCOV
580
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
581
        }
582

583
        if (pTblScanNode->scan.node.pConditions) {
3,100✔
584
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
6!
585
          QRY_ERR_RET(nodesNodeToSQL(pTblScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
6!
586
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
587
          EXPLAIN_ROW_END();
6✔
588
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
6!
589
        }
590
      }
591
      break;
3,100✔
592
    }
UNCOV
593
    case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN: {
×
UNCOV
594
      SSystemTableScanPhysiNode *pSTblScanNode = (SSystemTableScanPhysiNode *)pNode;
×
UNCOV
595
      EXPLAIN_ROW_NEW(level, EXPLAIN_SYSTBL_SCAN_FORMAT, pSTblScanNode->scan.tableName.tname);
×
UNCOV
596
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
UNCOV
597
      if (pResNode->pExecInfo) {
×
UNCOV
598
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
UNCOV
599
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
600
      }
UNCOV
601
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pSTblScanNode->scan.pScanCols->length);
×
UNCOV
602
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
603
      if (pSTblScanNode->scan.pScanPseudoCols) {
×
UNCOV
604
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pSTblScanNode->scan.pScanPseudoCols->length);
×
UNCOV
605
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
606
      }
UNCOV
607
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSTblScanNode->scan.node.pOutputDataBlockDesc->totalRowSize);
×
UNCOV
608
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
609
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
UNCOV
610
      EXPLAIN_ROW_END();
×
UNCOV
611
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
612

UNCOV
613
      if (verbose) {
×
UNCOV
614
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
UNCOV
615
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
616
                           nodesGetOutputNumFromSlotList(pSTblScanNode->scan.node.pOutputDataBlockDesc->pSlots));
UNCOV
617
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
618
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSTblScanNode->scan.node.pOutputDataBlockDesc->outputRowSize);
×
UNCOV
619
        EXPLAIN_ROW_APPEND_LIMIT(pSTblScanNode->scan.node.pLimit);
×
UNCOV
620
        EXPLAIN_ROW_APPEND_SLIMIT(pSTblScanNode->scan.node.pSlimit);
×
UNCOV
621
        EXPLAIN_ROW_END();
×
UNCOV
622
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
623

UNCOV
624
        if (pSTblScanNode->scan.node.pConditions) {
×
UNCOV
625
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
UNCOV
626
          QRY_ERR_RET(nodesNodeToSQL(pSTblScanNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
627
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
UNCOV
628
          EXPLAIN_ROW_END();
×
UNCOV
629
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
630
        }
631
      }
UNCOV
632
      break;
×
633
    }
634
    case QUERY_NODE_PHYSICAL_PLAN_PROJECT: {
512✔
635
      SProjectPhysiNode *pPrjNode = (SProjectPhysiNode *)pNode;
512✔
636
      EXPLAIN_ROW_NEW(level, EXPLAIN_PROJECTION_FORMAT);
512!
637
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
512✔
638
      if (pResNode->pExecInfo) {
512!
639
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
512!
640
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
512✔
641
      }
642
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pPrjNode->pProjections->length);
512✔
643
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
512✔
644
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPrjNode->node.pOutputDataBlockDesc->totalRowSize);
512✔
645
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
512✔
646
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pPrjNode->node.inputTsOrder));
512!
647
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
512✔
648
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
512✔
649
      EXPLAIN_ROW_END();
512✔
650
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
512!
651

652
      if (verbose) {
512!
653
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
512!
654
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
512✔
655
                           nodesGetOutputNumFromSlotList(pPrjNode->node.pOutputDataBlockDesc->pSlots));
656
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
512✔
657
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPrjNode->node.pOutputDataBlockDesc->outputRowSize);
512✔
658
        EXPLAIN_ROW_APPEND_LIMIT(pPrjNode->node.pLimit);
512!
659
        EXPLAIN_ROW_APPEND_SLIMIT(pPrjNode->node.pSlimit);
512!
660
        EXPLAIN_ROW_END();
512✔
661
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
512!
662

663
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
512!
664
        EXPLAIN_ROW_APPEND(EXPLAIN_IGNORE_GROUPID_FORMAT, pPrjNode->ignoreGroupId ? "true" : "false");
512!
665
        EXPLAIN_ROW_END();
512✔
666
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
512!
667

668
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pPrjNode->mergeDataBlock? "True":"False");
512!
669
        EXPLAIN_ROW_END();
512✔
670
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
512!
671

672
        if (pPrjNode->node.pConditions) {
512!
673
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
674
          QRY_ERR_RET(nodesNodeToSQL(pPrjNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
675
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
676
          EXPLAIN_ROW_END();
×
677
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
678
        }
679
      }
680
      break;
512✔
681
    }
682
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN: {
544✔
683
      SSortMergeJoinPhysiNode *pJoinNode = (SSortMergeJoinPhysiNode *)pNode;
544✔
684
      EXPLAIN_ROW_NEW(level, EXPLAIN_JOIN_FORMAT, gJoinTypeStr[pJoinNode->joinType][pJoinNode->subType]);
544!
685
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
544✔
686
      if (pResNode->pExecInfo) {
544!
687
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
544!
688
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
544✔
689
      }
690
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pJoinNode->pTargets->length);
544✔
691
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
544✔
692
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->totalRowSize);
544✔
693
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
544✔
694
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pJoinNode->node.inputTsOrder));
544!
695
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
544✔
696
      EXPLAIN_ROW_APPEND(EXPLAIN_JOIN_ALGO, "Merge");
544✔
697
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
544✔
698
      EXPLAIN_ROW_END();
544✔
699
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
544!
700

701
      if (verbose) {
544!
702
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
544!
703
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
544✔
704
                           nodesGetOutputNumFromSlotList(pJoinNode->node.pOutputDataBlockDesc->pSlots));
705
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
544✔
706
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->outputRowSize);
544✔
707
        EXPLAIN_ROW_APPEND_LIMIT(pJoinNode->node.pLimit);
544!
708
        EXPLAIN_ROW_APPEND_SLIMIT(pJoinNode->node.pSlimit);
544!
709
        EXPLAIN_ROW_END();
544✔
710
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
544!
711

712
        if (IS_ASOF_JOIN(pJoinNode->subType) || IS_WINDOW_JOIN(pJoinNode->subType)) {
544✔
713
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_JOIN_PARAM_FORMAT);
248!
714
          if (IS_ASOF_JOIN(pJoinNode->subType)) {
248✔
715
            EXPLAIN_ROW_APPEND(EXPLAIN_ASOF_OP_FORMAT, qExplainGetAsofOpStr(pJoinNode->asofOpType));
112✔
716
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
112✔
717
          }
718
          if (NULL != pJoinNode->pWindowOffset) {
248✔
719
            SWindowOffsetNode* pWinOffset = (SWindowOffsetNode*)pJoinNode->pWindowOffset;
136✔
720
            SValueNode* pStart = (SValueNode*)pWinOffset->pStartOffset;
136✔
721
            SValueNode* pEnd = (SValueNode*)pWinOffset->pEndOffset;
136✔
722
            EXPLAIN_ROW_APPEND(EXPLAIN_WIN_OFFSET_FORMAT, pStart->literal, pEnd->literal);
136✔
723
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
136✔
724
          }
725
          if (NULL != pJoinNode->pJLimit && NULL != ((SLimitNode*)pJoinNode->pJLimit)->limit) {
248!
726
            SLimitNode* pJLimit = (SLimitNode*)pJoinNode->pJLimit;
44✔
727
            EXPLAIN_ROW_APPEND(EXPLAIN_JLIMIT_FORMAT, pJLimit->limit->datum.i);
44✔
728
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
44✔
729
          }
730
          if (IS_WINDOW_JOIN(pJoinNode->subType)) {
248✔
731
            EXPLAIN_ROW_APPEND(EXPLAIN_SEQ_WIN_GRP_FORMAT, pJoinNode->seqWinGroup);
136✔
732
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
136✔
733
          }
734

735
          EXPLAIN_ROW_APPEND(EXPLAIN_GRP_JOIN_FORMAT, pJoinNode->grpJoin);
248✔
736
          EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
248✔
737
          EXPLAIN_ROW_END();
248✔
738

739
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
248!
740
        }
741

742
        if (pJoinNode->node.pConditions) {
544✔
743
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
46!
744
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
46!
745
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
746
          EXPLAIN_ROW_END();
46✔
747
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
46!
748
        }
749

750
        if (NULL != pJoinNode->pPrimKeyCond) {
544✔
751
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PRIM_CONDITIONS_FORMAT);
372!
752
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->pPrimKeyCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
372!
753
          EXPLAIN_ROW_END();
372✔
754
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
372!
755
        }
756

757
        if (NULL != pJoinNode->pEqLeft && pJoinNode->pEqLeft->length > 0) {
544!
758
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_JOIN_EQ_LEFT_FORMAT);
2!
759
          SNode* pCol = NULL;
2✔
760
          FOREACH(pCol, pJoinNode->pEqLeft) {
4!
761
            EXPLAIN_ROW_APPEND("`%s`.`%s` ", ((SColumnNode*)pCol)->tableAlias, ((SColumnNode*)pCol)->colName);
2✔
762
          }
763
          EXPLAIN_ROW_END();
2✔
764
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2!
765
        }
766

767
        if (NULL != pJoinNode->pEqRight && pJoinNode->pEqRight->length > 0) {
544!
768
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_JOIN_EQ_RIGHT_FORMAT);
2!
769
          SNode* pCol = NULL;
2✔
770
          FOREACH(pCol, pJoinNode->pEqRight) {
4!
771
            EXPLAIN_ROW_APPEND("`%s`.`%s` ", ((SColumnNode*)pCol)->tableAlias, ((SColumnNode*)pCol)->colName);
2✔
772
          }
773
          EXPLAIN_ROW_END();
2✔
774
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2!
775
        }
776

777
        if (NULL != pJoinNode->pFullOnCond) {
544✔
778
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_ON_CONDITIONS_FORMAT);
20!
779
          QRY_ERR_RET(
20!
780
                nodesNodeToSQL(pJoinNode->pFullOnCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
781
          EXPLAIN_ROW_END();
20✔
782
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
20!
783
        }
784

785
        if (NULL != pJoinNode->pColOnCond) {
544✔
786
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COL_ON_CONDITIONS_FORMAT);
18!
787
          QRY_ERR_RET(
18!
788
                nodesNodeToSQL(pJoinNode->pColOnCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
789
          EXPLAIN_ROW_END();
18✔
790
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
18!
791
        }
792
      }
793
      break;
544✔
794
    }
795
    case QUERY_NODE_PHYSICAL_PLAN_HASH_AGG: {
84✔
796
      SAggPhysiNode *pAggNode = (SAggPhysiNode *)pNode;
84✔
797
      EXPLAIN_ROW_NEW(level, EXPLAIN_AGG_FORMAT, (pAggNode->pGroupKeys ? "GroupAggregate" : "Aggregate"));
84!
798
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
84✔
799
      if (pResNode->pExecInfo) {
84!
800
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
84!
801
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
84✔
802
      }
803
      if (pAggNode->pAggFuncs) {
84✔
804
        EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pAggNode->pAggFuncs->length);
8✔
805
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
8✔
806
      }
807
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pAggNode->node.pOutputDataBlockDesc->totalRowSize);
84✔
808
      if (pAggNode->pGroupKeys) {
84✔
809
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
76✔
810
        EXPLAIN_ROW_APPEND(EXPLAIN_GROUPS_FORMAT, pAggNode->pGroupKeys->length);
76✔
811
      }
812
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
84✔
813
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pAggNode->node.inputTsOrder));
84!
814
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
84✔
815
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
84✔
816
      EXPLAIN_ROW_END();
84✔
817
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
84!
818

819
      if (verbose) {
84!
820
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
84!
821
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
84✔
822
                           nodesGetOutputNumFromSlotList(pAggNode->node.pOutputDataBlockDesc->pSlots));
823
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
84✔
824
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pAggNode->node.pOutputDataBlockDesc->outputRowSize);
84✔
825
        EXPLAIN_ROW_APPEND_LIMIT(pAggNode->node.pLimit);
84!
826
        EXPLAIN_ROW_APPEND_SLIMIT(pAggNode->node.pSlimit);
84!
827
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
84✔
828
        EXPLAIN_ROW_APPEND(EXPLAIN_PLAN_BLOCKING, !pAggNode->node.forceCreateNonBlockingOptr);
84✔
829
        EXPLAIN_ROW_END();
84✔
830
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
84!
831

832
        if (pAggNode->node.pConditions) {
84✔
833
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
4!
834
          QRY_ERR_RET(nodesNodeToSQL(pAggNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
4!
835
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
836
          EXPLAIN_ROW_END();
4✔
837
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
4!
838
        }
839

840
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pAggNode->mergeDataBlock? "True":"False");
84!
841
        EXPLAIN_ROW_END();
84✔
842
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
84!
843
      }
844
      break;
84✔
845
    }
846
    case QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC: {
8✔
847
      SIndefRowsFuncPhysiNode *pIndefNode = (SIndefRowsFuncPhysiNode *)pNode;
8✔
848
      EXPLAIN_ROW_NEW(level, EXPLAIN_INDEF_ROWS_FORMAT);
8!
849
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
8✔
850
      if (pResNode->pExecInfo) {
8!
851
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
8!
852
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
8✔
853
      }
854
      if (pIndefNode->pFuncs) {
8!
855
        EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pIndefNode->pFuncs->length);
8✔
856
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
8✔
857
      }
858
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIndefNode->node.pOutputDataBlockDesc->totalRowSize);
8✔
859
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
8✔
860
      EXPLAIN_ROW_END();
8✔
861
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
8!
862

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

874
        if (pIndefNode->node.pConditions) {
8!
875
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
876
          QRY_ERR_RET(nodesNodeToSQL(pIndefNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
877
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
878
          EXPLAIN_ROW_END();
×
879
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
880
        }
881
      }
882
      break;
8✔
883
    }
884
    case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE: {
3,248✔
885
      SExchangePhysiNode *pExchNode = (SExchangePhysiNode *)pNode;
3,248✔
886
      int32_t nodeNum = 0;
3,248✔
887
      for (int32_t i = pExchNode->srcStartGroupId; i <= pExchNode->srcEndGroupId; ++i) {
6,648✔
888
        SExplainGroup      *group = taosHashGet(ctx->groupHash, &pExchNode->srcStartGroupId, sizeof(pExchNode->srcStartGroupId));
3,400✔
889
        if (NULL == group) {
3,400!
890
          qError("exchange src group %d not in groupHash", pExchNode->srcStartGroupId);
×
891
          QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
892
        }
893

894
        nodeNum += group->nodeNum;
3,400✔
895
      }
896

897
      EXPLAIN_ROW_NEW(level, EXPLAIN_EXCHANGE_FORMAT, pExchNode->singleChannel ? 1 : nodeNum);
3,248!
898
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
3,248✔
899
      if (pResNode->pExecInfo) {
3,248!
900
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
3,248!
901
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,248✔
902
      }
903
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExchNode->node.pOutputDataBlockDesc->totalRowSize);
3,248✔
904
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
3,248✔
905
      EXPLAIN_ROW_END();
3,248✔
906
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
3,248!
907

908
      if (verbose) {
3,248!
909
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
3,248!
910
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
3,248✔
911
                           nodesGetOutputNumFromSlotList(pExchNode->node.pOutputDataBlockDesc->pSlots));
912
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
3,248✔
913
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pExchNode->node.pOutputDataBlockDesc->outputRowSize);
3,248✔
914
        EXPLAIN_ROW_APPEND_LIMIT(pExchNode->node.pLimit);
3,248!
915
        EXPLAIN_ROW_APPEND_SLIMIT(pExchNode->node.pSlimit);
3,248!
916
        EXPLAIN_ROW_END();
3,248✔
917
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
3,248!
918

919
        if (pExchNode->node.pConditions) {
3,248!
920
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
921
          QRY_ERR_RET(nodesNodeToSQL(pExchNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
922
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
923
          EXPLAIN_ROW_END();
×
924
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
925
        }
926
      }
927

928
      for (int32_t i = pExchNode->srcStartGroupId; i <= pExchNode->srcEndGroupId; ++i) {
6,648✔
929
        QRY_ERR_RET(qExplainAppendGroupResRows(ctx, i, level + 1, pExchNode->singleChannel));
3,400!
930
      }
931
      break;
3,248✔
932
    }
933
    case QUERY_NODE_PHYSICAL_PLAN_SORT: {
196✔
934
      SSortPhysiNode *pSortNode = (SSortPhysiNode *)pNode;
196✔
935
      EXPLAIN_ROW_NEW(level, EXPLAIN_SORT_FORMAT);
196!
936
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
196✔
937
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pSortNode->node.inputTsOrder));
196!
938
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
196✔
939
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pSortNode->node.outputTsOrder));
196!
940
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
196✔
941
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
196✔
942
      if (pResNode->pExecInfo) {
196!
943
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
196!
944
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
196✔
945
      }
946

947
      SDataBlockDescNode *pDescNode = pSortNode->node.pOutputDataBlockDesc;
196✔
948
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, nodesGetOutputNumFromSlotList(pDescNode->pSlots));
196✔
949
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
196✔
950
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDescNode->totalRowSize);
196✔
951
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
196✔
952
      EXPLAIN_ROW_END();
196✔
953
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
196!
954

955
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
196!
956
        // sort key
957
        EXPLAIN_ROW_NEW(level + 1, "Sort Key: ");
196!
958
        if (pResNode->pExecInfo) {
196!
959
          for (int32_t i = 0; i < LIST_LENGTH(pSortNode->pSortKeys); ++i) {
392!
960
            SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pSortNode->pSortKeys, i);
196✔
961
            EXPLAIN_ROW_APPEND("%s ", nodesGetNameFromColumnNode(ptn->pExpr));
196✔
962
          }
963
        }
964

965
        EXPLAIN_ROW_END();
196✔
966
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
196!
967

968
        // sort method
969
        EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
196!
970

971
        int32_t           nodeNum = taosArrayGetSize(pResNode->pExecInfo);
196✔
972
        SExplainExecInfo *execInfo = taosArrayGet(pResNode->pExecInfo, 0);
196✔
973
        SSortExecInfo    *pExecInfo = (SSortExecInfo *)execInfo->verboseInfo;
196✔
974
        EXPLAIN_ROW_APPEND("%s", pExecInfo->sortMethod == SORT_QSORT_T ? "quicksort" : "merge sort");
196✔
975
        if (pExecInfo->sortBuffer > 1024 * 1024) {
196✔
976
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Mb", pExecInfo->sortBuffer / (1024 * 1024.0));
164✔
977
        } else if (pExecInfo->sortBuffer > 1024) {
32!
978
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Kb", pExecInfo->sortBuffer / (1024.0));
×
979
        } else {
980
          EXPLAIN_ROW_APPEND("  Buffers:%d b", pExecInfo->sortBuffer);
32✔
981
        }
982

983
        EXPLAIN_ROW_APPEND("  loops:%d", pExecInfo->loops);
196✔
984
        EXPLAIN_ROW_END();
196✔
985
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
196!
986
      }
987

988
      if (verbose) {
196!
989
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
196!
990
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
196✔
991
                           nodesGetOutputNumFromSlotList(pSortNode->node.pOutputDataBlockDesc->pSlots));
992
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
196✔
993
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSortNode->node.pOutputDataBlockDesc->outputRowSize);
196✔
994
        EXPLAIN_ROW_APPEND_LIMIT(pSortNode->node.pLimit);
196!
995
        EXPLAIN_ROW_APPEND_SLIMIT(pSortNode->node.pSlimit);
196!
996
        EXPLAIN_ROW_END();
196✔
997
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
196!
998

999
        if (pSortNode->node.pConditions) {
196!
1000
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1001
          QRY_ERR_RET(nodesNodeToSQL(pSortNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1002
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1003
          EXPLAIN_ROW_END();
×
1004
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1005
        }
1006
      }
1007
      break;
196✔
1008
    }
UNCOV
1009
    case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL: {
×
UNCOV
1010
      SIntervalPhysiNode *pIntNode = (SIntervalPhysiNode *)pNode;
×
UNCOV
1011
      EXPLAIN_ROW_NEW(level, EXPLAIN_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
×
UNCOV
1012
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
UNCOV
1013
      if (pResNode->pExecInfo) {
×
UNCOV
1014
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
UNCOV
1015
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1016
      }
UNCOV
1017
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pIntNode->window.pFuncs->length);
×
UNCOV
1018
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1019
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->totalRowSize);
×
UNCOV
1020
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1021
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.inputTsOrder));
×
UNCOV
1022
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1023
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.outputTsOrder));
×
UNCOV
1024
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1025
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
UNCOV
1026
      EXPLAIN_ROW_END();
×
UNCOV
1027
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1028

UNCOV
1029
      if (verbose) {
×
UNCOV
1030
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
UNCOV
1031
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1032
                           nodesGetOutputNumFromSlotList(pIntNode->window.node.pOutputDataBlockDesc->pSlots));
UNCOV
1033
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1034
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->outputRowSize);
×
UNCOV
1035
        EXPLAIN_ROW_APPEND_LIMIT(pIntNode->window.node.pLimit);
×
UNCOV
1036
        EXPLAIN_ROW_APPEND_SLIMIT(pIntNode->window.node.pSlimit);
×
UNCOV
1037
        EXPLAIN_ROW_END();
×
UNCOV
1038
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
UNCOV
1039
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pIntNode->timeRange.skey, pIntNode->timeRange.ekey);
×
UNCOV
1040
        EXPLAIN_ROW_END();
×
UNCOV
1041
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
UNCOV
1042
        uint8_t precision = qExplainGetIntervalPrecision(pIntNode);
×
UNCOV
1043
        int64_t time1 = -1;
×
UNCOV
1044
        int64_t time2 = -1;
×
UNCOV
1045
        int32_t code = TSDB_CODE_SUCCESS;
×
UNCOV
1046
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1);
×
UNCOV
1047
        QRY_ERR_RET(code);
×
UNCOV
1048
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2);
×
UNCOV
1049
        QRY_ERR_RET(code);
×
UNCOV
1050
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT,
×
1051
                        time1,
1052
                        pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision),
1053
                        time2,
1054
                        pIntNode->slidingUnit);
UNCOV
1055
        EXPLAIN_ROW_END();
×
UNCOV
1056
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1057

UNCOV
1058
        if (pIntNode->window.node.pConditions) {
×
1059
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1060
          QRY_ERR_RET(nodesNodeToSQL(pIntNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1061
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1062
          EXPLAIN_ROW_END();
×
1063
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1064
        }
1065

UNCOV
1066
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pIntNode->window.mergeDataBlock? "True":"False");
×
UNCOV
1067
        EXPLAIN_ROW_END();
×
UNCOV
1068
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1069
      }
UNCOV
1070
      break;
×
1071
    }
UNCOV
1072
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL: {
×
UNCOV
1073
      SMergeAlignedIntervalPhysiNode *pIntNode = (SMergeAlignedIntervalPhysiNode *)pNode;
×
UNCOV
1074
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_ALIGNED_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
×
UNCOV
1075
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
UNCOV
1076
      if (pResNode->pExecInfo) {
×
UNCOV
1077
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
UNCOV
1078
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1079
      }
UNCOV
1080
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pIntNode->window.pFuncs->length);
×
UNCOV
1081
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1082
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->totalRowSize);
×
UNCOV
1083
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1084
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.inputTsOrder));
×
UNCOV
1085
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1086
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pIntNode->window.node.outputTsOrder));
×
UNCOV
1087
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
UNCOV
1088
      EXPLAIN_ROW_END();
×
UNCOV
1089
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1090

UNCOV
1091
      if (verbose) {
×
UNCOV
1092
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
UNCOV
1093
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1094
                           nodesGetOutputNumFromSlotList(pIntNode->window.node.pOutputDataBlockDesc->pSlots));
UNCOV
1095
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1096
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->outputRowSize);
×
UNCOV
1097
        EXPLAIN_ROW_APPEND_LIMIT(pIntNode->window.node.pLimit);
×
UNCOV
1098
        EXPLAIN_ROW_APPEND_SLIMIT(pIntNode->window.node.pSlimit);
×
UNCOV
1099
        EXPLAIN_ROW_END();
×
UNCOV
1100
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
UNCOV
1101
        uint8_t precision = qExplainGetIntervalPrecision(pIntNode);
×
UNCOV
1102
        int64_t time1 = -1;
×
UNCOV
1103
        int64_t time2 = -1;
×
UNCOV
1104
        int32_t code = TSDB_CODE_SUCCESS;
×
UNCOV
1105
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1);
×
UNCOV
1106
        QRY_ERR_RET(code);
×
UNCOV
1107
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2);
×
UNCOV
1108
        QRY_ERR_RET(code);
×
UNCOV
1109
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT,
×
1110
                        time1,
1111
                        pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision),
1112
                        time2,
1113
                        pIntNode->slidingUnit);
UNCOV
1114
        EXPLAIN_ROW_END();
×
UNCOV
1115
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1116

UNCOV
1117
        if (pIntNode->window.node.pConditions) {
×
UNCOV
1118
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
UNCOV
1119
          QRY_ERR_RET(nodesNodeToSQL(pIntNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1120
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
UNCOV
1121
          EXPLAIN_ROW_END();
×
UNCOV
1122
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1123
        }
1124

UNCOV
1125
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGEBLOCKS_FORMAT, pIntNode->window.mergeDataBlock? "True":"False");
×
UNCOV
1126
        EXPLAIN_ROW_END();
×
UNCOV
1127
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1128
      }
UNCOV
1129
      break;
×
1130
    }
UNCOV
1131
    case QUERY_NODE_PHYSICAL_PLAN_FILL: {
×
UNCOV
1132
      SFillPhysiNode *pFillNode = (SFillPhysiNode *)pNode;
×
UNCOV
1133
      EXPLAIN_ROW_NEW(level, EXPLAIN_FILL_FORMAT);
×
UNCOV
1134
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
UNCOV
1135
      if (pResNode->pExecInfo) {
×
UNCOV
1136
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
UNCOV
1137
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1138
      }
UNCOV
1139
      EXPLAIN_ROW_APPEND(EXPLAIN_MODE_FORMAT, nodesGetFillModeString(pFillNode->mode));
×
UNCOV
1140
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1141
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pFillNode->node.pOutputDataBlockDesc->totalRowSize);
×
UNCOV
1142
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1143
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pFillNode->node.inputTsOrder));
×
UNCOV
1144
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1145
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
UNCOV
1146
      EXPLAIN_ROW_END();
×
UNCOV
1147
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1148

UNCOV
1149
      if (verbose) {
×
UNCOV
1150
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
UNCOV
1151
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1152
                           nodesGetOutputNumFromSlotList(pFillNode->node.pOutputDataBlockDesc->pSlots));
UNCOV
1153
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1154
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pFillNode->node.pOutputDataBlockDesc->outputRowSize);
×
UNCOV
1155
        EXPLAIN_ROW_APPEND_LIMIT(pFillNode->node.pLimit);
×
UNCOV
1156
        EXPLAIN_ROW_APPEND_SLIMIT(pFillNode->node.pSlimit);
×
UNCOV
1157
        EXPLAIN_ROW_END();
×
UNCOV
1158
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
UNCOV
1159
        if (pFillNode->pValues) {
×
UNCOV
1160
          SNodeListNode *pValues = (SNodeListNode *)pFillNode->pValues;
×
UNCOV
1161
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILL_VALUE_FORMAT);
×
UNCOV
1162
          SNode  *tNode = NULL;
×
UNCOV
1163
          int32_t i = 0;
×
UNCOV
1164
          FOREACH(tNode, pValues->pNodeList) {
×
UNCOV
1165
            if (i) {
×
UNCOV
1166
              EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1167
            }
UNCOV
1168
            SValueNode *tValue = (SValueNode *)tNode;
×
UNCOV
1169
            char       *value = nodesGetStrValueFromNode(tValue);
×
UNCOV
1170
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, value);
×
UNCOV
1171
            taosMemoryFree(value);
×
UNCOV
1172
            ++i;
×
1173
          }
1174

UNCOV
1175
          EXPLAIN_ROW_END();
×
UNCOV
1176
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1177
        }
1178

UNCOV
1179
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pFillNode->timeRange.skey, pFillNode->timeRange.ekey);
×
UNCOV
1180
        EXPLAIN_ROW_END();
×
UNCOV
1181
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1182

UNCOV
1183
        if (pFillNode->node.pConditions) {
×
1184
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1185
          QRY_ERR_RET(nodesNodeToSQL(pFillNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1186
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1187
          EXPLAIN_ROW_END();
×
1188
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1189
        }
1190
      }
UNCOV
1191
      break;
×
1192
    }
UNCOV
1193
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_SESSION: {
×
UNCOV
1194
      SSessionWinodwPhysiNode *pSessNode = (SSessionWinodwPhysiNode *)pNode;
×
UNCOV
1195
      EXPLAIN_ROW_NEW(level, EXPLAIN_SESSION_FORMAT);
×
UNCOV
1196
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
UNCOV
1197
      if (pResNode->pExecInfo) {
×
1198
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1199
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1200
      }
UNCOV
1201
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pSessNode->window.pFuncs->length);
×
UNCOV
1202
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1203
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSessNode->window.node.pOutputDataBlockDesc->totalRowSize);
×
UNCOV
1204
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
UNCOV
1205
      EXPLAIN_ROW_END();
×
UNCOV
1206
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1207

UNCOV
1208
      if (verbose) {
×
UNCOV
1209
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
UNCOV
1210
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1211
                           nodesGetOutputNumFromSlotList(pSessNode->window.node.pOutputDataBlockDesc->pSlots));
UNCOV
1212
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1213
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSessNode->window.node.pOutputDataBlockDesc->outputRowSize);
×
UNCOV
1214
        EXPLAIN_ROW_APPEND_LIMIT(pSessNode->window.node.pLimit);
×
UNCOV
1215
        EXPLAIN_ROW_APPEND_SLIMIT(pSessNode->window.node.pSlimit);
×
UNCOV
1216
        EXPLAIN_ROW_END();
×
UNCOV
1217
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1218

UNCOV
1219
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_WINDOW_FORMAT, pSessNode->gap);
×
UNCOV
1220
        EXPLAIN_ROW_END();
×
UNCOV
1221
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1222

UNCOV
1223
        if (pSessNode->window.node.pConditions) {
×
1224
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1225
          QRY_ERR_RET(nodesNodeToSQL(pSessNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1226
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1227
          EXPLAIN_ROW_END();
×
1228
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1229
        }
1230
      }
UNCOV
1231
      break;
×
1232
    }
UNCOV
1233
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE: {
×
UNCOV
1234
      SStateWinodwPhysiNode *pStateNode = (SStateWinodwPhysiNode *)pNode;
×
1235

UNCOV
1236
      EXPLAIN_ROW_NEW(level, EXPLAIN_STATE_WINDOW_FORMAT,
×
1237
                      nodesGetNameFromColumnNode(pStateNode->pStateKey));
UNCOV
1238
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
UNCOV
1239
      if (pResNode->pExecInfo) {
×
1240
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1241
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1242
      }
1243

UNCOV
1244
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pStateNode->window.pFuncs->length);
×
UNCOV
1245
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1246
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pStateNode->window.node.pOutputDataBlockDesc->totalRowSize);
×
UNCOV
1247
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
UNCOV
1248
      EXPLAIN_ROW_END();
×
UNCOV
1249
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1250

UNCOV
1251
      if (verbose) {
×
UNCOV
1252
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
UNCOV
1253
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1254
                           nodesGetOutputNumFromSlotList(pStateNode->window.node.pOutputDataBlockDesc->pSlots));
UNCOV
1255
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1256
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pStateNode->window.node.pOutputDataBlockDesc->outputRowSize);
×
UNCOV
1257
        EXPLAIN_ROW_APPEND_LIMIT(pStateNode->window.node.pLimit);
×
UNCOV
1258
        EXPLAIN_ROW_APPEND_SLIMIT(pStateNode->window.node.pSlimit);
×
UNCOV
1259
        EXPLAIN_ROW_END();
×
UNCOV
1260
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1261

UNCOV
1262
        EXPLAIN_ROW_END();
×
UNCOV
1263
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1264

UNCOV
1265
        if (pStateNode->window.node.pConditions) {
×
1266
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1267
          QRY_ERR_RET(nodesNodeToSQL(pStateNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1268
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1269
          EXPLAIN_ROW_END();
×
1270
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1271
        }
1272
      }
UNCOV
1273
      break;
×
1274
    }
1275
    case QUERY_NODE_PHYSICAL_PLAN_PARTITION: {
336✔
1276
      SPartitionPhysiNode *pPartNode = (SPartitionPhysiNode *)pNode;
336✔
1277

1278
      SNode *p = nodesListGetNode(pPartNode->pPartitionKeys, 0);
336✔
1279
      EXPLAIN_ROW_NEW(level, EXPLAIN_PARITION_FORMAT, nodesGetNameFromColumnNode(p));
336!
1280
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
336✔
1281
      if (pResNode->pExecInfo) {
336!
1282
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
336!
1283
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
336✔
1284
      }
1285
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPartNode->node.pOutputDataBlockDesc->totalRowSize);
336✔
1286

1287
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
336✔
1288
      EXPLAIN_ROW_END();
336✔
1289
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
336!
1290

1291
      if (verbose) {
336!
1292
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
336!
1293
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
336✔
1294
                           nodesGetOutputNumFromSlotList(pPartNode->node.pOutputDataBlockDesc->pSlots));
1295
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
336✔
1296
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pPartNode->node.pOutputDataBlockDesc->outputRowSize);
336✔
1297
        EXPLAIN_ROW_APPEND_LIMIT(pPartNode->node.pLimit);
336!
1298
        EXPLAIN_ROW_APPEND_SLIMIT(pPartNode->node.pSlimit);
336!
1299
        EXPLAIN_ROW_END();
336✔
1300
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
336!
1301

1302
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_PARTITION_KETS_FORMAT);
336!
1303
        EXPLAIN_ROW_APPEND(EXPLAIN_PARTITIONS_FORMAT, pPartNode->pPartitionKeys->length);
336✔
1304
        EXPLAIN_ROW_END();
336✔
1305
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
336!
1306

1307
        if (pPartNode->node.pConditions) {
336!
1308
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1309
          QRY_ERR_RET(nodesNodeToSQL(pPartNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1310
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1311
          EXPLAIN_ROW_END();
×
1312
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1313
        }
1314
      }
1315
      break;
336✔
1316
    }
1317
    case QUERY_NODE_PHYSICAL_PLAN_MERGE: {
1,056✔
1318
      SMergePhysiNode *pMergeNode = (SMergePhysiNode *)pNode;
1,056✔
1319
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_FORMAT);
1,056!
1320
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
1,056✔
1321
      if (pResNode->pExecInfo) {
1,056!
1322
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
1,056!
1323
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,056✔
1324
      }
1325

1326
      SDataBlockDescNode *pDescNode = pMergeNode->node.pOutputDataBlockDesc;
1,056✔
1327
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, nodesGetOutputNumFromSlotList(pDescNode->pSlots));
1,056✔
1328
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,056✔
1329
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDescNode->totalRowSize);
1,056✔
1330
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,056✔
1331
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pMergeNode->node.inputTsOrder));
1,056!
1332
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,056✔
1333
      EXPLAIN_ROW_APPEND(EXPLAIN_OUTPUT_ORDER_TYPE_FORMAT, EXPLAIN_ORDER_STRING(pMergeNode->node.outputTsOrder));
1,056!
1334
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,056✔
1335
      EXPLAIN_ROW_APPEND(EXPLAIN_MERGE_MODE_FORMAT, EXPLAIN_MERGE_MODE_STRING(pMergeNode->type));
1,056!
1336
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
1,056✔
1337
      EXPLAIN_ROW_END();
1,056✔
1338
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,056!
1339

1340
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
1,056!
1341
        if (MERGE_TYPE_SORT == pMergeNode->type) {
1,056!
1342
          // sort method
1343
          EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
1,056!
1344

1345
          int32_t           nodeNum = taosArrayGetSize(pResNode->pExecInfo);
1,056✔
1346
          SExplainExecInfo *execInfo = taosArrayGet(pResNode->pExecInfo, 0);
1,056✔
1347
          SSortExecInfo    *pExecInfo = (SSortExecInfo *)execInfo->verboseInfo;
1,056✔
1348
          EXPLAIN_ROW_APPEND("%s", pExecInfo->sortMethod == SORT_QSORT_T ? "quicksort" : "merge sort");
1,056!
1349
          if (pExecInfo->sortBuffer > 1024 * 1024) {
1,056!
1350
            EXPLAIN_ROW_APPEND("  Buffers:%.2f Mb", pExecInfo->sortBuffer / (1024 * 1024.0));
×
1351
          } else if (pExecInfo->sortBuffer > 1024) {
1,056!
1352
            EXPLAIN_ROW_APPEND("  Buffers:%.2f Kb", pExecInfo->sortBuffer / (1024.0));
1,056✔
1353
          } else {
1354
            EXPLAIN_ROW_APPEND("  Buffers:%d b", pExecInfo->sortBuffer);
×
1355
          }
1356

1357
          EXPLAIN_ROW_APPEND("  loops:%d", pExecInfo->loops);
1,056✔
1358
          EXPLAIN_ROW_END();
1,056✔
1359
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
1,056!
1360
        }
1361
      }
1362

1363
      if (verbose) {
1,056!
1364
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
1,056!
1365
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
1,056✔
1366
                           nodesGetOutputNumFromSlotList(pMergeNode->node.pOutputDataBlockDesc->pSlots));
1367
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,056✔
1368
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pMergeNode->node.pOutputDataBlockDesc->outputRowSize);
1,056✔
1369
        EXPLAIN_ROW_APPEND_LIMIT(pMergeNode->node.pLimit);
1,056!
1370
        EXPLAIN_ROW_APPEND_SLIMIT(pMergeNode->node.pSlimit);
1,056!
1371
        EXPLAIN_ROW_END();
1,056✔
1372
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,056!
1373

1374
        if (MERGE_TYPE_SORT == pMergeNode->type) {
1,056!
1375
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
1,056!
1376
          EXPLAIN_ROW_APPEND(EXPLAIN_IGNORE_GROUPID_FORMAT, pMergeNode->ignoreGroupId ? "true" : "false");
1,056!
1377
          EXPLAIN_ROW_END();
1,056✔
1378
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,056!
1379

1380
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_MERGE_KEYS_FORMAT);
1,056!
1381
          if (pMergeNode->groupSort) {
1,056✔
1382
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, "_group_id asc");
112✔
1383
            if (LIST_LENGTH(pMergeNode->pMergeKeys) > 0) {
112!
1384
              EXPLAIN_ROW_APPEND(EXPLAIN_COMMA_FORMAT);
112✔
1385
            }
1386
          }
1387
          for (int32_t i = 0; i < LIST_LENGTH(pMergeNode->pMergeKeys); ++i) {
2,112!
1388
            SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pMergeNode->pMergeKeys, i);
1,056✔
1389
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, nodesGetNameFromColumnNode(ptn->pExpr));
1,056✔
1390
            EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
1,056✔
1391
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, EXPLAIN_ORDER_STRING(ptn->order));
1,056!
1392
            if (i != LIST_LENGTH(pMergeNode->pMergeKeys) - 1) {
1,056!
UNCOV
1393
              EXPLAIN_ROW_APPEND(EXPLAIN_COMMA_FORMAT);
×
1394
            }
1395
          }
1396
          EXPLAIN_ROW_END();
1,056✔
1397
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
1,056!
1398
        }
1399

1400
        if (pMergeNode->node.pConditions) {
1,056!
1401
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1402
          QRY_ERR_RET(nodesNodeToSQL(pMergeNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1403
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1404
          EXPLAIN_ROW_END();
×
1405
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1406
        }
1407
      }
1408
      break;
1,056✔
1409
    }
1410
    case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN: {
×
1411
      SBlockDistScanPhysiNode *pDistScanNode = (SBlockDistScanPhysiNode *)pNode;
×
1412
      EXPLAIN_ROW_NEW(level, EXPLAIN_DISTBLK_SCAN_FORMAT, pDistScanNode->tableName.tname);
×
1413
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
1414
      if (pResNode->pExecInfo) {
×
1415
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1416
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1417
      }
1418
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pDistScanNode->pScanCols->length);
×
1419
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1420
      if (pDistScanNode->pScanPseudoCols) {
×
1421
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pDistScanNode->pScanPseudoCols->length);
×
1422
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1423
      }
1424
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDistScanNode->node.pOutputDataBlockDesc->totalRowSize);
×
1425
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1426
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
1427
      EXPLAIN_ROW_END();
×
1428
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1429

1430
      if (verbose) {
×
1431
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1432
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1433
                           nodesGetOutputNumFromSlotList(pDistScanNode->node.pOutputDataBlockDesc->pSlots));
1434
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1435
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDistScanNode->node.pOutputDataBlockDesc->outputRowSize);
×
1436
        EXPLAIN_ROW_APPEND_LIMIT(pDistScanNode->node.pLimit);
×
1437
        EXPLAIN_ROW_APPEND_SLIMIT(pDistScanNode->node.pSlimit);
×
1438
        EXPLAIN_ROW_END();
×
1439
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1440

1441
        if (pDistScanNode->node.pConditions) {
×
1442
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1443
          QRY_ERR_RET(nodesNodeToSQL(pDistScanNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1444
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1445
          EXPLAIN_ROW_END();
×
1446
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1447
        }
1448
      }
1449
      break;
×
1450
    }
UNCOV
1451
    case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN: {
×
UNCOV
1452
      SLastRowScanPhysiNode *pLastRowNode = (SLastRowScanPhysiNode *)pNode;
×
UNCOV
1453
      EXPLAIN_ROW_NEW(level, EXPLAIN_LASTROW_SCAN_FORMAT, pLastRowNode->scan.tableName.tname);
×
UNCOV
1454
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
UNCOV
1455
      if (pResNode->pExecInfo) {
×
UNCOV
1456
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
UNCOV
1457
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1458
      }
UNCOV
1459
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pLastRowNode->scan.pScanCols->length);
×
UNCOV
1460
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1461
      if (pLastRowNode->scan.pScanPseudoCols) {
×
UNCOV
1462
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pLastRowNode->scan.pScanPseudoCols->length);
×
UNCOV
1463
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1464
      }
UNCOV
1465
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->totalRowSize);
×
UNCOV
1466
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1467
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
UNCOV
1468
      EXPLAIN_ROW_END();
×
UNCOV
1469
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1470

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

UNCOV
1482
        if (pLastRowNode->scan.node.pConditions) {
×
1483
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1484
          QRY_ERR_RET(nodesNodeToSQL(pLastRowNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1485
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1486
          EXPLAIN_ROW_END();
×
1487
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1488
        }
1489
      }
UNCOV
1490
      break;
×
1491
    }
1492
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN: {
×
1493
      STableCountScanPhysiNode *pLastRowNode = (STableCountScanPhysiNode *)pNode;
×
1494
      EXPLAIN_ROW_NEW(level, EXPLAIN_TABLE_COUNT_SCAN_FORMAT,
×
1495
                      ('\0' != pLastRowNode->scan.tableName.tname[0] ? pLastRowNode->scan.tableName.tname : TSDB_INS_TABLE_TABLES));
1496
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
1497
      if (pResNode->pExecInfo) {
×
1498
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1499
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1500
      }
1501
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, LIST_LENGTH(pLastRowNode->scan.pScanCols));
×
1502
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1503
      if (pLastRowNode->scan.pScanPseudoCols) {
×
1504
        EXPLAIN_ROW_APPEND(EXPLAIN_PSEUDO_COLUMNS_FORMAT, pLastRowNode->scan.pScanPseudoCols->length);
×
1505
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1506
      }
1507
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pLastRowNode->scan.node.pOutputDataBlockDesc->totalRowSize);
×
1508
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1509
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
1510
      EXPLAIN_ROW_END();
×
1511
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1512

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

1524
        if (pLastRowNode->scan.node.pConditions) {
×
1525
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1526
          QRY_ERR_RET(nodesNodeToSQL(pLastRowNode->scan.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1527
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1528
          EXPLAIN_ROW_END();
×
1529
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1530
        }
1531
      }
1532
      break;
×
1533
    }
UNCOV
1534
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT: {
×
UNCOV
1535
      SGroupSortPhysiNode *pSortNode = (SGroupSortPhysiNode *)pNode;
×
UNCOV
1536
      EXPLAIN_ROW_NEW(level, EXPLAIN_GROUP_SORT_FORMAT);
×
UNCOV
1537
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
UNCOV
1538
      if (pResNode->pExecInfo) {
×
1539
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1540
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1541
      }
1542

UNCOV
1543
      SDataBlockDescNode *pDescNode = pSortNode->node.pOutputDataBlockDesc;
×
UNCOV
1544
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, nodesGetOutputNumFromSlotList(pDescNode->pSlots));
×
UNCOV
1545
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1546
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDescNode->totalRowSize);
×
UNCOV
1547
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
UNCOV
1548
      EXPLAIN_ROW_END();
×
UNCOV
1549
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1550

UNCOV
1551
      if (EXPLAIN_MODE_ANALYZE == ctx->mode) {
×
1552
        // sort key
1553
        EXPLAIN_ROW_NEW(level + 1, "Sort Key: ");
×
1554
        if (pResNode->pExecInfo) {
×
1555
          for (int32_t i = 0; i < LIST_LENGTH(pSortNode->pSortKeys); ++i) {
×
1556
            SOrderByExprNode *ptn = (SOrderByExprNode *)nodesListGetNode(pSortNode->pSortKeys, i);
×
1557
            EXPLAIN_ROW_APPEND("%s ", nodesGetNameFromColumnNode(ptn->pExpr));
×
1558
          }
1559
        }
1560

1561
        EXPLAIN_ROW_END();
×
1562
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1563

1564
        // sort method
1565
        EXPLAIN_ROW_NEW(level + 1, "Sort Method: ");
×
1566

1567
        int32_t           nodeNum = taosArrayGetSize(pResNode->pExecInfo);
×
1568
        SExplainExecInfo *execInfo = taosArrayGet(pResNode->pExecInfo, 0);
×
1569
        SSortExecInfo    *pExecInfo = (SSortExecInfo *)execInfo->verboseInfo;
×
1570
        EXPLAIN_ROW_APPEND("%s", pExecInfo->sortMethod == SORT_QSORT_T ? "quicksort" : "merge sort");
×
1571
        if (pExecInfo->sortBuffer > 1024 * 1024) {
×
1572
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Mb", pExecInfo->sortBuffer / (1024 * 1024.0));
×
1573
        } else if (pExecInfo->sortBuffer > 1024) {
×
1574
          EXPLAIN_ROW_APPEND("  Buffers:%.2f Kb", pExecInfo->sortBuffer / (1024.0));
×
1575
        } else {
1576
          EXPLAIN_ROW_APPEND("  Buffers:%d b", pExecInfo->sortBuffer);
×
1577
        }
1578

1579
        EXPLAIN_ROW_APPEND("  loops:%d", pExecInfo->loops);
×
1580
        EXPLAIN_ROW_END();
×
1581
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1582
      }
1583

UNCOV
1584
      if (verbose) {
×
1585
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1586
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1587
                           nodesGetOutputNumFromSlotList(pSortNode->node.pOutputDataBlockDesc->pSlots));
1588
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1589
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pSortNode->node.pOutputDataBlockDesc->outputRowSize);
×
1590
        EXPLAIN_ROW_APPEND_LIMIT(pSortNode->node.pLimit);
×
1591
        EXPLAIN_ROW_APPEND_SLIMIT(pSortNode->node.pSlimit);
×
1592
        EXPLAIN_ROW_END();
×
1593
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1594

1595
        if (pSortNode->node.pConditions) {
×
1596
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1597
          QRY_ERR_RET(nodesNodeToSQL(pSortNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1598
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1599
          EXPLAIN_ROW_END();
×
1600
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1601
        }
1602
      }
UNCOV
1603
      break;
×
1604
    }
1605
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL: {
×
1606
      SMergeIntervalPhysiNode *pIntNode = (SMergeIntervalPhysiNode *)pNode;
×
1607
      EXPLAIN_ROW_NEW(level, EXPLAIN_MERGE_INTERVAL_FORMAT, nodesGetNameFromColumnNode(pIntNode->window.pTspk));
×
1608
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
1609
      if (pResNode->pExecInfo) {
×
1610
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1611
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1612
      }
1613
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pIntNode->window.pFuncs->length);
×
1614
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
1615
      EXPLAIN_ROW_END();
×
1616
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1617

1618
      if (verbose) {
×
1619
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
1620
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1621
                           nodesGetOutputNumFromSlotList(pIntNode->window.node.pOutputDataBlockDesc->pSlots));
1622
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1623
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pIntNode->window.node.pOutputDataBlockDesc->outputRowSize);
×
1624
        EXPLAIN_ROW_APPEND_LIMIT(pIntNode->window.node.pLimit);
×
1625
        EXPLAIN_ROW_APPEND_SLIMIT(pIntNode->window.node.pSlimit);
×
1626
        EXPLAIN_ROW_END();
×
1627
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1628
        uint8_t precision = qExplainGetIntervalPrecision(pIntNode);
×
1629
        int64_t time1 = -1;
×
1630
        int64_t time2 = -1;
×
1631
        int32_t code = TSDB_CODE_SUCCESS;
×
1632
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->interval, pIntNode->intervalUnit, precision, time1);
×
1633
        QRY_ERR_RET(code);
×
1634
        INVERAL_TIME_FROM_PRECISION_TO_UNIT(pIntNode->sliding, pIntNode->slidingUnit, precision, time2);
×
1635
        QRY_ERR_RET(code);
×
1636
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIME_WINDOWS_FORMAT,
×
1637
                        time1,
1638
                        pIntNode->intervalUnit, pIntNode->offset, getPrecisionUnit(precision),
1639
                        time2,
1640
                        pIntNode->slidingUnit);
1641
        EXPLAIN_ROW_END();
×
1642
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1643

1644
        if (pIntNode->window.node.pConditions) {
×
1645
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1646
          QRY_ERR_RET(nodesNodeToSQL(pIntNode->window.node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1647
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1648
          EXPLAIN_ROW_END();
×
1649
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1650
        }
1651
      }
1652
      break;
×
1653
    }
UNCOV
1654
    case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC: {
×
UNCOV
1655
      SInterpFuncPhysiNode *pInterpNode = (SInterpFuncPhysiNode *)pNode;
×
UNCOV
1656
      EXPLAIN_ROW_NEW(level, EXPLAIN_INTERP_FORMAT);
×
UNCOV
1657
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
UNCOV
1658
      if (pResNode->pExecInfo) {
×
UNCOV
1659
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
UNCOV
1660
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1661
      }
UNCOV
1662
      if (pInterpNode->pFuncs) {
×
UNCOV
1663
        EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pInterpNode->pFuncs->length);
×
UNCOV
1664
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1665
      }
1666

UNCOV
1667
      EXPLAIN_ROW_APPEND(EXPLAIN_MODE_FORMAT, nodesGetFillModeString(pInterpNode->fillMode));
×
UNCOV
1668
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1669

UNCOV
1670
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
UNCOV
1671
      EXPLAIN_ROW_END();
×
UNCOV
1672
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1673

UNCOV
1674
      if (verbose) {
×
UNCOV
1675
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
×
UNCOV
1676
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
×
1677
                           nodesGetOutputNumFromSlotList(pInterpNode->node.pOutputDataBlockDesc->pSlots));
UNCOV
1678
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1679
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pInterpNode->node.pOutputDataBlockDesc->outputRowSize);
×
UNCOV
1680
        EXPLAIN_ROW_APPEND_LIMIT(pInterpNode->node.pLimit);
×
UNCOV
1681
        EXPLAIN_ROW_APPEND_SLIMIT(pInterpNode->node.pSlimit);
×
UNCOV
1682
        EXPLAIN_ROW_END();
×
UNCOV
1683
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
UNCOV
1684
        if (pInterpNode->pFillValues) {
×
1685
          SNodeListNode *pValues = (SNodeListNode *)pInterpNode->pFillValues;
×
1686
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILL_VALUE_FORMAT);
×
1687
          SNode  *tNode = NULL;
×
1688
          int32_t i = 0;
×
1689
          FOREACH(tNode, pValues->pNodeList) {
×
1690
            if (i) {
×
1691
              EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1692
            }
1693
            SValueNode *tValue = (SValueNode *)tNode;
×
1694
            char       *value = nodesGetStrValueFromNode(tValue);
×
1695
            EXPLAIN_ROW_APPEND(EXPLAIN_STRING_TYPE_FORMAT, value);
×
1696
            taosMemoryFree(value);
×
1697
            ++i;
×
1698
          }
1699

1700
          EXPLAIN_ROW_END();
×
1701
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1702
        }
1703

UNCOV
1704
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_INTERVAL_VALUE_FORMAT, pInterpNode->interval, pInterpNode->intervalUnit);
×
UNCOV
1705
        EXPLAIN_ROW_END();
×
1706

UNCOV
1707
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TIMERANGE_FORMAT, pInterpNode->timeRange.skey, pInterpNode->timeRange.ekey);
×
UNCOV
1708
        EXPLAIN_ROW_END();
×
UNCOV
1709
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1710

UNCOV
1711
        if (pInterpNode->node.pConditions) {
×
1712
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1713
          QRY_ERR_RET(nodesNodeToSQL(pInterpNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1714
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1715
          EXPLAIN_ROW_END();
×
1716
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1717
        }
1718
      }
UNCOV
1719
      break;
×
1720
    }
UNCOV
1721
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_EVENT: {
×
UNCOV
1722
      SEventWinodwPhysiNode *pEventNode = (SEventWinodwPhysiNode *)pNode;
×
UNCOV
1723
      EXPLAIN_ROW_NEW(level, EXPLAIN_EVENT_FORMAT);
×
UNCOV
1724
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
UNCOV
1725
      if (pResNode->pExecInfo) {
×
UNCOV
1726
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
UNCOV
1727
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1728
      }
UNCOV
1729
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pEventNode->window.pFuncs->length);
×
UNCOV
1730
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
UNCOV
1731
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pEventNode->window.node.pOutputDataBlockDesc->totalRowSize);
×
UNCOV
1732
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
UNCOV
1733
      EXPLAIN_ROW_END();
×
UNCOV
1734
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1735

UNCOV
1736
      if (verbose) {
×
UNCOV
1737
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_EVENT_START_FORMAT);
×
UNCOV
1738
        QRY_ERR_RET(nodesNodeToSQL(pEventNode->pStartCond, tbuf + VARSTR_HEADER_SIZE,
×
1739
                                    TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
UNCOV
1740
        EXPLAIN_ROW_END();
×
UNCOV
1741
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1742

UNCOV
1743
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_EVENT_END_FORMAT);
×
UNCOV
1744
        QRY_ERR_RET(nodesNodeToSQL(pEventNode->pEndCond, tbuf + VARSTR_HEADER_SIZE,
×
1745
                                    TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
UNCOV
1746
        EXPLAIN_ROW_END();
×
UNCOV
1747
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1748
      }
UNCOV
1749
      break;
×
1750
    }
1751
    case QUERY_NODE_PHYSICAL_PLAN_HASH_JOIN:{
2✔
1752
      SHashJoinPhysiNode *pJoinNode = (SHashJoinPhysiNode *)pNode;
2✔
1753
      EXPLAIN_ROW_NEW(level, EXPLAIN_JOIN_FORMAT, gJoinTypeStr[pJoinNode->joinType][pJoinNode->subType]);
2!
1754
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
2✔
1755
      if (pResNode->pExecInfo) {
2!
1756
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
2!
1757
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1758
      }
1759
      EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT, pJoinNode->pTargets->length);
2✔
1760
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1761
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->totalRowSize);
2✔
1762
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1763
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pJoinNode->node.inputTsOrder));
2!
1764
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1765
      EXPLAIN_ROW_APPEND(EXPLAIN_JOIN_ALGO, "Hash");
2✔
1766
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
2✔
1767
      EXPLAIN_ROW_END();
2✔
1768
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
2!
1769

1770
      if (verbose) {
2!
1771
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
2!
1772
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
2✔
1773
                           nodesGetOutputNumFromSlotList(pJoinNode->node.pOutputDataBlockDesc->pSlots));
1774
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1775
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pJoinNode->node.pOutputDataBlockDesc->outputRowSize);
2✔
1776
        EXPLAIN_ROW_APPEND_LIMIT(pJoinNode->node.pLimit);
2!
1777
        EXPLAIN_ROW_APPEND_SLIMIT(pJoinNode->node.pSlimit);
2!
1778
        EXPLAIN_ROW_END();
2✔
1779
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2!
1780

1781
        if (pJoinNode->node.pConditions) {
2!
1782
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1783
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1784
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1785

1786
          EXPLAIN_ROW_END();
×
1787
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1788
        }
1789

1790
        bool conditionsGot = false;
2✔
1791
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_ON_CONDITIONS_FORMAT);
2!
1792
        if (pJoinNode->pPrimKeyCond) {
2!
1793
          QRY_ERR_RET(
×
1794
              nodesNodeToSQL(pJoinNode->pPrimKeyCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1795
          conditionsGot = true;
×
1796
        }
1797
        if (pJoinNode->pColEqCond) {
2!
1798
          if (conditionsGot) {
×
1799
            EXPLAIN_ROW_APPEND(" AND ");
×
1800
          }
1801
          QRY_ERR_RET(
×
1802
              nodesNodeToSQL(pJoinNode->pColEqCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1803
          conditionsGot = true;
×
1804
        }
1805
        if (pJoinNode->pTagEqCond) {
2!
1806
          if (conditionsGot) {
2!
1807
            EXPLAIN_ROW_APPEND(" AND ");
×
1808
          }
1809
          QRY_ERR_RET(
2!
1810
              nodesNodeToSQL(pJoinNode->pTagEqCond, tbuf + VARSTR_HEADER_SIZE, TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1811
          conditionsGot = true;
2✔
1812
        }
1813
        if (pJoinNode->pFullOnCond) {
2!
1814
          if (conditionsGot) {
×
1815
            EXPLAIN_ROW_APPEND(" AND ");
×
1816
          }
1817
          QRY_ERR_RET(nodesNodeToSQL(pJoinNode->pFullOnCond, tbuf + VARSTR_HEADER_SIZE,
×
1818
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1819
        }
1820
        EXPLAIN_ROW_END();
2✔
1821
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2!
1822

1823
        if (pJoinNode->timeRangeTarget) {
2!
1824
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_TABLE_TIMERANGE_FORMAT, qExplainGetTimerangeTargetStr(pJoinNode->timeRangeTarget), pJoinNode->timeRange.skey, pJoinNode->timeRange.ekey);
×
1825
          EXPLAIN_ROW_END();
×
1826
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1827
        }
1828
      }
1829
      break;
2✔
1830
    }
1831
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE:{
2✔
1832
      SGroupCachePhysiNode *pGroupCache = (SGroupCachePhysiNode *)pNode;
2✔
1833
      EXPLAIN_ROW_NEW(level, EXPLAIN_GROUP_CACHE_FORMAT);
2!
1834
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
2✔
1835
      if (pResNode->pExecInfo) {
2!
1836
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
2!
1837
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1838
      }
1839
      EXPLAIN_ROW_APPEND(EXPLAIN_GLOBAL_GROUP_FORMAT, pGroupCache->globalGrp);
2✔
1840
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1841
      EXPLAIN_ROW_APPEND(EXPLAIN_GROUP_BY_UID_FORMAT, pGroupCache->grpByUid);
2✔
1842
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1843
      EXPLAIN_ROW_APPEND(EXPLAIN_BATCH_SCAN_FORMAT, pGroupCache->batchFetch);
2✔
1844
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1845
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pGroupCache->node.pOutputDataBlockDesc->totalRowSize);
2✔
1846
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1847
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pGroupCache->node.inputTsOrder));
2!
1848
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1849
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
2✔
1850
      EXPLAIN_ROW_END();
2✔
1851
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
2!
1852

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

1864
        if (pGroupCache->node.pConditions) {
2!
1865
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1866
          QRY_ERR_RET(nodesNodeToSQL(pGroupCache->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1867
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1868
          EXPLAIN_ROW_END();
×
1869
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1870
        }
1871
      }
1872
      break;
2✔
1873
    }
1874
    case QUERY_NODE_PHYSICAL_PLAN_DYN_QUERY_CTRL:{
2✔
1875
      SDynQueryCtrlPhysiNode *pDyn = (SDynQueryCtrlPhysiNode *)pNode;
2✔
1876
      EXPLAIN_ROW_NEW(level, EXPLAIN_DYN_QRY_CTRL_FORMAT, qExplainGetDynQryCtrlType(pDyn->qType));
2!
1877
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
2✔
1878
      if (pResNode->pExecInfo) {
2!
1879
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
2!
1880
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1881
      }
1882
      EXPLAIN_ROW_APPEND(EXPLAIN_BATCH_SCAN_FORMAT, pDyn->stbJoin.batchFetch);
2✔
1883
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1884
      EXPLAIN_ROW_APPEND(EXPLAIN_VGROUP_SLOT_FORMAT, pDyn->stbJoin.vgSlot[0], pDyn->stbJoin.vgSlot[1]);
2✔
1885
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1886
      EXPLAIN_ROW_APPEND(EXPLAIN_UID_SLOT_FORMAT, pDyn->stbJoin.uidSlot[0], pDyn->stbJoin.uidSlot[1]);
2✔
1887
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1888
      EXPLAIN_ROW_APPEND(EXPLAIN_SRC_SCAN_FORMAT, pDyn->stbJoin.srcScan[0], pDyn->stbJoin.srcScan[1]);
2✔
1889
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1890
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->totalRowSize);
2✔
1891
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1892
      EXPLAIN_ROW_APPEND(EXPLAIN_INPUT_ORDER_FORMAT, EXPLAIN_ORDER_STRING(pDyn->node.inputTsOrder));
2!
1893
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1894
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
2✔
1895
      EXPLAIN_ROW_END();
2✔
1896
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
2!
1897

1898
      if (verbose) {
2!
1899
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_OUTPUT_FORMAT);
2!
1900
        EXPLAIN_ROW_APPEND(EXPLAIN_COLUMNS_FORMAT,
2✔
1901
                           nodesGetOutputNumFromSlotList(pDyn->node.pOutputDataBlockDesc->pSlots));
1902
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
2✔
1903
        EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pDyn->node.pOutputDataBlockDesc->outputRowSize);
2✔
1904
        EXPLAIN_ROW_APPEND_LIMIT(pDyn->node.pLimit);
2!
1905
        EXPLAIN_ROW_APPEND_SLIMIT(pDyn->node.pSlimit);
2!
1906
        EXPLAIN_ROW_END();
2✔
1907
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
2!
1908

1909
        if (pDyn->node.pConditions) {
2!
1910
          EXPLAIN_ROW_NEW(level + 1, EXPLAIN_FILTER_FORMAT);
×
1911
          QRY_ERR_RET(nodesNodeToSQL(pDyn->node.pConditions, tbuf + VARSTR_HEADER_SIZE,
×
1912
                                     TSDB_EXPLAIN_RESULT_ROW_SIZE, &tlen));
1913
          EXPLAIN_ROW_END();
×
1914
          QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1915
        }
1916
      }
1917
      break;
2✔
1918
    }
1919
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT: {
×
1920
      SCountWinodwPhysiNode *pCountNode = (SCountWinodwPhysiNode *)pNode;
×
1921
      EXPLAIN_ROW_NEW(level, EXPLAIN_COUNT_FORMAT);
×
1922
      EXPLAIN_ROW_APPEND(EXPLAIN_LEFT_PARENTHESIS_FORMAT);
×
1923
      if (pResNode->pExecInfo) {
×
1924
        QRY_ERR_RET(qExplainBufAppendExecInfo(pResNode->pExecInfo, tbuf, &tlen));
×
1925
        EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1926
      }
1927
      EXPLAIN_ROW_APPEND(EXPLAIN_FUNCTIONS_FORMAT, pCountNode->window.pFuncs->length);
×
1928
      EXPLAIN_ROW_APPEND(EXPLAIN_BLANK_FORMAT);
×
1929
      EXPLAIN_ROW_APPEND(EXPLAIN_WIDTH_FORMAT, pCountNode->window.node.pOutputDataBlockDesc->totalRowSize);
×
1930
      EXPLAIN_ROW_APPEND(EXPLAIN_RIGHT_PARENTHESIS_FORMAT);
×
1931
      EXPLAIN_ROW_END();
×
1932
      QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level));
×
1933

1934
      if (verbose) {
×
1935
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COUNT_NUM_FORMAT, pCountNode->windowCount);
×
1936
        EXPLAIN_ROW_END();
×
1937
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1938
        EXPLAIN_ROW_NEW(level + 1, EXPLAIN_COUNT_SLIDING_FORMAT, pCountNode->windowSliding);
×
1939
        EXPLAIN_ROW_END();
×
1940
        QRY_ERR_RET(qExplainResAppendRow(ctx, tbuf, tlen, level + 1));
×
1941
      }
1942
      break;
×
1943
    }
1944
    default:
×
1945
      qError("not supported physical node type %d", pNode->type);
×
1946
      return TSDB_CODE_APP_ERROR;
×
1947
  }
1948

1949
  return TSDB_CODE_SUCCESS;
9,094✔
1950
}
1951

1952
static int32_t qExplainResNodeToRows(SExplainResNode *pResNode, SExplainCtx *ctx, int32_t level) {
9,094✔
1953
  if (NULL == pResNode) {
9,094!
1954
    qError("explain res node is NULL");
×
1955
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
1956
  }
1957

1958
  int32_t code = 0;
9,094✔
1959
  QRY_ERR_RET(qExplainResNodeToRowsImpl(pResNode, ctx, level));
9,094!
1960

1961
  SNode *pNode = NULL;
9,094✔
1962
  FOREACH(pNode, pResNode->pChildren) { QRY_ERR_RET(qExplainResNodeToRows((SExplainResNode *)pNode, ctx, level + 1)); }
14,408!
1963

1964
  return TSDB_CODE_SUCCESS;
9,094✔
1965
}
1966

1967
static int32_t qExplainAppendGroupResRows(void *pCtx, int32_t groupId, int32_t level, bool singleChannel) {
3,780✔
1968
  SExplainResNode *node = NULL;
3,780✔
1969
  int32_t          code = 0;
3,780✔
1970
  SExplainCtx     *ctx = (SExplainCtx *)pCtx;
3,780✔
1971

1972
  SExplainGroup *group = taosHashGet(ctx->groupHash, &groupId, sizeof(groupId));
3,780✔
1973
  if (NULL == group) {
3,780!
1974
    qError("group %d not in groupHash", groupId);
×
1975
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
1976
  }
1977

1978
  group->singleChannel = singleChannel;
3,780✔
1979
  group->physiPlanExecIdx = 0;
3,780✔
1980

1981
  QRY_ERR_RET(qExplainGenerateResNode(group->plan->pNode, group, &node));
3,780!
1982

1983
  QRY_ERR_JRET(qExplainResNodeToRows(node, ctx, level));
3,780!
1984

1985
_return:
3,780✔
1986

1987
  qExplainFreeResNode(node);
3,780✔
1988

1989
  QRY_RET(code);
3,780!
1990
}
1991

1992
static int32_t qExplainGetRspFromCtx(void *ctx, SRetrieveTableRsp **pRsp) {
380✔
1993
  int32_t      code = 0;
380✔
1994
  SSDataBlock *pBlock = NULL;
380✔
1995
  SExplainCtx *pCtx = (SExplainCtx *)ctx;
380✔
1996
  int32_t      rowNum = taosArrayGetSize(pCtx->rows);
380✔
1997
  if (rowNum <= 0) {
380!
1998
    qError("empty explain res rows");
×
1999
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2000
  }
2001

2002
  code = createDataBlock(&pBlock);
380✔
2003
  QRY_ERR_JRET(code);
380!
2004

2005
  SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, TSDB_EXPLAIN_RESULT_ROW_SIZE, 1);
380✔
2006
  QRY_ERR_JRET(blockDataAppendColInfo(pBlock, &infoData));
380!
2007
  QRY_ERR_JRET(blockDataEnsureCapacity(pBlock, rowNum));
380!
2008

2009
  SColumnInfoData *pInfoData = taosArrayGet(pBlock->pDataBlock, 0);
380✔
2010

2011
  for (int32_t i = 0; i < rowNum; ++i) {
34,732✔
2012
    SQueryExplainRowInfo *row = taosArrayGet(pCtx->rows, i);
34,352✔
2013
    QRY_ERR_JRET(colDataSetVal(pInfoData, i, row->buf, false));
34,352!
2014
  }
2015

2016
  pBlock->info.rows = rowNum;
380✔
2017

2018
  size_t dataEncodeBufSize = blockGetEncodeSize(pBlock);
380✔
2019
  int32_t rspSize = sizeof(SRetrieveTableRsp) + dataEncodeBufSize + PAYLOAD_PREFIX_LEN;
380✔
2020

2021
  SRetrieveTableRsp *rsp = (SRetrieveTableRsp *)taosMemoryCalloc(1, rspSize);
380!
2022
  if (NULL == rsp) {
380!
2023
    qError("malloc SRetrieveTableRsp failed, size:%d", rspSize);
×
2024
    QRY_ERR_JRET(terrno);
×
2025
  }
2026

2027
  rsp->completed = 1;
380✔
2028
  rsp->numOfRows = htobe64((int64_t)rowNum);
380✔
2029

2030
  int32_t len = blockEncode(pBlock, rsp->data + PAYLOAD_PREFIX_LEN, dataEncodeBufSize, taosArrayGetSize(pBlock->pDataBlock));
380✔
2031
  if(len < 0) {
380!
2032
    qError("qExplainGetRspFromCtx: blockEncode failed");
×
2033
    QRY_ERR_JRET(terrno);
×
2034
  }
2035

2036
  rsp->compLen = htonl(len);
380✔
2037
  rsp->payloadLen = htonl(len);
380✔
2038
  rsp->compressed = 0;
380✔
2039

2040
  SET_PAYLOAD_LEN(rsp->data, len, len);
380✔
2041

2042
_return:
380✔
2043
  blockDataDestroy(pBlock);
380✔
2044

2045
  *pRsp = rsp;
380✔
2046
  QRY_RET(code);
380!
2047
}
2048

2049
static int32_t qExplainPrepareCtx(SQueryPlan *pDag, SExplainCtx **pCtx) {
388✔
2050
  int32_t        code = 0;
388✔
2051
  SNodeListNode *plans = NULL;
388✔
2052
  int32_t        taskNum = 0;
388✔
2053
  SExplainGroup *pGroup = NULL;
388✔
2054
  SExplainCtx   *ctx = NULL;
388✔
2055

2056
  if (pDag->numOfSubplans <= 0) {
388!
2057
    qError("invalid subplan num:%d", pDag->numOfSubplans);
×
2058
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2059
  }
2060

2061
  int32_t levelNum = (int32_t)LIST_LENGTH(pDag->pSubplans);
388!
2062
  if (levelNum <= 0) {
388!
2063
    qError("invalid level num:%d", levelNum);
×
2064
    QRY_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
×
2065
  }
2066

2067
  SHashObj *groupHash =
2068
      taosHashInit(EXPLAIN_MAX_GROUP_NUM, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
388✔
2069
  if (NULL == groupHash) {
388!
2070
    qError("groupHash %d failed", EXPLAIN_MAX_GROUP_NUM);
×
2071
    QRY_ERR_RET(terrno);
×
2072
  }
2073

2074
  QRY_ERR_JRET(
388!
2075
      qExplainInitCtx(&ctx, groupHash, pDag->explainInfo.verbose, pDag->explainInfo.ratio, pDag->explainInfo.mode));
2076

2077
  for (int32_t i = 0; i < levelNum; ++i) {
1,312✔
2078
    plans = (SNodeListNode *)nodesListGetNode(pDag->pSubplans, i);
924✔
2079
    if (NULL == plans) {
924!
2080
      qError("empty level plan, level:%d", i);
×
2081
      QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
×
2082
    }
2083

2084
    taskNum = (int32_t)LIST_LENGTH(plans->pNodeList);
924!
2085
    if (taskNum <= 0) {
924!
2086
      qError("invalid level plan number:%d, level:%d", taskNum, i);
×
2087
      QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
×
2088
    }
2089

2090
    SSubplan *plan = NULL;
924✔
2091
    for (int32_t n = 0; n < taskNum; ++n) {
4,776✔
2092
      plan = (SSubplan *)nodesListGetNode(plans->pNodeList, n);
3,852✔
2093
      pGroup = taosHashGet(groupHash, &plan->id.groupId, sizeof(plan->id.groupId));
3,852✔
2094
      if (pGroup) {
3,852✔
2095
        ++pGroup->nodeNum;
2,072✔
2096
        continue;
2,072✔
2097
      }
2098

2099
      SExplainGroup group = {0};
1,780✔
2100
      group.nodeNum = 1;
1,780✔
2101
      group.plan = plan;
1,780✔
2102

2103
      if (0 != taosHashPut(groupHash, &plan->id.groupId, sizeof(plan->id.groupId), &group, sizeof(group))) {
1,780!
2104
        qError("taosHashPut to explainGroupHash failed, taskIdx:%d", n);
×
2105
        QRY_ERR_JRET(terrno);
×
2106
      }
2107
    }
2108

2109
    if (0 == i) {
924✔
2110
      if (taskNum > 1) {
388!
2111
        qError("invalid taskNum %d for level 0", taskNum);
×
2112
        QRY_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
×
2113
      }
2114

2115
      ctx->rootGroupId = plan->id.groupId;
388✔
2116
    }
2117

2118
    qDebug("level %d group handled, taskNum:%d", i, taskNum);
924!
2119
  }
2120

2121
  *pCtx = ctx;
388✔
2122

2123
  return TSDB_CODE_SUCCESS;
388✔
2124

2125
_return:
×
2126

2127
  qExplainFreeCtx(ctx);
×
2128

2129
  QRY_RET(code);
×
2130
}
2131

2132
static int32_t qExplainAppendPlanRows(SExplainCtx *pCtx) {
380✔
2133
  if (EXPLAIN_MODE_ANALYZE != pCtx->mode) {
380!
UNCOV
2134
    return TSDB_CODE_SUCCESS;
×
2135
  }
2136

2137
  int32_t tlen = 0;
380✔
2138
  char   *tbuf = pCtx->tbuf;
380✔
2139

2140
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_RATIO_TIME_FORMAT, pCtx->ratio);
380✔
2141
  EXPLAIN_SUM_ROW_END();
380✔
2142
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
380!
2143

2144
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_PLANNING_TIME_FORMAT, (double)(pCtx->jobStartTs - pCtx->reqStartTs) / 1000.0);
380✔
2145
  EXPLAIN_SUM_ROW_END();
380✔
2146
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
380!
2147

2148
  EXPLAIN_SUM_ROW_NEW(EXPLAIN_EXEC_TIME_FORMAT, (double)(pCtx->jobDoneTs - pCtx->jobStartTs) / 1000.0);
380✔
2149
  EXPLAIN_SUM_ROW_END();
380✔
2150
  QRY_ERR_RET(qExplainResAppendRow(pCtx, tbuf, tlen, 0));
380!
2151

2152
  return TSDB_CODE_SUCCESS;
380✔
2153
}
2154

2155
static int32_t qExplainGenerateRsp(SExplainCtx *pCtx, SRetrieveTableRsp **pRsp) {
380✔
2156
  QRY_ERR_RET(qExplainAppendGroupResRows(pCtx, pCtx->rootGroupId, 0, false));
380!
2157
  QRY_ERR_RET(qExplainAppendPlanRows(pCtx));
380!
2158
  QRY_ERR_RET(qExplainGetRspFromCtx(pCtx, pRsp));
380!
2159

2160
  return TSDB_CODE_SUCCESS;
380✔
2161
}
2162

2163
int32_t qExplainUpdateExecInfo(SExplainCtx *pCtx, SExplainRsp *pRspMsg, int32_t groupId, SRetrieveTableRsp **pRsp) {
3,844✔
2164
  if(!pCtx || !pRspMsg || !pRsp) return TSDB_CODE_INVALID_PARA;
3,844!
2165
  SExplainResNode *node = NULL;
3,844✔
2166
  int32_t          code = 0;
3,844✔
2167
  bool             groupDone = false;
3,844✔
2168
  SExplainCtx     *ctx = (SExplainCtx *)pCtx;
3,844✔
2169

2170
  SExplainGroup *group = taosHashGet(ctx->groupHash, &groupId, sizeof(groupId));
3,844✔
2171
  if (NULL == group) {
3,844!
2172
    qError("group %d not in groupHash", groupId);
×
2173
    tFreeSExplainRsp(pRspMsg);
×
2174
    QRY_ERR_RET(TSDB_CODE_APP_ERROR);
×
2175
  }
2176

2177
  taosWLockLatch(&group->lock);
3,844✔
2178
  if (NULL == group->nodeExecInfo) {
3,844✔
2179
    group->nodeExecInfo = taosArrayInit(group->nodeNum, sizeof(SExplainRsp));
1,772✔
2180
    if (NULL == group->nodeExecInfo) {
1,772!
2181
      qError("taosArrayInit %d explainExecInfo failed", group->nodeNum);
×
2182
      code = terrno;
×
2183
      TAOS_CHECK_ERRNO(code);
×
2184
    }
2185

2186
    group->physiPlanExecNum = pRspMsg->numOfPlans;
1,772✔
2187
  } else if (taosArrayGetSize(group->nodeExecInfo) >= group->nodeNum) {
2,072!
2188
    qError("group execInfo already full, size:%d, nodeNum:%d", (int32_t)taosArrayGetSize(group->nodeExecInfo),
×
2189
           group->nodeNum);
2190
    code = TSDB_CODE_APP_ERROR;
×
2191
    TAOS_CHECK_ERRNO(code);
×
2192
  }
2193

2194
  if (group->physiPlanExecNum != pRspMsg->numOfPlans) {
3,843!
2195
    qError("physiPlanExecNum %d mismatch with others %d in group %d", pRspMsg->numOfPlans, group->physiPlanExecNum,
×
2196
           groupId);
2197
    code = TSDB_CODE_APP_ERROR;
×
2198
    TAOS_CHECK_ERRNO(code);
×
2199
  }
2200

2201
  if(taosArrayPush(group->nodeExecInfo, pRspMsg) == NULL)
7,687!
2202
  {
2203
    code = terrno;
×
2204
    TAOS_CHECK_ERRNO(code);
×
2205
  }
2206

2207
  groupDone = (taosArrayGetSize(group->nodeExecInfo) >= group->nodeNum);
3,844✔
2208

2209
  taosWUnLockLatch(&group->lock);
3,844✔
2210

2211
  if (groupDone && (taosHashGetSize(pCtx->groupHash) == atomic_add_fetch_32(&pCtx->groupDoneNum, 1))) {
3,844✔
2212
    if (atomic_load_8((int8_t *)&pCtx->execDone)) {
380✔
2213
      if (0 == taosWTryLockLatch(&pCtx->lock)) {
2!
2214
        QRY_ERR_RET(qExplainGenerateRsp(pCtx, pRsp));
2!
2215
        // LEAVE LOCK THERE
2216
      }
2217
    }
2218
  }
2219

2220
  return TSDB_CODE_SUCCESS;
3,844✔
2221

2222
_exit:
×
2223
  tFreeSExplainRsp(pRspMsg);
×
2224
  taosWUnLockLatch(&group->lock);
×
2225
  return code;
×
2226
}
2227

UNCOV
2228
int32_t qExecStaticExplain(SQueryPlan *pDag, SRetrieveTableRsp **pRsp) {
×
UNCOV
2229
  if (!pDag || !pRsp) return TSDB_CODE_INVALID_PARA;
×
UNCOV
2230
  int32_t      code = 0;
×
UNCOV
2231
  SExplainCtx *pCtx = NULL;
×
2232

UNCOV
2233
  QRY_ERR_RET(qExplainPrepareCtx(pDag, &pCtx));
×
UNCOV
2234
  QRY_ERR_JRET(qExplainGenerateRsp(pCtx, pRsp));
×
2235

UNCOV
2236
_return:
×
UNCOV
2237
  qExplainFreeCtx(pCtx);
×
UNCOV
2238
  QRY_RET(code);
×
2239
}
2240

2241
int32_t qExecExplainBegin(SQueryPlan *pDag, SExplainCtx **pCtx, int64_t startTs) {
388✔
2242
  if(!pDag || !pCtx) return TSDB_CODE_INVALID_PARA;
388!
2243
  QRY_ERR_RET(qExplainPrepareCtx(pDag, pCtx));
388!
2244

2245
  (*pCtx)->reqStartTs = startTs;
388✔
2246
  (*pCtx)->jobStartTs = taosGetTimestampUs();
388✔
2247

2248
  return TSDB_CODE_SUCCESS;
388✔
2249
}
2250

2251
int32_t qExecExplainEnd(SExplainCtx *pCtx, SRetrieveTableRsp **pRsp) {
380✔
2252
  if(!pCtx || !pRsp) return TSDB_CODE_INVALID_PARA;
380!
2253
  int32_t code = 0;
380✔
2254
  pCtx->jobDoneTs = taosGetTimestampUs();
380✔
2255

2256
  atomic_store_8((int8_t *)&pCtx->execDone, true);
380✔
2257

2258
  if (taosHashGetSize(pCtx->groupHash) == atomic_load_32(&pCtx->groupDoneNum)) {
380✔
2259
    if (0 == taosWTryLockLatch(&pCtx->lock)) {
378!
2260
      QRY_ERR_RET(qExplainGenerateRsp(pCtx, pRsp));
378!
2261
      // LEAVE LOCK THERE
2262
    }
2263
  }
2264

2265
  return TSDB_CODE_SUCCESS;
380✔
2266
}
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