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

taosdata / TDengine / #3911

24 Apr 2025 11:36PM UTC coverage: 53.735% (-1.6%) from 55.295%
#3911

push

travis-ci

happyguoxy
Sync branches at 2025-04-25 07:35

170049 of 316459 relevant lines covered (53.73%)

1192430.54 hits per line

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

71.97
/source/libs/nodes/src/nodesUtilFuncs.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
#include "cmdnodes.h"
17
#include "functionMgt.h"
18
#include "nodes.h"
19
#include "nodesUtil.h"
20
#include "plannodes.h"
21
#include "querynodes.h"
22
#include "taos.h"
23
#include "taoserror.h"
24
#include "tdatablock.h"
25
#include "thash.h"
26
#include "tref.h"
27

28
typedef struct SNodeMemChunk {
29
  int32_t               availableSize;
30
  int32_t               usedSize;
31
  char*                 pBuf;
32
  struct SNodeMemChunk* pNext;
33
} SNodeMemChunk;
34

35
struct SNodeAllocator {
36
  int64_t        self;
37
  int64_t        queryId;
38
  int32_t        chunkSize;
39
  int32_t        chunkNum;
40
  SNodeMemChunk* pCurrChunk;
41
  SNodeMemChunk* pChunks;
42
  TdThreadMutex  mutex;
43
};
44

45
static threadlocal SNodeAllocator* g_pNodeAllocator;
46
static int32_t                     g_allocatorReqRefPool = -1;
47

48
char* getJoinTypeString(EJoinType type) {
×
49
  static char* joinType[] = {"", "INNER", "LEFT", "RIGHT", "FULL"};
50
  return joinType[type];
×
51
}
52

53
char* getJoinSTypeString(EJoinSubType type) {
×
54
  static char* joinSType[] = {"", "", "OUTER", "SEMI", "ANTI", "ANY", "ASOF", "WINDOW"};
55
  return joinSType[type];
×
56
}
57

58
char* getFullJoinTypeString(EJoinType type, EJoinSubType stype) {
×
59
  static char* joinFullType[][8] = {
60
      {"INNER", "INNER", "INNER", "INNER", "INNER", "INNER ANY", "INNER", "INNER"},
61
      {"LEFT", "LEFT", "LEFT OUTER", "LEFT SEMI", "LEFT ANTI", "LEFT ANY", "LEFT ASOF", "LEFT WINDOW"},
62
      {"RIGHT", "RIGHT", "RIGHT OUTER", "RIGHT SEMI", "RIGHT ANTI", "RIGHT ANY", "RIGHT ASOF", "RIGHT WINDOW"},
63
      {"FULL", "FULL", "FULL OUTER", "FULL", "FULL", "FULL ANY", "FULL", "FULL"}};
64
  return joinFullType[type][stype];
×
65
}
66

67
int32_t mergeJoinConds(SNode** ppDst, SNode** ppSrc) {
2✔
68
  if (NULL == *ppSrc) {
2✔
69
    return TSDB_CODE_SUCCESS;
2✔
70
  }
71
  if (NULL == *ppDst) {
×
72
    *ppDst = *ppSrc;
×
73
    *ppSrc = NULL;
×
74
    return TSDB_CODE_SUCCESS;
×
75
  }
76
  if (QUERY_NODE_LOGIC_CONDITION == nodeType(*ppSrc) &&
×
77
      ((SLogicConditionNode*)(*ppSrc))->condType == LOGIC_COND_TYPE_AND) {
×
78
    TSWAP(*ppDst, *ppSrc);
×
79
  }
80
  int32_t code = 0;
×
81
  if (QUERY_NODE_LOGIC_CONDITION == nodeType(*ppDst)) {
×
82
    SLogicConditionNode* pDst = (SLogicConditionNode*)*ppDst;
×
83
    if (pDst->condType == LOGIC_COND_TYPE_AND) {
×
84
      if (QUERY_NODE_LOGIC_CONDITION == nodeType(*ppSrc) &&
×
85
          ((SLogicConditionNode*)(*ppSrc))->condType == LOGIC_COND_TYPE_AND) {
×
86
        code = nodesListStrictAppendList(pDst->pParameterList, ((SLogicConditionNode*)(*ppSrc))->pParameterList);
×
87
        ((SLogicConditionNode*)(*ppSrc))->pParameterList = NULL;
×
88
      } else {
89
        code = nodesListStrictAppend(pDst->pParameterList, *ppSrc);
×
90
        *ppSrc = NULL;
×
91
      }
92
      nodesDestroyNode(*ppSrc);
×
93
      *ppSrc = NULL;
×
94

95
      return code;
×
96
    }
97
  }
98

99
  SLogicConditionNode* pLogicCond = NULL;
×
100
  code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogicCond);
×
101
  if (TSDB_CODE_SUCCESS != code) {
×
102
    return code;
×
103
  }
104
  pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL;
×
105
  pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes;
×
106
  pLogicCond->condType = LOGIC_COND_TYPE_AND;
×
107
  pLogicCond->pParameterList = NULL;
×
108
  code = nodesListMakeStrictAppend(&pLogicCond->pParameterList, *ppSrc);
×
109
  if (TSDB_CODE_SUCCESS == code) {
×
110
    *ppSrc = NULL;
×
111
    code = nodesListMakeStrictAppend(&pLogicCond->pParameterList, *ppDst);
×
112
  }
113
  if (TSDB_CODE_SUCCESS == code) {
×
114
    *ppDst = (SNode*)pLogicCond;
×
115
  }
116
  return code;
×
117
}
118

119
static int32_t callocNodeChunk(SNodeAllocator* pAllocator, SNodeMemChunk** pOutChunk) {
76,365✔
120
  SNodeMemChunk* pNewChunk = taosMemoryCalloc(1, sizeof(SNodeMemChunk) + pAllocator->chunkSize);
76,365✔
121
  if (NULL == pNewChunk) {
76,374✔
122
    if (pOutChunk) *pOutChunk = NULL;
×
123
    return terrno;
×
124
  }
125
  pNewChunk->pBuf = (char*)(pNewChunk + 1);
76,374✔
126
  pNewChunk->availableSize = pAllocator->chunkSize;
76,374✔
127
  pNewChunk->usedSize = 0;
76,374✔
128
  pNewChunk->pNext = NULL;
76,374✔
129
  if (NULL != pAllocator->pCurrChunk) {
76,374✔
130
    pAllocator->pCurrChunk->pNext = pNewChunk;
31,768✔
131
  }
132
  pAllocator->pCurrChunk = pNewChunk;
76,374✔
133
  if (NULL == pAllocator->pChunks) {
76,374✔
134
    pAllocator->pChunks = pNewChunk;
44,616✔
135
  }
136
  ++(pAllocator->chunkNum);
76,374✔
137
  if (pOutChunk) *pOutChunk = pNewChunk;
76,374✔
138
  return TSDB_CODE_SUCCESS;
76,374✔
139
}
140

141
static int32_t nodesCallocImpl(int32_t size, void** pOut) {
6,822,959✔
142
  if (NULL == g_pNodeAllocator) {
6,822,959✔
143
    *pOut = taosMemoryCalloc(1, size);
2,741,115✔
144
    if (!*pOut) return terrno;
2,741,442✔
145
    return TSDB_CODE_SUCCESS;
2,741,442✔
146
  }
147

148
  int32_t alignedSize = size;
4,081,844✔
149
#ifdef NO_UNALIGNED_ACCESS
150
  alignedSize = (size + 3) & (~3);
151
#endif
152
  if (g_pNodeAllocator->pCurrChunk->usedSize + alignedSize > g_pNodeAllocator->pCurrChunk->availableSize) {
4,081,844✔
153
    int32_t code = callocNodeChunk(g_pNodeAllocator, NULL);
31,771✔
154
    if (TSDB_CODE_SUCCESS != code) {
31,765✔
155
      *pOut = NULL;
×
156
      return code;
×
157
    }
158
  }
159
  void* p = g_pNodeAllocator->pCurrChunk->pBuf + g_pNodeAllocator->pCurrChunk->usedSize;
4,081,838✔
160
  g_pNodeAllocator->pCurrChunk->usedSize += alignedSize;
4,081,838✔
161
  *pOut = p;
4,081,838✔
162
  return TSDB_CODE_SUCCESS;
4,081,838✔
163
  ;
164
}
165

166
#ifdef NO_UNALIGNED_ACCESS
167
#define NODE_ALLOCATOR_HEAD_LEN 4
168
#else
169
#define NODE_ALLOCATOR_HEAD_LEN 1
170
#endif
171

172
static int32_t nodesCalloc(int32_t num, int32_t size, void** pOut) {
6,820,403✔
173
  void*   p = NULL;
6,820,403✔
174
  int32_t code = nodesCallocImpl(num * size + NODE_ALLOCATOR_HEAD_LEN, &p);
6,820,403✔
175
  if (TSDB_CODE_SUCCESS != code) {
6,827,751✔
176
    return code;
×
177
  }
178
  *(char*)p = (NULL != g_pNodeAllocator) ? 1 : 0;
6,827,751✔
179
  *pOut = (char*)p + NODE_ALLOCATOR_HEAD_LEN;
6,827,751✔
180
  return TSDB_CODE_SUCCESS;
6,827,751✔
181
}
182

183
void nodesFree(void* p) {
6,835,076✔
184
  char* ptr = (char*)p - NODE_ALLOCATOR_HEAD_LEN;
6,835,076✔
185
  if (0 == *ptr) {
6,835,076✔
186
    taosMemoryFree(ptr);
2,740,716✔
187
  }
188
  return;
6,836,239✔
189
}
190

191
static int32_t createNodeAllocator(int32_t chunkSize, SNodeAllocator** pAllocator) {
44,594✔
192
  *pAllocator = taosMemoryCalloc(1, sizeof(SNodeAllocator));
44,594✔
193
  if (NULL == *pAllocator) {
44,608✔
194
    return terrno;
×
195
  }
196
  (*pAllocator)->chunkSize = chunkSize;
44,608✔
197
  int32_t code = callocNodeChunk(*pAllocator, NULL);
44,608✔
198
  if (TSDB_CODE_SUCCESS != code) {
44,616✔
199
    taosMemoryFreeClear(*pAllocator);
×
200
    return code;
×
201
  }
202
  if (0 != taosThreadMutexInit(&(*pAllocator)->mutex, NULL)) {
44,616✔
203
    return TAOS_SYSTEM_ERROR(ERRNO);
×
204
  }
205
  return TSDB_CODE_SUCCESS;
44,618✔
206
}
207

208
static void destroyNodeAllocator(void* p) {
44,616✔
209
  if (NULL == p) {
44,616✔
210
    return;
×
211
  }
212

213
  SNodeAllocator* pAllocator = p;
44,616✔
214

215
  nodesDebug("QID:0x%" PRIx64 ", destroy allocatorId:0x%" PRIx64 ", chunkNum:%d, chunkTotakSize:%d",
44,616✔
216
             pAllocator->queryId, pAllocator->self, pAllocator->chunkNum, pAllocator->chunkNum * pAllocator->chunkSize);
217

218
  SNodeMemChunk* pChunk = pAllocator->pChunks;
44,625✔
219
  while (NULL != pChunk) {
121,037✔
220
    SNodeMemChunk* pTemp = pChunk->pNext;
76,407✔
221
    taosMemoryFree(pChunk);
76,407✔
222
    pChunk = pTemp;
76,412✔
223
  }
224
  (void)taosThreadMutexDestroy(&pAllocator->mutex);
44,630✔
225
  taosMemoryFree(pAllocator);
44,622✔
226
}
227

228
int32_t nodesInitAllocatorSet() {
415✔
229
  if (g_allocatorReqRefPool >= 0) {
415✔
230
    nodesWarn("nodes already initialized");
×
231
    return TSDB_CODE_SUCCESS;
×
232
  }
233

234
  g_allocatorReqRefPool = taosOpenRef(1024, destroyNodeAllocator);
415✔
235
  if (g_allocatorReqRefPool < 0) {
415✔
236
    nodesError("init nodes failed");
×
237
    return TSDB_CODE_OUT_OF_MEMORY;
×
238
  }
239

240
  return TSDB_CODE_SUCCESS;
415✔
241
}
242

243
void nodesDestroyAllocatorSet() {
415✔
244
  if (g_allocatorReqRefPool >= 0) {
415✔
245
    SNodeAllocator* pAllocator = taosIterateRef(g_allocatorReqRefPool, 0);
415✔
246
    int64_t         refId = 0;
415✔
247
    while (NULL != pAllocator) {
490✔
248
      refId = pAllocator->self;
75✔
249
      int32_t code = taosRemoveRef(g_allocatorReqRefPool, refId);
75✔
250
      if (TSDB_CODE_SUCCESS != code) {
75✔
251
        nodesError("failed to remove ref at %s:%d, rsetId:%d, refId:%" PRId64, __func__, __LINE__,
×
252
                   g_allocatorReqRefPool, refId);
253
      }
254
      pAllocator = taosIterateRef(g_allocatorReqRefPool, refId);
75✔
255
    }
256
    taosCloseRef(g_allocatorReqRefPool);
415✔
257
  }
258
}
415✔
259

260
int32_t nodesCreateAllocator(int64_t queryId, int32_t chunkSize, int64_t* pAllocatorId) {
44,595✔
261
  SNodeAllocator* pAllocator = NULL;
44,595✔
262
  int32_t         code = createNodeAllocator(chunkSize, &pAllocator);
44,595✔
263
  if (TSDB_CODE_SUCCESS == code) {
44,618✔
264
    pAllocator->self = taosAddRef(g_allocatorReqRefPool, pAllocator);
44,616✔
265
    if (pAllocator->self <= 0) {
44,625✔
266
      return terrno;
5✔
267
    }
268
    pAllocator->queryId = queryId;
44,620✔
269
    *pAllocatorId = pAllocator->self;
44,620✔
270
  }
271
  return code;
44,622✔
272
}
273

274
int32_t nodesSimAcquireAllocator(int64_t allocatorId) {
152,325✔
275
  if (allocatorId <= 0) {
152,325✔
276
    return TSDB_CODE_SUCCESS;
107,787✔
277
  }
278

279
  SNodeAllocator* pAllocator = taosAcquireRef(g_allocatorReqRefPool, allocatorId);
44,538✔
280
  if (NULL == pAllocator) {
44,551✔
281
    return terrno;
8✔
282
  }
283
  return TSDB_CODE_SUCCESS;
44,543✔
284
}
285

286
int32_t nodesSimReleaseAllocator(int64_t allocatorId) {
152,322✔
287
  if (allocatorId <= 0) {
152,322✔
288
    return TSDB_CODE_SUCCESS;
107,787✔
289
  }
290

291
  return taosReleaseRef(g_allocatorReqRefPool, allocatorId);
44,535✔
292
}
293

294
int32_t nodesAcquireAllocator(int64_t allocatorId) {
354,947✔
295
  if (allocatorId <= 0) {
354,947✔
296
    return TSDB_CODE_SUCCESS;
224,424✔
297
  }
298

299
  SNodeAllocator* pAllocator = taosAcquireRef(g_allocatorReqRefPool, allocatorId);
130,523✔
300
  if (NULL == pAllocator) {
130,648✔
301
    return terrno;
×
302
  }
303
  (void)taosThreadMutexLock(&pAllocator->mutex);
130,648✔
304
  g_pNodeAllocator = pAllocator;
130,648✔
305
  return TSDB_CODE_SUCCESS;
130,648✔
306
}
307

308
int32_t nodesReleaseAllocator(int64_t allocatorId) {
355,142✔
309
  if (allocatorId <= 0) {
355,142✔
310
    return TSDB_CODE_SUCCESS;
224,664✔
311
  }
312

313
  if (NULL == g_pNodeAllocator) {
130,478✔
314
    nodesError("allocatorId:0x%" PRIx64
×
315
               ", release failed, The nodesReleaseAllocator function needs to be called after the "
316
               "nodesAcquireAllocator function is called!",
317
               allocatorId);
318
    return TSDB_CODE_FAILED;
×
319
  }
320
  SNodeAllocator* pAllocator = g_pNodeAllocator;
130,478✔
321
  g_pNodeAllocator = NULL;
130,478✔
322
  (void)taosThreadMutexUnlock(&pAllocator->mutex);
130,478✔
323
  return taosReleaseRef(g_allocatorReqRefPool, allocatorId);
130,626✔
324
}
325

326
int64_t nodesMakeAllocatorWeakRef(int64_t allocatorId) {
41,726✔
327
  if (allocatorId <= 0) {
41,726✔
328
    return 0;
×
329
  }
330

331
  SNodeAllocator* pAllocator = taosAcquireRef(g_allocatorReqRefPool, allocatorId);
41,726✔
332
  if (NULL == pAllocator) {
41,788✔
333
    nodesError("allocatorId:0x%" PRIx64 ", weak reference failed", allocatorId);
×
334
    return -1;
×
335
  }
336
  return pAllocator->self;
41,790✔
337
}
338

339
int64_t nodesReleaseAllocatorWeakRef(int64_t allocatorId) { return taosReleaseRef(g_allocatorReqRefPool, allocatorId); }
160,796✔
340

341
void nodesDestroyAllocator(int64_t allocatorId) {
152,599✔
342
  if (allocatorId <= 0) {
152,599✔
343
    return;
108,070✔
344
  }
345

346
  int32_t code = taosRemoveRef(g_allocatorReqRefPool, allocatorId);
44,529✔
347
  if (TSDB_CODE_SUCCESS != code) {
44,550✔
348
    nodesError("failed to remove ref at %s:%d, rsetId:%d, refId:%" PRId64, __func__, __LINE__, g_allocatorReqRefPool,
×
349
               allocatorId);
350
  }
351
}
352

353
static int32_t makeNode(ENodeType type, int32_t size, SNode** ppNode) {
3,650,718✔
354
  SNode*  p = NULL;
3,650,718✔
355
  int32_t code = nodesCalloc(1, size, (void**)&p);
3,650,718✔
356
  if (TSDB_CODE_SUCCESS == code) {
3,649,211✔
357
    setNodeType(p, type);
3,648,842✔
358
    *ppNode = p;
3,648,842✔
359
  }
360
  return code;
3,649,211✔
361
}
362

363
int32_t nodesMakeNode(ENodeType type, SNode** ppNodeOut) {
3,649,903✔
364
  SNode*  pNode = NULL;
3,649,903✔
365
  int32_t code = 0;
3,649,903✔
366
  switch (type) {
3,649,903✔
367
    case QUERY_NODE_COLUMN:
690,642✔
368
      code = makeNode(type, sizeof(SColumnNode), &pNode);
690,642✔
369
      break;
690,191✔
370
    case QUERY_NODE_VALUE:
406,568✔
371
      code = makeNode(type, sizeof(SValueNode), &pNode);
406,568✔
372
      break;
406,547✔
373
    case QUERY_NODE_OPERATOR:
21,388✔
374
      code = makeNode(type, sizeof(SOperatorNode), &pNode);
21,388✔
375
      break;
21,389✔
376
    case QUERY_NODE_LOGIC_CONDITION:
4,997✔
377
      code = makeNode(type, sizeof(SLogicConditionNode), &pNode);
4,997✔
378
      break;
4,999✔
379
    case QUERY_NODE_FUNCTION:
113,788✔
380
      code = makeNode(type, sizeof(SFunctionNode), &pNode);
113,788✔
381
      break;
113,776✔
382
    case QUERY_NODE_REAL_TABLE:
84,870✔
383
      code = makeNode(type, sizeof(SRealTableNode), &pNode);
84,870✔
384
      break;
84,870✔
385
    case QUERY_NODE_VIRTUAL_TABLE:
×
386
      code = makeNode(type, sizeof(SVirtualTableNode), &pNode);
×
387
      break;
×
388
    case QUERY_NODE_TEMP_TABLE:
381✔
389
      code = makeNode(type, sizeof(STempTableNode), &pNode);
381✔
390
      break;
381✔
391
    case QUERY_NODE_JOIN_TABLE:
153✔
392
      code = makeNode(type, sizeof(SJoinTableNode), &pNode);
153✔
393
      break;
153✔
394
    case QUERY_NODE_GROUPING_SET:
1,433✔
395
      code = makeNode(type, sizeof(SGroupingSetNode), &pNode);
1,433✔
396
      break;
1,433✔
397
    case QUERY_NODE_ORDER_BY_EXPR:
2,161✔
398
      code = makeNode(type, sizeof(SOrderByExprNode), &pNode);
2,161✔
399
      break;
2,161✔
400
    case QUERY_NODE_LIMIT:
1,517✔
401
      code = makeNode(type, sizeof(SLimitNode), &pNode);
1,517✔
402
      break;
1,517✔
403
    case QUERY_NODE_STATE_WINDOW:
34✔
404
      code = makeNode(type, sizeof(SStateWindowNode), &pNode);
34✔
405
      break;
34✔
406
    case QUERY_NODE_SESSION_WINDOW:
28✔
407
      code = makeNode(type, sizeof(SSessionWindowNode), &pNode);
28✔
408
      break;
28✔
409
    case QUERY_NODE_INTERVAL_WINDOW:
603✔
410
      code = makeNode(type, sizeof(SIntervalWindowNode), &pNode);
603✔
411
      break;
603✔
412
    case QUERY_NODE_NODE_LIST:
165,887✔
413
      code = makeNode(type, sizeof(SNodeListNode), &pNode);
165,887✔
414
      break;
165,941✔
415
    case QUERY_NODE_FILL:
81✔
416
      code = makeNode(type, sizeof(SFillNode), &pNode);
81✔
417
      break;
81✔
418
    case QUERY_NODE_RAW_EXPR:
24,159✔
419
      code = makeNode(type, sizeof(SRawExprNode), &pNode);
24,159✔
420
      break;
24,159✔
421
    case QUERY_NODE_TARGET:
91,659✔
422
      code = makeNode(type, sizeof(STargetNode), &pNode);
91,659✔
423
      break;
91,651✔
424
    case QUERY_NODE_DATABLOCK_DESC:
36,261✔
425
      code = makeNode(type, sizeof(SDataBlockDescNode), &pNode);
36,261✔
426
      break;
36,260✔
427
    case QUERY_NODE_SLOT_DESC:
158,150✔
428
      code = makeNode(type, sizeof(SSlotDescNode), &pNode);
158,150✔
429
      break;
158,127✔
430
    case QUERY_NODE_COLUMN_DEF:
32,693✔
431
      code = makeNode(type, sizeof(SColumnDefNode), &pNode);
32,693✔
432
      break;
32,693✔
433
    case QUERY_NODE_DOWNSTREAM_SOURCE:
3,073✔
434
      code = makeNode(type, sizeof(SDownstreamSourceNode), &pNode);
3,073✔
435
      break;
3,073✔
436
    case QUERY_NODE_DATABASE_OPTIONS:
1,016✔
437
      code = makeNode(type, sizeof(SDatabaseOptions), &pNode);
1,016✔
438
      break;
1,016✔
439
    case QUERY_NODE_TABLE_OPTIONS:
37,061✔
440
      code = makeNode(type, sizeof(STableOptions), &pNode);
37,061✔
441
      break;
37,075✔
442
    case QUERY_NODE_COLUMN_OPTIONS:
31,447✔
443
      code = makeNode(type, sizeof(SColumnOptions), &pNode);
31,447✔
444
      break;
31,447✔
445
    case QUERY_NODE_INDEX_OPTIONS:
28✔
446
      code = makeNode(type, sizeof(SIndexOptions), &pNode);
28✔
447
      break;
28✔
448
    case QUERY_NODE_EXPLAIN_OPTIONS:
57✔
449
      code = makeNode(type, sizeof(SExplainOptions), &pNode);
57✔
450
      break;
57✔
451
    case QUERY_NODE_STREAM_OPTIONS:
167✔
452
      code = makeNode(type, sizeof(SStreamOptions), &pNode);
167✔
453
      break;
167✔
454
    case QUERY_NODE_LEFT_VALUE:
171✔
455
      code = makeNode(type, sizeof(SLeftValueNode), &pNode);
171✔
456
      break;
171✔
457
    case QUERY_NODE_COLUMN_REF:
×
458
      code = makeNode(type, sizeof(SColumnRefNode), &pNode);
×
459
      break;
×
460
    case QUERY_NODE_WHEN_THEN:
97✔
461
      code = makeNode(type, sizeof(SWhenThenNode), &pNode);
97✔
462
      break;
97✔
463
    case QUERY_NODE_CASE_WHEN:
68✔
464
      code = makeNode(type, sizeof(SCaseWhenNode), &pNode);
68✔
465
      break;
68✔
466
    case QUERY_NODE_EVENT_WINDOW:
4✔
467
      code = makeNode(type, sizeof(SEventWindowNode), &pNode);
4✔
468
      break;
4✔
469
    case QUERY_NODE_COUNT_WINDOW:
×
470
      code = makeNode(type, sizeof(SCountWindowNode), &pNode);
×
471
      break;
×
472
    case QUERY_NODE_ANOMALY_WINDOW:
×
473
      code = makeNode(type, sizeof(SAnomalyWindowNode), &pNode);
×
474
      break;
×
475
    case QUERY_NODE_HINT:
×
476
      code = makeNode(type, sizeof(SHintNode), &pNode);
×
477
      break;
×
478
    case QUERY_NODE_VIEW:
×
479
      code = makeNode(type, sizeof(SViewNode), &pNode);
×
480
      break;
×
481
    case QUERY_NODE_WINDOW_OFFSET:
×
482
      code = makeNode(type, sizeof(SWindowOffsetNode), &pNode);
×
483
      break;
×
484
    case QUERY_NODE_STREAM_NOTIFY_OPTIONS:
×
485
      code = makeNode(type, sizeof(SStreamNotifyOptions), &pNode);
×
486
      break;
×
487
    case QUERY_NODE_SET_OPERATOR:
127✔
488
      code = makeNode(type, sizeof(SSetOperator), &pNode);
127✔
489
      break;
127✔
490
    case QUERY_NODE_RANGE_AROUND:
×
491
      code = makeNode(type, sizeof(SRangeAroundNode), &pNode);
×
492
      break;
×
493
    case QUERY_NODE_SELECT_STMT:
10,078✔
494
      code = makeNode(type, sizeof(SSelectStmt), &pNode);
10,078✔
495
      break;
10,079✔
496
    case QUERY_NODE_VNODE_MODIFY_STMT:
140,361✔
497
      code = makeNode(type, sizeof(SVnodeModifyOpStmt), &pNode);
140,361✔
498
      break;
140,381✔
499
    case QUERY_NODE_CREATE_DATABASE_STMT:
435✔
500
      code = makeNode(type, sizeof(SCreateDatabaseStmt), &pNode);
435✔
501
      break;
435✔
502
    case QUERY_NODE_DROP_DATABASE_STMT:
360✔
503
      code = makeNode(type, sizeof(SDropDatabaseStmt), &pNode);
360✔
504
      break;
360✔
505
    case QUERY_NODE_ALTER_DATABASE_STMT:
578✔
506
      code = makeNode(type, sizeof(SAlterDatabaseStmt), &pNode);
578✔
507
      break;
578✔
508
    case QUERY_NODE_FLUSH_DATABASE_STMT:
77✔
509
      code = makeNode(type, sizeof(SFlushDatabaseStmt), &pNode);
77✔
510
      break;
77✔
511
    case QUERY_NODE_TRIM_DATABASE_STMT:
26✔
512
      code = makeNode(type, sizeof(STrimDatabaseStmt), &pNode);
26✔
513
      break;
26✔
514
    case QUERY_NODE_S3MIGRATE_DATABASE_STMT:
3✔
515
      code = makeNode(type, sizeof(SS3MigrateDatabaseStmt), &pNode);
3✔
516
      break;
3✔
517
    case QUERY_NODE_CREATE_TABLE_STMT:
374✔
518
      code = makeNode(type, sizeof(SCreateTableStmt), &pNode);
374✔
519
      break;
374✔
520
    case QUERY_NODE_CREATE_SUBTABLE_CLAUSE:
36,632✔
521
      code = makeNode(type, sizeof(SCreateSubTableClause), &pNode);
36,632✔
522
      break;
36,658✔
523
    case QUERY_NODE_CREATE_VIRTUAL_TABLE_STMT:
×
524
      code = makeNode(type, sizeof(SCreateVTableStmt), &pNode);
×
525
      break;
×
526
    case QUERY_NODE_CREATE_VIRTUAL_SUBTABLE_STMT:
×
527
      code = makeNode(type, sizeof(SCreateVSubTableStmt), &pNode);
×
528
      break;
×
529
    case QUERY_NODE_CREATE_SUBTABLE_FROM_FILE_CLAUSE:
×
530
      code = makeNode(type, sizeof(SCreateSubTableFromFileClause), &pNode);
×
531
      break;
×
532
    case QUERY_NODE_CREATE_MULTI_TABLES_STMT:
34,308✔
533
      code = makeNode(type, sizeof(SCreateMultiTablesStmt), &pNode);
34,308✔
534
      break;
34,352✔
535
    case QUERY_NODE_DROP_TABLE_CLAUSE:
708✔
536
      code = makeNode(type, sizeof(SDropTableClause), &pNode);
708✔
537
      break;
708✔
538
    case QUERY_NODE_DROP_TABLE_STMT:
694✔
539
      code = makeNode(type, sizeof(SDropTableStmt), &pNode);
694✔
540
      break;
694✔
541
    case QUERY_NODE_DROP_SUPER_TABLE_STMT:
13✔
542
      code = makeNode(type, sizeof(SDropSuperTableStmt), &pNode);
13✔
543
      break;
13✔
544
    case QUERY_NODE_DROP_VIRTUAL_TABLE_STMT:
×
545
      code = makeNode(type, sizeof(SDropVirtualTableStmt), &pNode);
×
546
      break;
×
547
    case QUERY_NODE_ALTER_TABLE_STMT:
294✔
548
    case QUERY_NODE_ALTER_SUPER_TABLE_STMT:
549
    case QUERY_NODE_ALTER_VIRTUAL_TABLE_STMT:
550
      code = makeNode(type, sizeof(SAlterTableStmt), &pNode);
294✔
551
      break;
294✔
552
    case QUERY_NODE_CREATE_USER_STMT:
80✔
553
      code = makeNode(type, sizeof(SCreateUserStmt), &pNode);
80✔
554
      break;
80✔
555
    case QUERY_NODE_ALTER_USER_STMT:
65✔
556
      code = makeNode(type, sizeof(SAlterUserStmt), &pNode);
65✔
557
      break;
65✔
558
    case QUERY_NODE_DROP_USER_STMT:
65✔
559
      code = makeNode(type, sizeof(SDropUserStmt), &pNode);
65✔
560
      break;
65✔
561
    case QUERY_NODE_USE_DATABASE_STMT:
628✔
562
      code = makeNode(type, sizeof(SUseDatabaseStmt), &pNode);
628✔
563
      break;
628✔
564
    case QUERY_NODE_CREATE_DNODE_STMT:
98✔
565
      code = makeNode(type, sizeof(SCreateDnodeStmt), &pNode);
98✔
566
      break;
98✔
567
    case QUERY_NODE_DROP_DNODE_STMT:
118✔
568
      code = makeNode(type, sizeof(SDropDnodeStmt), &pNode);
118✔
569
      break;
118✔
570
    case QUERY_NODE_ALTER_DNODE_STMT:
72✔
571
      code = makeNode(type, sizeof(SAlterDnodeStmt), &pNode);
72✔
572
      break;
72✔
573
    case QUERY_NODE_CREATE_ANODE_STMT:
×
574
      code = makeNode(type, sizeof(SCreateAnodeStmt), &pNode);
×
575
      break;
×
576
    case QUERY_NODE_DROP_ANODE_STMT:
×
577
      code = makeNode(type, sizeof(SDropAnodeStmt), &pNode);
×
578
      break;
×
579
    case QUERY_NODE_UPDATE_ANODE_STMT:
×
580
      code = makeNode(type, sizeof(SUpdateAnodeStmt), &pNode);
×
581
      break;
×
582
    case QUERY_NODE_CREATE_INDEX_STMT:
45✔
583
      code = makeNode(type, sizeof(SCreateIndexStmt), &pNode);
45✔
584
      break;
45✔
585
    case QUERY_NODE_DROP_INDEX_STMT:
40✔
586
      code = makeNode(type, sizeof(SDropIndexStmt), &pNode);
40✔
587
      break;
40✔
588
    case QUERY_NODE_CREATE_QNODE_STMT:
52✔
589
    case QUERY_NODE_CREATE_BNODE_STMT:
590
    case QUERY_NODE_CREATE_SNODE_STMT:
591
    case QUERY_NODE_CREATE_MNODE_STMT:
592
      code = makeNode(type, sizeof(SCreateComponentNodeStmt), &pNode);
52✔
593
      break;
52✔
594
    case QUERY_NODE_DROP_QNODE_STMT:
43✔
595
    case QUERY_NODE_DROP_BNODE_STMT:
596
    case QUERY_NODE_DROP_SNODE_STMT:
597
    case QUERY_NODE_DROP_MNODE_STMT:
598
      code = makeNode(type, sizeof(SDropComponentNodeStmt), &pNode);
43✔
599
      break;
43✔
600
    case QUERY_NODE_CREATE_TOPIC_STMT:
130✔
601
      code = makeNode(type, sizeof(SCreateTopicStmt), &pNode);
130✔
602
      break;
130✔
603
    case QUERY_NODE_DROP_TOPIC_STMT:
55✔
604
      code = makeNode(type, sizeof(SDropTopicStmt), &pNode);
55✔
605
      break;
55✔
606
    case QUERY_NODE_DROP_CGROUP_STMT:
30✔
607
      code = makeNode(type, sizeof(SDropCGroupStmt), &pNode);
30✔
608
      break;
30✔
609
    case QUERY_NODE_ALTER_LOCAL_STMT:
49✔
610
      code = makeNode(type, sizeof(SAlterLocalStmt), &pNode);
49✔
611
      break;
49✔
612
    case QUERY_NODE_EXPLAIN_STMT:
57✔
613
      code = makeNode(type, sizeof(SExplainStmt), &pNode);
57✔
614
      break;
57✔
615
    case QUERY_NODE_DESCRIBE_STMT:
341✔
616
      code = makeNode(type, sizeof(SDescribeStmt), &pNode);
341✔
617
      break;
341✔
618
    case QUERY_NODE_RESET_QUERY_CACHE_STMT:
34✔
619
      code = makeNode(type, sizeof(SNode), &pNode);
34✔
620
      break;
34✔
621
    case QUERY_NODE_COMPACT_DATABASE_STMT:
53✔
622
      code = makeNode(type, sizeof(SCompactDatabaseStmt), &pNode);
53✔
623
      break;
53✔
624
    case QUERY_NODE_COMPACT_VGROUPS_STMT:
×
625
      code = makeNode(type, sizeof(SCompactVgroupsStmt), &pNode);
×
626
      break;
×
627
    case QUERY_NODE_CREATE_FUNCTION_STMT:
118✔
628
      code = makeNode(type, sizeof(SCreateFunctionStmt), &pNode);
118✔
629
      break;
118✔
630
    case QUERY_NODE_DROP_FUNCTION_STMT:
26✔
631
      code = makeNode(type, sizeof(SDropFunctionStmt), &pNode);
26✔
632
      break;
26✔
633
    case QUERY_NODE_CREATE_STREAM_STMT:
139✔
634
      code = makeNode(type, sizeof(SCreateStreamStmt), &pNode);
139✔
635
      break;
139✔
636
    case QUERY_NODE_DROP_STREAM_STMT:
27✔
637
      code = makeNode(type, sizeof(SDropStreamStmt), &pNode);
27✔
638
      break;
27✔
639
    case QUERY_NODE_PAUSE_STREAM_STMT:
26✔
640
      code = makeNode(type, sizeof(SPauseStreamStmt), &pNode);
26✔
641
      break;
26✔
642
    case QUERY_NODE_RESUME_STREAM_STMT:
26✔
643
      code = makeNode(type, sizeof(SResumeStreamStmt), &pNode);
26✔
644
      break;
26✔
645
    case QUERY_NODE_RESET_STREAM_STMT:
×
646
      code = makeNode(type, sizeof(SResetStreamStmt), &pNode);
×
647
      break;
×
648
    case QUERY_NODE_BALANCE_VGROUP_STMT:
13✔
649
      code = makeNode(type, sizeof(SBalanceVgroupStmt), &pNode);
13✔
650
      break;
13✔
651
    case QUERY_NODE_ASSIGN_LEADER_STMT:
×
652
      code = makeNode(type, sizeof(SAssignLeaderStmt), &pNode);
×
653
      break;
×
654
    case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
13✔
655
      code = makeNode(type, sizeof(SBalanceVgroupLeaderStmt), &pNode);
13✔
656
      break;
13✔
657
    case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT:
×
658
      code = makeNode(type, sizeof(SBalanceVgroupLeaderStmt), &pNode);
×
659
      break;
×
660
    case QUERY_NODE_MERGE_VGROUP_STMT:
13✔
661
      code = makeNode(type, sizeof(SMergeVgroupStmt), &pNode);
13✔
662
      break;
13✔
663
    case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
26✔
664
      code = makeNode(type, sizeof(SRedistributeVgroupStmt), &pNode);
26✔
665
      break;
26✔
666
    case QUERY_NODE_SPLIT_VGROUP_STMT:
13✔
667
      code = makeNode(type, sizeof(SSplitVgroupStmt), &pNode);
13✔
668
      break;
13✔
669
    case QUERY_NODE_SYNCDB_STMT:
×
670
      break;
×
671
    case QUERY_NODE_GRANT_STMT:
79✔
672
      code = makeNode(type, sizeof(SGrantStmt), &pNode);
79✔
673
      break;
79✔
674
    case QUERY_NODE_REVOKE_STMT:
78✔
675
      code = makeNode(type, sizeof(SRevokeStmt), &pNode);
78✔
676
      break;
78✔
677
    case QUERY_NODE_ALTER_CLUSTER_STMT:
×
678
      code = makeNode(type, sizeof(SAlterClusterStmt), &pNode);
×
679
      break;
×
680
    case QUERY_NODE_SHOW_DNODES_STMT:
812✔
681
    case QUERY_NODE_SHOW_MNODES_STMT:
682
    case QUERY_NODE_SHOW_MODULES_STMT:
683
    case QUERY_NODE_SHOW_QNODES_STMT:
684
    case QUERY_NODE_SHOW_ANODES_STMT:
685
    case QUERY_NODE_SHOW_ANODES_FULL_STMT:
686
    case QUERY_NODE_SHOW_SNODES_STMT:
687
    case QUERY_NODE_SHOW_BNODES_STMT:
688
    case QUERY_NODE_SHOW_ARBGROUPS_STMT:
689
    case QUERY_NODE_SHOW_CLUSTER_STMT:
690
    case QUERY_NODE_SHOW_DATABASES_STMT:
691
    case QUERY_NODE_SHOW_FUNCTIONS_STMT:
692
    case QUERY_NODE_SHOW_INDEXES_STMT:
693
    case QUERY_NODE_SHOW_STABLES_STMT:
694
    case QUERY_NODE_SHOW_STREAMS_STMT:
695
    case QUERY_NODE_SHOW_TABLES_STMT:
696
    case QUERY_NODE_SHOW_VTABLES_STMT:
697
    case QUERY_NODE_SHOW_USERS_STMT:
698
    case QUERY_NODE_SHOW_USERS_FULL_STMT:
699
    case QUERY_NODE_SHOW_LICENCES_STMT:
700
    case QUERY_NODE_SHOW_VGROUPS_STMT:
701
    case QUERY_NODE_SHOW_TOPICS_STMT:
702
    case QUERY_NODE_SHOW_CONSUMERS_STMT:
703
    case QUERY_NODE_SHOW_CONNECTIONS_STMT:
704
    case QUERY_NODE_SHOW_QUERIES_STMT:
705
    case QUERY_NODE_SHOW_VNODES_STMT:
706
    case QUERY_NODE_SHOW_APPS_STMT:
707
    case QUERY_NODE_SHOW_VARIABLES_STMT:
708
    case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT:
709
    case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
710
    case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT:
711
    case QUERY_NODE_SHOW_TAGS_STMT:
712
    case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT:
713
    case QUERY_NODE_SHOW_VIEWS_STMT:
714
    case QUERY_NODE_SHOW_GRANTS_FULL_STMT:
715
    case QUERY_NODE_SHOW_GRANTS_LOGS_STMT:
716
    case QUERY_NODE_SHOW_CLUSTER_MACHINES_STMT:
717
    case QUERY_NODE_SHOW_ENCRYPTIONS_STMT:
718
    case QUERY_NODE_SHOW_TSMAS_STMT:
719
    case QUERY_NODE_SHOW_USAGE_STMT:
720
      code = makeNode(type, sizeof(SShowStmt), &pNode);
812✔
721
      break;
812✔
722
    case QUERY_NODE_SHOW_TABLE_TAGS_STMT:
22✔
723
      code = makeNode(type, sizeof(SShowTableTagsStmt), &pNode);
22✔
724
      break;
22✔
725
    case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
16✔
726
      code = makeNode(type, sizeof(SShowDnodeVariablesStmt), &pNode);
16✔
727
      break;
16✔
728
    case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
13✔
729
      code = makeNode(type, sizeof(SShowCreateDatabaseStmt), &pNode);
13✔
730
      break;
13✔
731
    case QUERY_NODE_SHOW_DB_ALIVE_STMT:
×
732
    case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT:
733
      code = makeNode(type, sizeof(SShowAliveStmt), &pNode);
×
734
      break;
×
735
    case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
73✔
736
    case QUERY_NODE_SHOW_CREATE_VTABLE_STMT:
737
    case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
738
      code = makeNode(type, sizeof(SShowCreateTableStmt), &pNode);
73✔
739
      break;
73✔
740
    case QUERY_NODE_SHOW_CREATE_VIEW_STMT:
×
741
      code = makeNode(type, sizeof(SShowCreateViewStmt), &pNode);
×
742
      break;
×
743
    case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT:
12✔
744
      code = makeNode(type, sizeof(SShowTableDistributedStmt), &pNode);
12✔
745
      break;
12✔
746
    case QUERY_NODE_SHOW_COMPACTS_STMT:
×
747
      code = makeNode(type, sizeof(SShowCompactsStmt), &pNode);
×
748
      break;
×
749
    case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT:
×
750
      code = makeNode(type, sizeof(SShowCompactDetailsStmt), &pNode);
×
751
      break;      
×
752
    case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT:
×
753
      code = makeNode(type, sizeof(SShowTransactionDetailsStmt), &pNode); 
×
754
      break;
×
755
    case QUERY_NODE_KILL_QUERY_STMT:
×
756
      code = makeNode(type, sizeof(SKillQueryStmt), &pNode);
×
757
      break;
×
758
    case QUERY_NODE_KILL_TRANSACTION_STMT:
×
759
    case QUERY_NODE_KILL_CONNECTION_STMT:
760
    case QUERY_NODE_KILL_COMPACT_STMT:
761
      code = makeNode(type, sizeof(SKillStmt), &pNode);
×
762
      break;
×
763
    case QUERY_NODE_DELETE_STMT:
265✔
764
      code = makeNode(type, sizeof(SDeleteStmt), &pNode);
265✔
765
      break;
265✔
766
    case QUERY_NODE_INSERT_STMT:
19✔
767
      code = makeNode(type, sizeof(SInsertStmt), &pNode);
19✔
768
      break;
19✔
769
    case QUERY_NODE_QUERY:
151,383✔
770
      code = makeNode(type, sizeof(SQuery), &pNode);
151,383✔
771
      break;
151,402✔
772
    case QUERY_NODE_RESTORE_DNODE_STMT:
52✔
773
    case QUERY_NODE_RESTORE_QNODE_STMT:
774
    case QUERY_NODE_RESTORE_MNODE_STMT:
775
    case QUERY_NODE_RESTORE_VNODE_STMT:
776
      code = makeNode(type, sizeof(SRestoreComponentNodeStmt), &pNode);
52✔
777
      break;
52✔
778
    case QUERY_NODE_CREATE_VIEW_STMT:
×
779
      code = makeNode(type, sizeof(SCreateViewStmt), &pNode);
×
780
      break;
×
781
    case QUERY_NODE_DROP_VIEW_STMT:
×
782
      code = makeNode(type, sizeof(SDropViewStmt), &pNode);
×
783
      break;
×
784
    case QUERY_NODE_CREATE_TSMA_STMT:
2✔
785
      code = makeNode(type, sizeof(SCreateTSMAStmt), &pNode);
2✔
786
      break;
2✔
787
    case QUERY_NODE_DROP_TSMA_STMT:
×
788
      code = makeNode(type, sizeof(SDropTSMAStmt), &pNode);
×
789
      break;
×
790
    case QUERY_NODE_TSMA_OPTIONS:
2✔
791
      code = makeNode(type, sizeof(STSMAOptions), &pNode);
2✔
792
      break;
2✔
793
    case QUERY_NODE_LOGIC_PLAN_SCAN:
16,759✔
794
      code = makeNode(type, sizeof(SScanLogicNode), &pNode);
16,759✔
795
      break;
16,765✔
796
    case QUERY_NODE_LOGIC_PLAN_JOIN:
120✔
797
      code = makeNode(type, sizeof(SJoinLogicNode), &pNode);
120✔
798
      break;
120✔
799
    case QUERY_NODE_LOGIC_PLAN_AGG:
11,451✔
800
      code = makeNode(type, sizeof(SAggLogicNode), &pNode);
11,451✔
801
      break;
11,466✔
802
    case QUERY_NODE_LOGIC_PLAN_PROJECT:
9,141✔
803
      code = makeNode(type, sizeof(SProjectLogicNode), &pNode);
9,141✔
804
      break;
9,146✔
805
    case QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY:
309,868✔
806
      code = makeNode(type, sizeof(SVnodeModifyLogicNode), &pNode);
309,868✔
807
      break;
309,939✔
808
    case QUERY_NODE_LOGIC_PLAN_EXCHANGE:
2,336✔
809
      code = makeNode(type, sizeof(SExchangeLogicNode), &pNode);
2,336✔
810
      break;
2,336✔
811
    case QUERY_NODE_LOGIC_PLAN_MERGE:
273✔
812
      code = makeNode(type, sizeof(SMergeLogicNode), &pNode);
273✔
813
      break;
273✔
814
    case QUERY_NODE_LOGIC_PLAN_WINDOW:
594✔
815
      code = makeNode(type, sizeof(SWindowLogicNode), &pNode);
594✔
816
      break;
594✔
817
    case QUERY_NODE_LOGIC_PLAN_FILL:
80✔
818
      code = makeNode(type, sizeof(SFillLogicNode), &pNode);
80✔
819
      break;
80✔
820
    case QUERY_NODE_LOGIC_PLAN_SORT:
481✔
821
      code = makeNode(type, sizeof(SSortLogicNode), &pNode);
481✔
822
      break;
481✔
823
    case QUERY_NODE_LOGIC_PLAN_PARTITION:
192✔
824
      code = makeNode(type, sizeof(SPartitionLogicNode), &pNode);
192✔
825
      break;
192✔
826
    case QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC:
122✔
827
      code = makeNode(type, sizeof(SIndefRowsFuncLogicNode), &pNode);
122✔
828
      break;
122✔
829
    case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
24✔
830
      code = makeNode(type, sizeof(SInterpFuncLogicNode), &pNode);
24✔
831
      break;
24✔
832
    case QUERY_NODE_LOGIC_PLAN_FORECAST_FUNC:
×
833
      code = makeNode(type, sizeof(SForecastFuncLogicNode), &pNode);
×
834
      break;
×
835
    case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE:
×
836
      code = makeNode(type, sizeof(SGroupCacheLogicNode), &pNode);
×
837
      break;
×
838
    case QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL:
×
839
      code = makeNode(type, sizeof(SDynQueryCtrlLogicNode), &pNode);
×
840
      break;
×
841
    case QUERY_NODE_LOGIC_PLAN_VIRTUAL_TABLE_SCAN:
×
842
      code = makeNode(type, sizeof(SVirtualScanLogicNode), &pNode);
×
843
      break;
×
844
    case QUERY_NODE_LOGIC_SUBPLAN:
328,492✔
845
      code = makeNode(type, sizeof(SLogicSubplan), &pNode);
328,492✔
846
      break;
328,574✔
847
    case QUERY_NODE_LOGIC_PLAN:
161,250✔
848
      code = makeNode(type, sizeof(SQueryLogicPlan), &pNode);
161,250✔
849
      break;
161,308✔
850
    case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN:
104✔
851
      code = makeNode(type, sizeof(STagScanPhysiNode), &pNode);
104✔
852
      break;
104✔
853
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
9,308✔
854
      code = makeNode(type, sizeof(STableScanPhysiNode), &pNode);
9,308✔
855
      break;
9,313✔
856
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN:
×
857
      code = makeNode(type, sizeof(STableSeqScanPhysiNode), &pNode);
×
858
      break;
×
859
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
209✔
860
      code = makeNode(type, sizeof(STableMergeScanPhysiNode), &pNode);
209✔
861
      break;
209✔
862
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
251✔
863
      code = makeNode(type, sizeof(SStreamScanPhysiNode), &pNode);
251✔
864
      break;
251✔
865
    case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
1,414✔
866
      code = makeNode(type, sizeof(SSystemTableScanPhysiNode), &pNode);
1,414✔
867
      break;
1,414✔
868
    case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
19✔
869
      code = makeNode(type, sizeof(SBlockDistScanPhysiNode), &pNode);
19✔
870
      break;
19✔
871
    case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
48✔
872
      code = makeNode(type, sizeof(SLastRowScanPhysiNode), &pNode);
48✔
873
      break;
48✔
874
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN:
×
875
      code = makeNode(type, sizeof(STableCountScanPhysiNode), &pNode);
×
876
      break;
×
877
    case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
2,385✔
878
      code = makeNode(type, sizeof(SProjectPhysiNode), &pNode);
2,385✔
879
      break;
2,386✔
880
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN:
86✔
881
      code = makeNode(type, sizeof(SSortMergeJoinPhysiNode), &pNode);
86✔
882
      break;
86✔
883
    case QUERY_NODE_PHYSICAL_PLAN_HASH_JOIN:
×
884
      code = makeNode(type, sizeof(SHashJoinPhysiNode), &pNode);
×
885
      break;
×
886
    case QUERY_NODE_PHYSICAL_PLAN_HASH_AGG:
6,705✔
887
      code = makeNode(type, sizeof(SAggPhysiNode), &pNode);
6,705✔
888
      break;
6,709✔
889
    case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE:
2,157✔
890
      code = makeNode(type, sizeof(SExchangePhysiNode), &pNode);
2,157✔
891
      break;
2,157✔
892
    case QUERY_NODE_PHYSICAL_PLAN_MERGE:
277✔
893
      code = makeNode(type, sizeof(SMergePhysiNode), &pNode);
277✔
894
      break;
277✔
895
    case QUERY_NODE_PHYSICAL_PLAN_SORT:
211✔
896
      code = makeNode(type, sizeof(SSortPhysiNode), &pNode);
211✔
897
      break;
211✔
898
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT:
6✔
899
      code = makeNode(type, sizeof(SGroupSortPhysiNode), &pNode);
6✔
900
      break;
6✔
901
    case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL:
314✔
902
      code = makeNode(type, sizeof(SIntervalPhysiNode), &pNode);
314✔
903
      break;
314✔
904
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL:
×
905
      code = makeNode(type, sizeof(SMergeIntervalPhysiNode), &pNode);
×
906
      break;
×
907
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL:
81✔
908
      code = makeNode(type, sizeof(SMergeAlignedIntervalPhysiNode), &pNode);
81✔
909
      break;
81✔
910
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL:
20✔
911
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_INTERVAL:
912
      code = makeNode(type, sizeof(SStreamIntervalPhysiNode), &pNode);
20✔
913
      break;
20✔
914
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL:
16✔
915
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_FINAL_INTERVAL:
916
      code = makeNode(type, sizeof(SStreamFinalIntervalPhysiNode), &pNode);
16✔
917
      break;
16✔
918
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL:
26✔
919
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_SEMI_INTERVAL:
920
      code = makeNode(type, sizeof(SStreamSemiIntervalPhysiNode), &pNode);
26✔
921
      break;
26✔
922
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_MID_INTERVAL:
8✔
923
      code = makeNode(type, sizeof(SStreamMidIntervalPhysiNode), &pNode);
8✔
924
      break;
8✔
925
    case QUERY_NODE_PHYSICAL_PLAN_FILL:
50✔
926
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL:
927
      code = makeNode(type, sizeof(SFillPhysiNode), &pNode);
50✔
928
      break;
50✔
929
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_SESSION:
20✔
930
      code = makeNode(type, sizeof(SSessionWinodwPhysiNode), &pNode);
20✔
931
      break;
20✔
932
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION:
×
933
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_SESSION:
934
      code = makeNode(type, sizeof(SStreamSessionWinodwPhysiNode), &pNode);
×
935
      break;
×
936
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION:
2✔
937
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_SEMI_SESSION:
938
      code = makeNode(type, sizeof(SStreamSemiSessionWinodwPhysiNode), &pNode);
2✔
939
      break;
2✔
940
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION:
2✔
941
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_FINAL_SESSION:
942
      code = makeNode(type, sizeof(SStreamFinalSessionWinodwPhysiNode), &pNode);
2✔
943
      break;
2✔
944
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE:
18✔
945
      code = makeNode(type, sizeof(SStateWinodwPhysiNode), &pNode);
18✔
946
      break;
18✔
947
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE:
×
948
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_STATE:
949
      code = makeNode(type, sizeof(SStreamStateWinodwPhysiNode), &pNode);
×
950
      break;
×
951
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_EVENT:
6✔
952
      code = makeNode(type, sizeof(SEventWinodwPhysiNode), &pNode);
6✔
953
      break;
6✔
954
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_EVENT:
×
955
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_EVENT:
956
      code = makeNode(type, sizeof(SStreamEventWinodwPhysiNode), &pNode);
×
957
      break;
×
958
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT:
×
959
      code = makeNode(type, sizeof(SCountWinodwPhysiNode), &pNode);
×
960
      break;
×
961
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_ANOMALY:
×
962
      code = makeNode(type, sizeof(SAnomalyWindowPhysiNode), &pNode);
×
963
      break;
×
964
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT:
×
965
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_COUNT:
966
      code = makeNode(type, sizeof(SStreamCountWinodwPhysiNode), &pNode);
×
967
      break;
×
968
    case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
53✔
969
      code = makeNode(type, sizeof(SPartitionPhysiNode), &pNode);
53✔
970
      break;
53✔
971
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION:
5✔
972
      code = makeNode(type, sizeof(SStreamPartitionPhysiNode), &pNode);
5✔
973
      break;
5✔
974
    case QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC:
47✔
975
      code = makeNode(type, sizeof(SIndefRowsFuncPhysiNode), &pNode);
47✔
976
      break;
47✔
977
    case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
12✔
978
      code = makeNode(type, sizeof(SInterpFuncLogicNode), &pNode);
12✔
979
      break;
12✔
980
    case QUERY_NODE_PHYSICAL_PLAN_FORECAST_FUNC:
×
981
      code = makeNode(type, sizeof(SForecastFuncLogicNode), &pNode);
×
982
      break;
×
983
    case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
12,650✔
984
      code = makeNode(type, sizeof(SDataDispatcherNode), &pNode);
12,650✔
985
      break;
12,652✔
986
    case QUERY_NODE_PHYSICAL_PLAN_INSERT:
155,277✔
987
      code = makeNode(type, sizeof(SDataInserterNode), &pNode);
155,277✔
988
      break;
155,376✔
989
    case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT:
9✔
990
      code = makeNode(type, sizeof(SQueryInserterNode), &pNode);
9✔
991
      break;
9✔
992
    case QUERY_NODE_PHYSICAL_PLAN_DELETE:
317✔
993
      code = makeNode(type, sizeof(SDataDeleterNode), &pNode);
317✔
994
      break;
317✔
995
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE:
×
996
      code = makeNode(type, sizeof(SGroupCachePhysiNode), &pNode);
×
997
      break;
×
998
    case QUERY_NODE_PHYSICAL_PLAN_DYN_QUERY_CTRL:
×
999
      code = makeNode(type, sizeof(SDynQueryCtrlPhysiNode), &pNode);
×
1000
      break;
×
1001
    case QUERY_NODE_PHYSICAL_SUBPLAN:
168,504✔
1002
      code = makeNode(type, sizeof(SSubplan), &pNode);
168,504✔
1003
      break;
168,577✔
1004
    case QUERY_NODE_PHYSICAL_PLAN:
161,379✔
1005
      code = makeNode(type, sizeof(SQueryPlan), &pNode);
161,379✔
1006
      break;
161,409✔
1007
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERP_FUNC:
×
1008
      code = makeNode(type, sizeof(SStreamInterpFuncPhysiNode), &pNode);
×
1009
      break;
×
1010
    case QUERY_NODE_PHYSICAL_PLAN_VIRTUAL_TABLE_SCAN:
×
1011
      code = makeNode(type, sizeof(SVirtualScanPhysiNode), &pNode);
×
1012
      break;
×
1013
    case QUERY_NODE_SHOW_SCORES_STMT:
×
1014
      code = TSDB_CODE_OPS_NOT_SUPPORT;
×
1015
      break;
×
1016
    default:
×
1017
      break;
×
1018
  }
1019
  if (TSDB_CODE_SUCCESS != code) {
3,650,019✔
1020
    nodesError("nodesMakeNode unknown node = %s", nodesNodeName(type));
×
1021
  }
1022
  else
1023
    *ppNodeOut = pNode;
3,650,019✔
1024
  return code;
3,647,990✔
1025
}
1026

1027
static void destroyVgDataBlockArray(SArray* pArray) {
450,331✔
1028
  size_t size = taosArrayGetSize(pArray);
450,331✔
1029
  for (size_t i = 0; i < size; ++i) {
605,750✔
1030
    SVgDataBlocks* pVg = taosArrayGetP(pArray, i);
155,376✔
1031
    taosMemoryFreeClear(pVg->pData);
155,404✔
1032
    taosMemoryFreeClear(pVg);
155,398✔
1033
  }
1034
  taosArrayDestroy(pArray);
450,374✔
1035
}
450,372✔
1036

1037
static void destroyLogicNode(SLogicNode* pNode) {
351,481✔
1038
  nodesDestroyList(pNode->pTargets);
351,481✔
1039
  nodesDestroyNode(pNode->pConditions);
351,539✔
1040
  nodesDestroyList(pNode->pChildren);
351,488✔
1041
  nodesDestroyNode(pNode->pLimit);
351,496✔
1042
  nodesDestroyNode(pNode->pSlimit);
351,451✔
1043
  nodesDestroyList(pNode->pHint);
351,554✔
1044
}
351,585✔
1045

1046
static void destroyPhysiNode(SPhysiNode* pNode) {
23,860✔
1047
  nodesDestroyList(pNode->pChildren);
23,860✔
1048
  nodesDestroyNode(pNode->pConditions);
23,868✔
1049
  nodesDestroyNode((SNode*)pNode->pOutputDataBlockDesc);
23,868✔
1050
  nodesDestroyNode(pNode->pLimit);
23,867✔
1051
  nodesDestroyNode(pNode->pSlimit);
23,865✔
1052
}
23,865✔
1053

1054
static void destroyWinodwPhysiNode(SWindowPhysiNode* pNode) {
513✔
1055
  destroyPhysiNode((SPhysiNode*)pNode);
513✔
1056
  nodesDestroyList(pNode->pExprs);
513✔
1057
  nodesDestroyList(pNode->pFuncs);
513✔
1058
  nodesDestroyNode(pNode->pTspk);
513✔
1059
  nodesDestroyNode(pNode->pTsEnd);
513✔
1060
}
513✔
1061

1062
static void destroyPartitionPhysiNode(SPartitionPhysiNode* pNode) {
58✔
1063
  destroyPhysiNode((SPhysiNode*)pNode);
58✔
1064
  nodesDestroyList(pNode->pExprs);
58✔
1065
  nodesDestroyList(pNode->pPartitionKeys);
58✔
1066
  nodesDestroyList(pNode->pTargets);
58✔
1067
}
58✔
1068

1069
static void destroyScanPhysiNode(SScanPhysiNode* pNode) {
11,357✔
1070
  destroyPhysiNode((SPhysiNode*)pNode);
11,357✔
1071
  nodesDestroyList(pNode->pScanCols);
11,356✔
1072
  nodesDestroyList(pNode->pScanPseudoCols);
11,359✔
1073
}
11,359✔
1074

1075
static void destroyDataSinkNode(SDataSinkNode* pNode) { nodesDestroyNode((SNode*)pNode->pInputDataBlockDesc); }
168,299✔
1076

1077
static void destroyExprNode(SExprNode* pExpr) { taosArrayDestroy(pExpr->pAssociation); }
1,235,676✔
1078

1079
static void destroyTableCfg(STableCfg* pCfg) {
73✔
1080
  if (NULL == pCfg) {
73✔
1081
    return;
18✔
1082
  }
1083
  taosArrayDestroy(pCfg->pFuncs);
55✔
1084
  taosMemoryFree(pCfg->pComment);
55✔
1085
  taosMemoryFree(pCfg->pSchemas);
55✔
1086
  taosMemoryFree(pCfg->pSchemaExt);
55✔
1087
  taosMemoryFree(pCfg->pColRefs);
55✔
1088
  taosMemoryFree(pCfg->pTags);
55✔
1089
  taosMemoryFree(pCfg);
55✔
1090
}
1091

1092
static void destroySmaIndex(void* pIndex) { taosMemoryFree(((STableIndexInfo*)pIndex)->expr); }
×
1093

1094
void destroyFuncParam(void* pValue) { taosMemoryFree(((SFunctParam*)pValue)->pCol); }
×
1095

1096
static void destroyHintValue(EHintOption option, void* value) {
×
1097
  switch (option) {
1098
    default:
1099
      break;
×
1100
  }
1101

1102
  taosMemoryFree(value);
×
1103
}
×
1104

1105
void nodesDestroyNode(SNode* pNode) {
7,549,400✔
1106
  if (NULL == pNode) {
7,549,400✔
1107
    return;
3,907,005✔
1108
  }
1109

1110
  switch (nodeType(pNode)) {
3,642,395✔
1111
    case QUERY_NODE_COLUMN:
689,891✔
1112
      destroyExprNode((SExprNode*)pNode);
689,891✔
1113
      break;
690,060✔
1114
    case QUERY_NODE_VALUE: {
406,772✔
1115
      SValueNode* pValue = (SValueNode*)pNode;
406,772✔
1116
      destroyExprNode((SExprNode*)pNode);
406,772✔
1117
      taosMemoryFreeClear(pValue->literal);
406,857✔
1118
      if (IS_VAR_DATA_TYPE(pValue->node.resType.type) || pValue->node.resType.type == TSDB_DATA_TYPE_DECIMAL) {
407,482✔
1119
        taosMemoryFreeClear(pValue->datum.p);
47,292✔
1120
      }
1121
      break;
407,483✔
1122
    }
1123
    case QUERY_NODE_OPERATOR: {
21,389✔
1124
      SOperatorNode* pOp = (SOperatorNode*)pNode;
21,389✔
1125
      destroyExprNode((SExprNode*)pNode);
21,389✔
1126
      nodesDestroyNode(pOp->pLeft);
21,391✔
1127
      nodesDestroyNode(pOp->pRight);
21,389✔
1128
      break;
21,392✔
1129
    }
1130
    case QUERY_NODE_LOGIC_CONDITION:
4,952✔
1131
      destroyExprNode((SExprNode*)pNode);
4,952✔
1132
      nodesDestroyList(((SLogicConditionNode*)pNode)->pParameterList);
4,954✔
1133
      break;
4,955✔
1134
    case QUERY_NODE_FUNCTION:
113,755✔
1135
      destroyExprNode((SExprNode*)pNode);
113,755✔
1136
      nodesDestroyList(((SFunctionNode*)pNode)->pParameterList);
113,777✔
1137
      break;
113,677✔
1138
    case QUERY_NODE_REAL_TABLE: {
84,871✔
1139
      SRealTableNode* pReal = (SRealTableNode*)pNode;
84,871✔
1140
      taosMemoryFreeClear(pReal->pMeta);
84,871✔
1141
      taosMemoryFreeClear(pReal->pVgroupList);
84,870✔
1142
      taosArrayDestroyEx(pReal->pSmaIndexes, destroySmaIndex);
84,870✔
1143
      taosArrayDestroyP(pReal->tsmaTargetTbVgInfo, NULL);
84,875✔
1144
      taosArrayDestroy(pReal->tsmaTargetTbInfo);
84,875✔
1145
      break;
84,885✔
1146
    }
1147
    case QUERY_NODE_VIRTUAL_TABLE: {
×
1148
      SVirtualTableNode *pVirtual = (SVirtualTableNode*)pNode;
×
1149
      taosMemoryFreeClear(pVirtual->pMeta);
×
1150
      taosMemoryFreeClear(pVirtual->pVgroupList);
×
1151
      nodesDestroyList(pVirtual->refTables);
×
1152
      break;
×
1153
    }
1154
    case QUERY_NODE_TEMP_TABLE:
381✔
1155
      nodesDestroyNode(((STempTableNode*)pNode)->pSubquery);
381✔
1156
      break;
381✔
1157
    case QUERY_NODE_JOIN_TABLE: {
153✔
1158
      SJoinTableNode* pJoin = (SJoinTableNode*)pNode;
153✔
1159
      nodesDestroyNode(pJoin->pWindowOffset);
153✔
1160
      nodesDestroyNode(pJoin->pJLimit);
153✔
1161
      nodesDestroyNode(pJoin->addPrimCond);
153✔
1162
      nodesDestroyNode(pJoin->pLeft);
153✔
1163
      nodesDestroyNode(pJoin->pRight);
153✔
1164
      nodesDestroyNode(pJoin->pOnCond);
153✔
1165
      break;
153✔
1166
    }
1167
    case QUERY_NODE_GROUPING_SET:
1,433✔
1168
      nodesDestroyList(((SGroupingSetNode*)pNode)->pParameterList);
1,433✔
1169
      break;
1,433✔
1170
    case QUERY_NODE_ORDER_BY_EXPR:
2,161✔
1171
      nodesDestroyNode(((SOrderByExprNode*)pNode)->pExpr);
2,161✔
1172
      break;
2,161✔
1173
    case QUERY_NODE_LIMIT: {
1,517✔
1174
      SLimitNode* pLimit = (SLimitNode*)pNode;
1,517✔
1175
      nodesDestroyNode((SNode*)pLimit->limit);
1,517✔
1176
      nodesDestroyNode((SNode*)pLimit->offset);
1,517✔
1177
      break;
1,517✔
1178
    }
1179
    case QUERY_NODE_STATE_WINDOW: {
34✔
1180
      SStateWindowNode* pState = (SStateWindowNode*)pNode;
34✔
1181
      nodesDestroyNode(pState->pCol);
34✔
1182
      nodesDestroyNode(pState->pExpr);
34✔
1183
      nodesDestroyNode(pState->pTrueForLimit);
34✔
1184
      break;
34✔
1185
    }
1186
    case QUERY_NODE_SESSION_WINDOW: {
28✔
1187
      SSessionWindowNode* pSession = (SSessionWindowNode*)pNode;
28✔
1188
      nodesDestroyNode((SNode*)pSession->pCol);
28✔
1189
      nodesDestroyNode((SNode*)pSession->pGap);
28✔
1190
      break;
28✔
1191
    }
1192
    case QUERY_NODE_INTERVAL_WINDOW: {
603✔
1193
      SIntervalWindowNode* pJoin = (SIntervalWindowNode*)pNode;
603✔
1194
      nodesDestroyNode(pJoin->pCol);
603✔
1195
      nodesDestroyNode(pJoin->pInterval);
603✔
1196
      nodesDestroyNode(pJoin->pOffset);
603✔
1197
      nodesDestroyNode(pJoin->pSliding);
603✔
1198
      nodesDestroyNode(pJoin->pFill);
603✔
1199
      break;
603✔
1200
    }
1201
    case QUERY_NODE_NODE_LIST:
165,949✔
1202
      nodesDestroyList(((SNodeListNode*)pNode)->pNodeList);
165,949✔
1203
      break;
165,968✔
1204
    case QUERY_NODE_FILL: {
81✔
1205
      SFillNode* pFill = (SFillNode*)pNode;
81✔
1206
      nodesDestroyNode(pFill->pValues);
81✔
1207
      nodesDestroyNode(pFill->pWStartTs);
81✔
1208
      break;
81✔
1209
    }
1210
    case QUERY_NODE_RAW_EXPR:
24,157✔
1211
      nodesDestroyNode(((SRawExprNode*)pNode)->pNode);
24,157✔
1212
      break;
24,160✔
1213
    case QUERY_NODE_TARGET:
91,653✔
1214
      nodesDestroyNode(((STargetNode*)pNode)->pExpr);
91,653✔
1215
      break;
91,667✔
1216
    case QUERY_NODE_DATABLOCK_DESC:
36,276✔
1217
      nodesDestroyList(((SDataBlockDescNode*)pNode)->pSlots);
36,276✔
1218
      break;
36,275✔
1219
    case QUERY_NODE_SLOT_DESC:  // no pointer field
158,112✔
1220
      break;
158,112✔
1221
    case QUERY_NODE_COLUMN_DEF:
32,591✔
1222
      nodesDestroyNode(((SColumnDefNode*)pNode)->pOptions);
32,591✔
1223
      break;
32,591✔
1224
    case QUERY_NODE_DOWNSTREAM_SOURCE:  // no pointer field
3,073✔
1225
      break;
3,073✔
1226
    case QUERY_NODE_DATABASE_OPTIONS: {
1,015✔
1227
      SDatabaseOptions* pOptions = (SDatabaseOptions*)pNode;
1,015✔
1228
      nodesDestroyNode((SNode*)pOptions->pDaysPerFile);
1,015✔
1229
      nodesDestroyNode((SNode*)pOptions->s3KeepLocalStr);
1,015✔
1230
      nodesDestroyList(pOptions->pKeep);
1,015✔
1231
      nodesDestroyList(pOptions->pRetentions);
1,015✔
1232
      nodesDestroyNode((SNode*)pOptions->pCompactIntervalNode);
1,015✔
1233
      nodesDestroyList(pOptions->pCompactTimeRangeList);
1,015✔
1234
      nodesDestroyNode((SNode*)pOptions->pCompactTimeOffsetNode);
1,015✔
1235
      nodesDestroyNode((SNode*)pOptions->pKeepTimeOffsetNode);
1,015✔
1236
      break;
1,015✔
1237
    }
1238
    case QUERY_NODE_TABLE_OPTIONS: {
37,043✔
1239
      STableOptions* pOptions = (STableOptions*)pNode;
37,043✔
1240
      nodesDestroyList(pOptions->pMaxDelay);
37,043✔
1241
      nodesDestroyList(pOptions->pWatermark);
37,056✔
1242
      nodesDestroyList(pOptions->pRollupFuncs);
37,068✔
1243
      nodesDestroyList(pOptions->pSma);
37,085✔
1244
      nodesDestroyList(pOptions->pDeleteMark);
37,091✔
1245
      nodesDestroyNode((SNode*)pOptions->pKeepNode);
37,099✔
1246
      break;
37,096✔
1247
    }
1248
    case QUERY_NODE_COLUMN_OPTIONS: {
31,439✔
1249
      SColumnOptions* pOptions = (SColumnOptions*)pNode;
31,439✔
1250
      break;
31,439✔
1251
    }
1252
    case QUERY_NODE_INDEX_OPTIONS: {
28✔
1253
      SIndexOptions* pOptions = (SIndexOptions*)pNode;
28✔
1254
      nodesDestroyList(pOptions->pFuncs);
28✔
1255
      nodesDestroyNode(pOptions->pInterval);
28✔
1256
      nodesDestroyNode(pOptions->pOffset);
28✔
1257
      nodesDestroyNode(pOptions->pSliding);
28✔
1258
      nodesDestroyNode(pOptions->pStreamOptions);
28✔
1259
      break;
28✔
1260
    }
1261
    case QUERY_NODE_EXPLAIN_OPTIONS:  // no pointer field
57✔
1262
      break;
57✔
1263
    case QUERY_NODE_STREAM_OPTIONS: {
167✔
1264
      SStreamOptions* pOptions = (SStreamOptions*)pNode;
167✔
1265
      nodesDestroyNode(pOptions->pDelay);
167✔
1266
      nodesDestroyNode(pOptions->pWatermark);
167✔
1267
      nodesDestroyNode(pOptions->pDeleteMark);
167✔
1268
      nodesDestroyNode(pOptions->pRecInterval);
167✔
1269
      break;
167✔
1270
    }
1271
    case QUERY_NODE_TSMA_OPTIONS: {
2✔
1272
      STSMAOptions* pOptions = (STSMAOptions*)pNode;
2✔
1273
      nodesDestroyList(pOptions->pFuncs);
2✔
1274
      nodesDestroyNode(pOptions->pInterval);
2✔
1275
      break;
2✔
1276
    }
1277
    case QUERY_NODE_LEFT_VALUE:  // no pointer field
171✔
1278
    case QUERY_NODE_COLUMN_REF:  // no pointer field
1279
      break;
171✔
1280
    case QUERY_NODE_WHEN_THEN: {
97✔
1281
      SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode;
97✔
1282
      destroyExprNode((SExprNode*)pNode);
97✔
1283
      nodesDestroyNode(pWhenThen->pWhen);
97✔
1284
      nodesDestroyNode(pWhenThen->pThen);
97✔
1285
      break;
97✔
1286
    }
1287
    case QUERY_NODE_CASE_WHEN: {
68✔
1288
      SCaseWhenNode* pCaseWhen = (SCaseWhenNode*)pNode;
68✔
1289
      destroyExprNode((SExprNode*)pNode);
68✔
1290
      nodesDestroyNode(pCaseWhen->pCase);
68✔
1291
      nodesDestroyNode(pCaseWhen->pElse);
68✔
1292
      nodesDestroyList(pCaseWhen->pWhenThenList);
68✔
1293
      break;
68✔
1294
    }
1295
    case QUERY_NODE_EVENT_WINDOW: {
4✔
1296
      SEventWindowNode* pEvent = (SEventWindowNode*)pNode;
4✔
1297
      nodesDestroyNode(pEvent->pCol);
4✔
1298
      nodesDestroyNode(pEvent->pStartCond);
4✔
1299
      nodesDestroyNode(pEvent->pEndCond);
4✔
1300
      nodesDestroyNode(pEvent->pTrueForLimit);
4✔
1301
      break;
4✔
1302
    }
1303
    case QUERY_NODE_COUNT_WINDOW: {
×
1304
      SCountWindowNode* pEvent = (SCountWindowNode*)pNode;
×
1305
      nodesDestroyNode(pEvent->pCol);
×
1306
      break;
×
1307
    }
1308
    case QUERY_NODE_ANOMALY_WINDOW: {
×
1309
      SAnomalyWindowNode* pAnomaly = (SAnomalyWindowNode*)pNode;
×
1310
      nodesDestroyNode(pAnomaly->pCol);
×
1311
      nodesDestroyNode(pAnomaly->pExpr);
×
1312
      break;
×
1313
    }
1314
    case QUERY_NODE_HINT: {
×
1315
      SHintNode* pHint = (SHintNode*)pNode;
×
1316
      destroyHintValue(pHint->option, pHint->value);
×
1317
      break;
×
1318
    }
1319
    case QUERY_NODE_VIEW: {
×
1320
      SViewNode* pView = (SViewNode*)pNode;
×
1321
      taosMemoryFreeClear(pView->pMeta);
×
1322
      taosMemoryFreeClear(pView->pVgroupList);
×
1323
      taosArrayDestroyEx(pView->pSmaIndexes, destroySmaIndex);
×
1324
      break;
×
1325
    }
1326
    case QUERY_NODE_WINDOW_OFFSET: {
×
1327
      SWindowOffsetNode* pWin = (SWindowOffsetNode*)pNode;
×
1328
      nodesDestroyNode(pWin->pStartOffset);
×
1329
      nodesDestroyNode(pWin->pEndOffset);
×
1330
      break;
×
1331
    }
1332
    case QUERY_NODE_RANGE_AROUND: {
×
1333
      SRangeAroundNode* pAround = (SRangeAroundNode*)pNode;
×
1334
      nodesDestroyNode(pAround->pInterval);
×
1335
      nodesDestroyNode(pAround->pRange);
×
1336
      break;
×
1337
    }
1338
    case QUERY_NODE_STREAM_NOTIFY_OPTIONS: {
×
1339
      SStreamNotifyOptions* pNotifyOptions = (SStreamNotifyOptions*)pNode;
×
1340
      nodesDestroyList(pNotifyOptions->pAddrUrls);
×
1341
      break;
×
1342
    }
1343
    case QUERY_NODE_SET_OPERATOR: {
127✔
1344
      SSetOperator* pStmt = (SSetOperator*)pNode;
127✔
1345
      nodesDestroyList(pStmt->pProjectionList);
127✔
1346
      nodesDestroyNode(pStmt->pLeft);
127✔
1347
      nodesDestroyNode(pStmt->pRight);
127✔
1348
      nodesDestroyList(pStmt->pOrderByList);
127✔
1349
      nodesDestroyNode(pStmt->pLimit);
127✔
1350
      break;
127✔
1351
    }
1352
    case QUERY_NODE_SELECT_STMT: {
10,084✔
1353
      SSelectStmt* pStmt = (SSelectStmt*)pNode;
10,084✔
1354
      nodesDestroyList(pStmt->pProjectionList);
10,084✔
1355
      nodesDestroyList(pStmt->pProjectionBindList);
10,086✔
1356
      nodesDestroyNode(pStmt->pFromTable);
10,086✔
1357
      nodesDestroyNode(pStmt->pWhere);
10,086✔
1358
      nodesDestroyList(pStmt->pPartitionByList);
10,086✔
1359
      nodesDestroyList(pStmt->pTags);
10,086✔
1360
      nodesDestroyNode(pStmt->pSubtable);
10,086✔
1361
      nodesDestroyNode(pStmt->pWindow);
10,086✔
1362
      nodesDestroyList(pStmt->pGroupByList);
10,086✔
1363
      nodesDestroyNode(pStmt->pHaving);
10,086✔
1364
      nodesDestroyNode(pStmt->pRange);
10,086✔
1365
      nodesDestroyNode(pStmt->pRangeAround);
10,086✔
1366
      nodesDestroyNode(pStmt->pEvery);
10,086✔
1367
      nodesDestroyNode(pStmt->pFill);
10,086✔
1368
      nodesDestroyList(pStmt->pOrderByList);
10,086✔
1369
      nodesDestroyNode((SNode*)pStmt->pLimit);
10,085✔
1370
      nodesDestroyNode((SNode*)pStmt->pSlimit);
10,084✔
1371
      nodesDestroyList(pStmt->pHint);
10,084✔
1372
      break;
10,084✔
1373
    }
1374
    case QUERY_NODE_VNODE_MODIFY_STMT: {
140,388✔
1375
      SVnodeModifyOpStmt* pStmt = (SVnodeModifyOpStmt*)pNode;
140,388✔
1376
      destroyVgDataBlockArray(pStmt->pDataBlocks);
140,388✔
1377
      taosMemoryFreeClear(pStmt->pTableMeta);
140,383✔
1378
      nodesDestroyNode(pStmt->pTagCond);
140,394✔
1379
      taosArrayDestroy(pStmt->pTableTag);
140,402✔
1380
      taosHashCleanup(pStmt->pVgroupsHashObj);
140,404✔
1381
      taosHashCleanup(pStmt->pSubTableHashObj);
140,407✔
1382
      taosHashCleanup(pStmt->pSuperTableHashObj);
140,413✔
1383
      taosHashCleanup(pStmt->pTableNameHashObj);
140,416✔
1384
      taosHashCleanup(pStmt->pDbFNameHashObj);
140,416✔
1385
      taosHashCleanup(pStmt->pTableCxtHashObj);
140,416✔
1386
      if (pStmt->freeHashFunc) {
140,417✔
1387
        pStmt->freeHashFunc(pStmt->pTableBlockHashObj);
105,086✔
1388
      }
1389
      if (pStmt->freeArrayFunc) {
140,414✔
1390
        pStmt->freeArrayFunc(pStmt->pVgDataBlocks);
105,083✔
1391
      }
1392
      tdDestroySVCreateTbReq(pStmt->pCreateTblReq);
140,417✔
1393
      taosMemoryFreeClear(pStmt->pCreateTblReq);
140,417✔
1394
      if (pStmt->freeStbRowsCxtFunc) {
140,417✔
1395
        pStmt->freeStbRowsCxtFunc(pStmt->pStbRowsCxt);
104,836✔
1396
      }
1397
      taosMemoryFreeClear(pStmt->pStbRowsCxt);
140,417✔
1398

1399
      taosMemoryFreeClear(pStmt->pCreateTbInfo);
140,417✔
1400

1401
      if (pStmt->destroyParseFileCxt) {
140,417✔
1402
        pStmt->destroyParseFileCxt(&pStmt->pParFileCxt);
×
1403
      }
1404

1405
      int32_t code = taosCloseFile(&pStmt->fp);
140,417✔
1406
      if (TSDB_CODE_SUCCESS != code) {
140,404✔
1407
        nodesError("failed to close file %s:%d", __func__, __LINE__);
×
1408
      }
1409
      break;
140,404✔
1410
    }
1411
    case QUERY_NODE_CREATE_DATABASE_STMT: {
434✔
1412
      SDatabaseOptions* pOptions = ((SCreateDatabaseStmt*)pNode)->pOptions;
434✔
1413
      taosMemoryFreeClear(pOptions->pDbCfg);
434✔
1414
      nodesDestroyNode((SNode*)pOptions);
434✔
1415
      break;
434✔
1416
    }
1417
    case QUERY_NODE_DROP_DATABASE_STMT:  // no pointer field
360✔
1418
      break;
360✔
1419
    case QUERY_NODE_ALTER_DATABASE_STMT: {
578✔
1420
      SDatabaseOptions* pOptions = ((SAlterDatabaseStmt*)pNode)->pOptions;
578✔
1421
      taosMemoryFreeClear(pOptions->pDbCfg);
578✔
1422
      nodesDestroyNode((SNode*)pOptions);
578✔
1423
      break;
578✔
1424
    }
1425
    case QUERY_NODE_FLUSH_DATABASE_STMT:  // no pointer field
103✔
1426
    case QUERY_NODE_TRIM_DATABASE_STMT:   // no pointer field
1427
      break;
103✔
1428
    case QUERY_NODE_S3MIGRATE_DATABASE_STMT:  // no pointer field
3✔
1429
      break;
3✔
1430
    case QUERY_NODE_CREATE_TABLE_STMT: {
374✔
1431
      SCreateTableStmt* pStmt = (SCreateTableStmt*)pNode;
374✔
1432
      nodesDestroyList(pStmt->pCols);
374✔
1433
      nodesDestroyList(pStmt->pTags);
374✔
1434
      nodesDestroyNode((SNode*)pStmt->pOptions);
374✔
1435
      break;
374✔
1436
    }
1437
    case QUERY_NODE_CREATE_SUBTABLE_CLAUSE: {
36,642✔
1438
      SCreateSubTableClause* pStmt = (SCreateSubTableClause*)pNode;
36,642✔
1439
      nodesDestroyList(pStmt->pSpecificTags);
36,642✔
1440
      nodesDestroyList(pStmt->pValsOfTags);
36,631✔
1441
      nodesDestroyNode((SNode*)pStmt->pOptions);
36,675✔
1442
      break;
36,674✔
1443
    }
1444
    case QUERY_NODE_CREATE_VIRTUAL_TABLE_STMT: {
×
1445
      SCreateVTableStmt* pStmt = (SCreateVTableStmt*)pNode;
×
1446
      nodesDestroyList(pStmt->pCols);
×
1447
      break;
×
1448
    }
1449
    case QUERY_NODE_CREATE_VIRTUAL_SUBTABLE_STMT: {
×
1450
      SCreateVSubTableStmt* pStmt = (SCreateVSubTableStmt*)pNode;
×
1451
      nodesDestroyList(pStmt->pSpecificColRefs);
×
1452
      nodesDestroyList(pStmt->pColRefs);
×
1453
      nodesDestroyList(pStmt->pSpecificTags);
×
1454
      nodesDestroyList(pStmt->pValsOfTags);
×
1455
      break;
×
1456
    }
1457
    case QUERY_NODE_CREATE_SUBTABLE_FROM_FILE_CLAUSE: {
×
1458
      SCreateSubTableFromFileClause* pStmt = (SCreateSubTableFromFileClause*)pNode;
×
1459
      nodesDestroyList(pStmt->pSpecificTags);
×
1460
      break;
×
1461
    }
1462
    case QUERY_NODE_CREATE_MULTI_TABLES_STMT:
34,282✔
1463
      nodesDestroyList(((SCreateMultiTablesStmt*)pNode)->pSubTables);
34,282✔
1464
      break;
34,327✔
1465
    case QUERY_NODE_DROP_TABLE_CLAUSE:  // no pointer field
708✔
1466
      break;
708✔
1467
    case QUERY_NODE_DROP_TABLE_STMT:
694✔
1468
      nodesDestroyList(((SDropTableStmt*)pNode)->pTables);
694✔
1469
      break;
694✔
1470
    case QUERY_NODE_DROP_SUPER_TABLE_STMT:
13✔
1471
    case QUERY_NODE_DROP_VIRTUAL_TABLE_STMT: // no pointer field
1472
      break;
13✔
1473
    case QUERY_NODE_ALTER_TABLE_STMT:
282✔
1474
    case QUERY_NODE_ALTER_SUPER_TABLE_STMT:
1475
    case QUERY_NODE_ALTER_VIRTUAL_TABLE_STMT: {
1476
      SAlterTableStmt* pStmt = (SAlterTableStmt*)pNode;
282✔
1477
      nodesDestroyNode((SNode*)pStmt->pOptions);
282✔
1478
      nodesDestroyNode((SNode*)pStmt->pVal);
282✔
1479
      if (pStmt->pNodeListTagValue != NULL) {
282✔
1480
        SNodeList* pNodeList = pStmt->pNodeListTagValue;
12✔
1481
        SNode*     pSubNode = NULL;
12✔
1482
        FOREACH(pSubNode, pNodeList) {
24✔
1483
          SAlterTableStmt* pSubAlterTable = (SAlterTableStmt*)pSubNode;
12✔
1484
          nodesDestroyNode((SNode*)pSubAlterTable->pOptions);
12✔
1485
          nodesDestroyNode((SNode*)pSubAlterTable->pVal);
12✔
1486
        }
1487
      }
1488
      break;
282✔
1489
    }
1490
    case QUERY_NODE_CREATE_USER_STMT: {
80✔
1491
      SCreateUserStmt* pStmt = (SCreateUserStmt*)pNode;
80✔
1492
      taosMemoryFree(pStmt->pIpRanges);
80✔
1493
      nodesDestroyList(pStmt->pNodeListIpRanges);
80✔
1494
      break;
80✔
1495
    }
1496
    case QUERY_NODE_ALTER_USER_STMT: {
65✔
1497
      SAlterUserStmt* pStmt = (SAlterUserStmt*)pNode;
65✔
1498
      taosMemoryFree(pStmt->pIpRanges);
65✔
1499
      nodesDestroyList(pStmt->pNodeListIpRanges);
65✔
1500
    }
1501
    case QUERY_NODE_DROP_USER_STMT:     // no pointer field
1,046✔
1502
    case QUERY_NODE_USE_DATABASE_STMT:  // no pointer field
1503
    case QUERY_NODE_CREATE_DNODE_STMT:  // no pointer field
1504
    case QUERY_NODE_DROP_DNODE_STMT:    // no pointer field
1505
    case QUERY_NODE_ALTER_DNODE_STMT:   // no pointer field
1506
    case QUERY_NODE_CREATE_ANODE_STMT:  // no pointer field
1507
    case QUERY_NODE_UPDATE_ANODE_STMT:  // no pointer field
1508
    case QUERY_NODE_DROP_ANODE_STMT:    // no pointer field
1509
      break;
1,046✔
1510
    case QUERY_NODE_CREATE_INDEX_STMT: {
45✔
1511
      SCreateIndexStmt* pStmt = (SCreateIndexStmt*)pNode;
45✔
1512
      nodesDestroyNode((SNode*)pStmt->pOptions);
45✔
1513
      nodesDestroyList(pStmt->pCols);
45✔
1514
      if (pStmt->pReq) {
45✔
1515
        tFreeSMCreateSmaReq(pStmt->pReq);
9✔
1516
        taosMemoryFreeClear(pStmt->pReq);
9✔
1517
      }
1518
      break;
45✔
1519
    }
1520
    case QUERY_NODE_DROP_INDEX_STMT:    // no pointer field
135✔
1521
    case QUERY_NODE_CREATE_QNODE_STMT:  // no pointer field
1522
    case QUERY_NODE_DROP_QNODE_STMT:    // no pointer field
1523
    case QUERY_NODE_CREATE_BNODE_STMT:  // no pointer field
1524
    case QUERY_NODE_DROP_BNODE_STMT:    // no pointer field
1525
    case QUERY_NODE_CREATE_SNODE_STMT:  // no pointer field
1526
    case QUERY_NODE_DROP_SNODE_STMT:    // no pointer field
1527
    case QUERY_NODE_CREATE_MNODE_STMT:  // no pointer field
1528
    case QUERY_NODE_DROP_MNODE_STMT:    // no pointer field
1529
      break;
135✔
1530
    case QUERY_NODE_CREATE_TOPIC_STMT:
130✔
1531
      nodesDestroyNode(((SCreateTopicStmt*)pNode)->pQuery);
130✔
1532
      nodesDestroyNode(((SCreateTopicStmt*)pNode)->pWhere);
130✔
1533
      break;
130✔
1534
    case QUERY_NODE_DROP_TOPIC_STMT:   // no pointer field
134✔
1535
    case QUERY_NODE_DROP_CGROUP_STMT:  // no pointer field
1536
    case QUERY_NODE_ALTER_LOCAL_STMT:  // no pointer field
1537
      break;
134✔
1538
    case QUERY_NODE_EXPLAIN_STMT: {
57✔
1539
      SExplainStmt* pStmt = (SExplainStmt*)pNode;
57✔
1540
      nodesDestroyNode((SNode*)pStmt->pOptions);
57✔
1541
      nodesDestroyNode(pStmt->pQuery);
57✔
1542
      break;
57✔
1543
    }
1544
    case QUERY_NODE_DESCRIBE_STMT:
341✔
1545
      taosMemoryFree(((SDescribeStmt*)pNode)->pMeta);
341✔
1546
      break;
341✔
1547
    case QUERY_NODE_RESET_QUERY_CACHE_STMT:  // no pointer field
34✔
1548
      break;
34✔
1549
    case QUERY_NODE_COMPACT_DATABASE_STMT: {
53✔
1550
      SCompactDatabaseStmt* pStmt = (SCompactDatabaseStmt*)pNode;
53✔
1551
      nodesDestroyNode(pStmt->pStart);
53✔
1552
      nodesDestroyNode(pStmt->pEnd);
53✔
1553
      break;
53✔
1554
    }
1555
    case QUERY_NODE_COMPACT_VGROUPS_STMT: {
×
1556
      SCompactVgroupsStmt* pStmt = (SCompactVgroupsStmt*)pNode;
×
1557
      nodesDestroyNode(pStmt->pDbName);
×
1558
      nodesDestroyList(pStmt->vgidList);
×
1559
      nodesDestroyNode(pStmt->pStart);
×
1560
      nodesDestroyNode(pStmt->pEnd);
×
1561
      break;
×
1562
    }
1563
    case QUERY_NODE_CREATE_FUNCTION_STMT:  // no pointer field
144✔
1564
    case QUERY_NODE_DROP_FUNCTION_STMT:    // no pointer field
1565
      break;
144✔
1566
    case QUERY_NODE_CREATE_STREAM_STMT: {
139✔
1567
      SCreateStreamStmt* pStmt = (SCreateStreamStmt*)pNode;
139✔
1568
      nodesDestroyNode((SNode*)pStmt->pOptions);
139✔
1569
      nodesDestroyNode(pStmt->pQuery);
139✔
1570
      nodesDestroyList(pStmt->pTags);
139✔
1571
      nodesDestroyNode(pStmt->pSubtable);
139✔
1572
      nodesDestroyNode((SNode*)pStmt->pNotifyOptions);
139✔
1573
      tFreeSCMCreateStreamReq(pStmt->pReq);
139✔
1574
      taosMemoryFreeClear(pStmt->pReq);
139✔
1575
      break;
139✔
1576
    }
1577
    case QUERY_NODE_DROP_STREAM_STMT:                     // no pointer field
118✔
1578
    case QUERY_NODE_PAUSE_STREAM_STMT:                    // no pointer field
1579
    case QUERY_NODE_RESUME_STREAM_STMT:                   // no pointer field
1580
    case QUERY_NODE_RESET_STREAM_STMT:                    // no pointer field
1581
    case QUERY_NODE_BALANCE_VGROUP_STMT:                  // no pointer field
1582
    case QUERY_NODE_ASSIGN_LEADER_STMT: 
1583
    case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:           // no pointer field
1584
    case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT:  // no pointer field
1585
    case QUERY_NODE_MERGE_VGROUP_STMT:                    // no pointer field
1586
      break;
118✔
1587
    case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
26✔
1588
      nodesDestroyList(((SRedistributeVgroupStmt*)pNode)->pDnodes);
26✔
1589
      break;
26✔
1590
    case QUERY_NODE_SPLIT_VGROUP_STMT:  // no pointer field
13✔
1591
    case QUERY_NODE_SYNCDB_STMT:        // no pointer field
1592
      break;
13✔
1593
    case QUERY_NODE_GRANT_STMT:
79✔
1594
      nodesDestroyNode(((SGrantStmt*)pNode)->pTagCond);
79✔
1595
      break;
79✔
1596
    case QUERY_NODE_REVOKE_STMT:
78✔
1597
      nodesDestroyNode(((SRevokeStmt*)pNode)->pTagCond);
78✔
1598
      break;
78✔
1599
    case QUERY_NODE_ALTER_CLUSTER_STMT:  // no pointer field
×
1600
      break;
×
1601
    case QUERY_NODE_SHOW_DNODES_STMT:
811✔
1602
    case QUERY_NODE_SHOW_MNODES_STMT:
1603
    case QUERY_NODE_SHOW_MODULES_STMT:
1604
    case QUERY_NODE_SHOW_QNODES_STMT:
1605
    case QUERY_NODE_SHOW_ANODES_STMT:
1606
    case QUERY_NODE_SHOW_ANODES_FULL_STMT:
1607
    case QUERY_NODE_SHOW_SNODES_STMT:
1608
    case QUERY_NODE_SHOW_BNODES_STMT:
1609
    case QUERY_NODE_SHOW_ARBGROUPS_STMT:
1610
    case QUERY_NODE_SHOW_CLUSTER_STMT:
1611
    case QUERY_NODE_SHOW_DATABASES_STMT:
1612
    case QUERY_NODE_SHOW_FUNCTIONS_STMT:
1613
    case QUERY_NODE_SHOW_INDEXES_STMT:
1614
    case QUERY_NODE_SHOW_STABLES_STMT:
1615
    case QUERY_NODE_SHOW_STREAMS_STMT:
1616
    case QUERY_NODE_SHOW_TABLES_STMT:
1617
    case QUERY_NODE_SHOW_VTABLES_STMT:
1618
    case QUERY_NODE_SHOW_USERS_STMT:
1619
    case QUERY_NODE_SHOW_USERS_FULL_STMT:
1620
    case QUERY_NODE_SHOW_LICENCES_STMT:
1621
    case QUERY_NODE_SHOW_VGROUPS_STMT:
1622
    case QUERY_NODE_SHOW_TOPICS_STMT:
1623
    case QUERY_NODE_SHOW_CONSUMERS_STMT:
1624
    case QUERY_NODE_SHOW_CONNECTIONS_STMT:
1625
    case QUERY_NODE_SHOW_QUERIES_STMT:
1626
    case QUERY_NODE_SHOW_VNODES_STMT:
1627
    case QUERY_NODE_SHOW_APPS_STMT:
1628
    case QUERY_NODE_SHOW_SCORES_STMT:
1629
    case QUERY_NODE_SHOW_VARIABLES_STMT:
1630
    case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT:
1631
    case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
1632
    case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT:
1633
    case QUERY_NODE_SHOW_TAGS_STMT:
1634
    case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT:
1635
    case QUERY_NODE_SHOW_VIEWS_STMT:
1636
    case QUERY_NODE_SHOW_GRANTS_FULL_STMT:
1637
    case QUERY_NODE_SHOW_GRANTS_LOGS_STMT:
1638
    case QUERY_NODE_SHOW_CLUSTER_MACHINES_STMT:
1639
    case QUERY_NODE_SHOW_ENCRYPTIONS_STMT:
1640
    case QUERY_NODE_SHOW_TSMAS_STMT:
1641
    case QUERY_NODE_SHOW_USAGE_STMT: {
1642
      SShowStmt* pStmt = (SShowStmt*)pNode;
811✔
1643
      nodesDestroyNode(pStmt->pDbName);
811✔
1644
      nodesDestroyNode(pStmt->pTbName);
809✔
1645
      break;
812✔
1646
    }
1647
    case QUERY_NODE_SHOW_TABLE_TAGS_STMT: {
22✔
1648
      SShowTableTagsStmt* pStmt = (SShowTableTagsStmt*)pNode;
22✔
1649
      nodesDestroyNode(pStmt->pDbName);
22✔
1650
      nodesDestroyNode(pStmt->pTbName);
22✔
1651
      nodesDestroyList(pStmt->pTags);
22✔
1652
      break;
22✔
1653
    }
1654
    case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
16✔
1655
      nodesDestroyNode(((SShowDnodeVariablesStmt*)pNode)->pDnodeId);
16✔
1656
      nodesDestroyNode(((SShowDnodeVariablesStmt*)pNode)->pLikePattern);
16✔
1657
      break;
16✔
1658
    case QUERY_NODE_SHOW_COMPACTS_STMT:
×
1659
      break;
×
1660
    case QUERY_NODE_SHOW_COMPACT_DETAILS_STMT: {
×
1661
      SShowCompactDetailsStmt* pStmt = (SShowCompactDetailsStmt*)pNode;
×
1662
      nodesDestroyNode(pStmt->pCompactId);
×
1663
      break;
×
1664
    }
1665
    case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT: {
×
1666
      SShowTransactionDetailsStmt* pStmt = (SShowTransactionDetailsStmt*)pNode;
×
1667
      nodesDestroyNode(pStmt->pTransactionId);
×
1668
      break;
×
1669
    }
1670
    case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
13✔
1671
      taosMemoryFreeClear(((SShowCreateDatabaseStmt*)pNode)->pCfg);
13✔
1672
      break;
13✔
1673
    case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
73✔
1674
    case QUERY_NODE_SHOW_CREATE_VTABLE_STMT:
1675
    case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
1676
      taosMemoryFreeClear(((SShowCreateTableStmt*)pNode)->pDbCfg);
73✔
1677
      destroyTableCfg((STableCfg*)(((SShowCreateTableStmt*)pNode)->pTableCfg));
73✔
1678
      break;
73✔
1679
    case QUERY_NODE_SHOW_CREATE_VIEW_STMT:        // no pointer field
12✔
1680
    case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT:  // no pointer field
1681
    case QUERY_NODE_KILL_CONNECTION_STMT:         // no pointer field
1682
    case QUERY_NODE_KILL_QUERY_STMT:              // no pointer field
1683
    case QUERY_NODE_KILL_TRANSACTION_STMT:        // no pointer field
1684
    case QUERY_NODE_KILL_COMPACT_STMT:            // no pointer field
1685
      break;
12✔
1686
    case QUERY_NODE_DELETE_STMT: {
265✔
1687
      SDeleteStmt* pStmt = (SDeleteStmt*)pNode;
265✔
1688
      nodesDestroyNode(pStmt->pFromTable);
265✔
1689
      nodesDestroyNode(pStmt->pWhere);
265✔
1690
      nodesDestroyNode(pStmt->pCountFunc);
265✔
1691
      nodesDestroyNode(pStmt->pFirstFunc);
265✔
1692
      nodesDestroyNode(pStmt->pLastFunc);
265✔
1693
      nodesDestroyNode(pStmt->pTagCond);
265✔
1694
      break;
265✔
1695
    }
1696
    case QUERY_NODE_INSERT_STMT: {
19✔
1697
      SInsertStmt* pStmt = (SInsertStmt*)pNode;
19✔
1698
      nodesDestroyNode(pStmt->pTable);
19✔
1699
      nodesDestroyList(pStmt->pCols);
19✔
1700
      nodesDestroyNode(pStmt->pQuery);
19✔
1701
      break;
19✔
1702
    }
1703
    case QUERY_NODE_QUERY: {
151,416✔
1704
      SQuery* pQuery = (SQuery*)pNode;
151,416✔
1705
      nodesDestroyNode(pQuery->pPrevRoot);
151,416✔
1706
      nodesDestroyNode(pQuery->pRoot);
151,414✔
1707
      nodesDestroyNode(pQuery->pPostRoot);
151,422✔
1708
      taosMemoryFreeClear(pQuery->pResSchema);
151,425✔
1709
      if (NULL != pQuery->pCmdMsg) {
151,427✔
1710
        taosMemoryFreeClear(pQuery->pCmdMsg->pMsg);
2,624✔
1711
        taosMemoryFreeClear(pQuery->pCmdMsg);
2,624✔
1712
      }
1713
      taosMemoryFreeClear(pQuery->pResExtSchema);
151,427✔
1714
      taosArrayDestroy(pQuery->pDbList);
151,427✔
1715
      taosArrayDestroy(pQuery->pTableList);
151,420✔
1716
      taosArrayDestroy(pQuery->pTargetTableList);
151,424✔
1717
      taosArrayDestroy(pQuery->pPlaceholderValues);
151,426✔
1718
      nodesDestroyNode(pQuery->pPrepareRoot);
151,427✔
1719
      break;
151,427✔
1720
    }
1721
    case QUERY_NODE_RESTORE_DNODE_STMT:  // no pointer field
52✔
1722
    case QUERY_NODE_RESTORE_QNODE_STMT:  // no pointer field
1723
    case QUERY_NODE_RESTORE_MNODE_STMT:  // no pointer field
1724
    case QUERY_NODE_RESTORE_VNODE_STMT:  // no pointer field
1725
      break;
52✔
1726
    case QUERY_NODE_CREATE_VIEW_STMT: {
×
1727
      SCreateViewStmt* pStmt = (SCreateViewStmt*)pNode;
×
1728
      taosMemoryFree(pStmt->pQuerySql);
×
1729
      tFreeSCMCreateViewReq(&pStmt->createReq);
×
1730
      nodesDestroyNode(pStmt->pQuery);
×
1731
      break;
×
1732
    }
1733
    case QUERY_NODE_DROP_VIEW_STMT:
×
1734
      break;
×
1735
    case QUERY_NODE_CREATE_TSMA_STMT: {
2✔
1736
      SCreateTSMAStmt* pStmt = (SCreateTSMAStmt*)pNode;
2✔
1737
      nodesDestroyNode((SNode*)pStmt->pOptions);
2✔
1738
      if (pStmt->pReq) {
2✔
1739
        tFreeSMCreateSmaReq(pStmt->pReq);
2✔
1740
        taosMemoryFreeClear(pStmt->pReq);
2✔
1741
      }
1742
      break;
2✔
1743
    }
1744
    case QUERY_NODE_LOGIC_PLAN_SCAN: {
16,772✔
1745
      SScanLogicNode* pLogicNode = (SScanLogicNode*)pNode;
16,772✔
1746
      destroyLogicNode((SLogicNode*)pLogicNode);
16,772✔
1747
      nodesDestroyList(pLogicNode->pScanCols);
16,770✔
1748
      nodesDestroyList(pLogicNode->pScanPseudoCols);
16,771✔
1749
      taosMemoryFreeClear(pLogicNode->pVgroupList);
16,771✔
1750
      nodesDestroyList(pLogicNode->pDynamicScanFuncs);
16,778✔
1751
      nodesDestroyNode(pLogicNode->pTagCond);
16,775✔
1752
      nodesDestroyNode(pLogicNode->pTagIndexCond);
16,775✔
1753
      taosArrayDestroyEx(pLogicNode->pSmaIndexes, destroySmaIndex);
16,777✔
1754
      nodesDestroyList(pLogicNode->pGroupTags);
16,771✔
1755
      nodesDestroyList(pLogicNode->pTags);
16,774✔
1756
      nodesDestroyNode(pLogicNode->pSubtable);
16,777✔
1757
      taosArrayDestroyEx(pLogicNode->pFuncTypes, destroyFuncParam);
16,778✔
1758
      taosArrayDestroyP(pLogicNode->pTsmaTargetTbVgInfo, NULL);
16,777✔
1759
      taosArrayDestroy(pLogicNode->pTsmaTargetTbInfo);
16,769✔
1760
      break;
16,772✔
1761
    }
1762
    case QUERY_NODE_LOGIC_PLAN_JOIN: {
120✔
1763
      SJoinLogicNode* pLogicNode = (SJoinLogicNode*)pNode;
120✔
1764
      destroyLogicNode((SLogicNode*)pLogicNode);
120✔
1765
      nodesDestroyNode(pLogicNode->pWindowOffset);
120✔
1766
      nodesDestroyNode(pLogicNode->pJLimit);
120✔
1767
      nodesDestroyNode(pLogicNode->addPrimEqCond);
120✔
1768
      nodesDestroyNode(pLogicNode->pPrimKeyEqCond);
120✔
1769
      nodesDestroyNode(pLogicNode->pColEqCond);
120✔
1770
      nodesDestroyNode(pLogicNode->pColOnCond);
120✔
1771
      nodesDestroyNode(pLogicNode->pTagEqCond);
120✔
1772
      nodesDestroyNode(pLogicNode->pTagOnCond);
120✔
1773
      nodesDestroyNode(pLogicNode->pFullOnCond);
120✔
1774
      nodesDestroyList(pLogicNode->pLeftEqNodes);
120✔
1775
      nodesDestroyList(pLogicNode->pRightEqNodes);
120✔
1776
      nodesDestroyNode(pLogicNode->pLeftOnCond);
120✔
1777
      nodesDestroyNode(pLogicNode->pRightOnCond);
120✔
1778
      break;
120✔
1779
    }
1780
    case QUERY_NODE_LOGIC_PLAN_VIRTUAL_TABLE_SCAN: {
×
1781
      SVirtualScanLogicNode * pLogicNode = (SVirtualScanLogicNode*)pNode;
×
1782
      destroyLogicNode((SLogicNode*)pLogicNode);
×
1783
      nodesDestroyList(pLogicNode->pScanCols);
×
1784
      nodesDestroyList(pLogicNode->pScanPseudoCols);
×
1785
      taosMemoryFreeClear(pLogicNode->pVgroupList);
×
1786
      break;
×
1787
    }
1788
    case QUERY_NODE_LOGIC_PLAN_AGG: {
11,462✔
1789
      SAggLogicNode* pLogicNode = (SAggLogicNode*)pNode;
11,462✔
1790
      destroyLogicNode((SLogicNode*)pLogicNode);
11,462✔
1791
      nodesDestroyList(pLogicNode->pAggFuncs);
11,468✔
1792
      nodesDestroyList(pLogicNode->pGroupKeys);
11,464✔
1793
      break;
11,464✔
1794
    }
1795
    case QUERY_NODE_LOGIC_PLAN_PROJECT: {
9,138✔
1796
      SProjectLogicNode* pLogicNode = (SProjectLogicNode*)pNode;
9,138✔
1797
      destroyLogicNode((SLogicNode*)pLogicNode);
9,138✔
1798
      nodesDestroyList(pLogicNode->pProjections);
9,139✔
1799
      break;
9,146✔
1800
    }
1801
    case QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY: {
309,869✔
1802
      SVnodeModifyLogicNode* pLogicNode = (SVnodeModifyLogicNode*)pNode;
309,869✔
1803
      destroyLogicNode((SLogicNode*)pLogicNode);
309,869✔
1804
      destroyVgDataBlockArray(pLogicNode->pDataBlocks);
309,951✔
1805
      // pVgDataBlocks is weak reference
1806
      nodesDestroyNode(pLogicNode->pAffectedRows);
310,004✔
1807
      nodesDestroyNode(pLogicNode->pStartTs);
310,007✔
1808
      nodesDestroyNode(pLogicNode->pEndTs);
310,004✔
1809
      taosMemoryFreeClear(pLogicNode->pVgroupList);
310,008✔
1810
      nodesDestroyList(pLogicNode->pInsertCols);
310,008✔
1811
      break;
309,968✔
1812
    }
1813
    case QUERY_NODE_LOGIC_PLAN_EXCHANGE:
2,336✔
1814
      destroyLogicNode((SLogicNode*)pNode);
2,336✔
1815
      break;
2,336✔
1816
    case QUERY_NODE_LOGIC_PLAN_MERGE: {
273✔
1817
      SMergeLogicNode* pLogicNode = (SMergeLogicNode*)pNode;
273✔
1818
      destroyLogicNode((SLogicNode*)pLogicNode);
273✔
1819
      nodesDestroyList(pLogicNode->pMergeKeys);
273✔
1820
      nodesDestroyList(pLogicNode->pInputs);
273✔
1821
      break;
273✔
1822
    }
1823
    case QUERY_NODE_LOGIC_PLAN_WINDOW: {
594✔
1824
      SWindowLogicNode* pLogicNode = (SWindowLogicNode*)pNode;
594✔
1825
      destroyLogicNode((SLogicNode*)pLogicNode);
594✔
1826
      nodesDestroyList(pLogicNode->pFuncs);
594✔
1827
      nodesDestroyNode(pLogicNode->pTspk);
594✔
1828
      nodesDestroyNode(pLogicNode->pTsEnd);
594✔
1829
      nodesDestroyNode(pLogicNode->pStateExpr);
594✔
1830
      nodesDestroyNode(pLogicNode->pStartCond);
594✔
1831
      nodesDestroyNode(pLogicNode->pEndCond);
594✔
1832
      break;
594✔
1833
    }
1834
    case QUERY_NODE_LOGIC_PLAN_FILL: {
80✔
1835
      SFillLogicNode* pLogicNode = (SFillLogicNode*)pNode;
80✔
1836
      destroyLogicNode((SLogicNode*)pLogicNode);
80✔
1837
      nodesDestroyNode(pLogicNode->pWStartTs);
80✔
1838
      nodesDestroyNode(pLogicNode->pValues);
80✔
1839
      nodesDestroyList(pLogicNode->pFillExprs);
80✔
1840
      nodesDestroyList(pLogicNode->pNotFillExprs);
80✔
1841
      nodesDestroyList(pLogicNode->pFillNullExprs);
80✔
1842
      break;
80✔
1843
    }
1844
    case QUERY_NODE_LOGIC_PLAN_SORT: {
482✔
1845
      SSortLogicNode* pLogicNode = (SSortLogicNode*)pNode;
482✔
1846
      destroyLogicNode((SLogicNode*)pLogicNode);
482✔
1847
      nodesDestroyList(pLogicNode->pSortKeys);
482✔
1848
      break;
482✔
1849
    }
1850
    case QUERY_NODE_LOGIC_PLAN_PARTITION: {
192✔
1851
      SPartitionLogicNode* pLogicNode = (SPartitionLogicNode*)pNode;
192✔
1852
      destroyLogicNode((SLogicNode*)pLogicNode);
192✔
1853
      nodesDestroyList(pLogicNode->pPartitionKeys);
192✔
1854
      nodesDestroyList(pLogicNode->pTags);
192✔
1855
      nodesDestroyNode(pLogicNode->pSubtable);
192✔
1856
      nodesDestroyList(pLogicNode->pAggFuncs);
192✔
1857
      break;
192✔
1858
    }
1859
    case QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC: {
122✔
1860
      SIndefRowsFuncLogicNode* pLogicNode = (SIndefRowsFuncLogicNode*)pNode;
122✔
1861
      destroyLogicNode((SLogicNode*)pLogicNode);
122✔
1862
      nodesDestroyList(pLogicNode->pFuncs);
122✔
1863
      break;
122✔
1864
    }
1865
    case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC: {
24✔
1866
      SInterpFuncLogicNode* pLogicNode = (SInterpFuncLogicNode*)pNode;
24✔
1867
      destroyLogicNode((SLogicNode*)pLogicNode);
24✔
1868
      nodesDestroyList(pLogicNode->pFuncs);
24✔
1869
      nodesDestroyNode(pLogicNode->pFillValues);
24✔
1870
      nodesDestroyNode(pLogicNode->pTimeSeries);
24✔
1871
      break;
24✔
1872
    }
1873
    case QUERY_NODE_LOGIC_PLAN_FORECAST_FUNC: {
×
1874
      SForecastFuncLogicNode* pLogicNode = (SForecastFuncLogicNode*)pNode;
×
1875
      destroyLogicNode((SLogicNode*)pLogicNode);
×
1876
      nodesDestroyList(pLogicNode->pFuncs);
×
1877
      break;
×
1878
    }
1879
    case QUERY_NODE_LOGIC_PLAN_GROUP_CACHE: {
×
1880
      SGroupCacheLogicNode* pLogicNode = (SGroupCacheLogicNode*)pNode;
×
1881
      destroyLogicNode((SLogicNode*)pLogicNode);
×
1882
      nodesDestroyList(pLogicNode->pGroupCols);
×
1883
      break;
×
1884
    }
1885
    case QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL: {
×
1886
      SDynQueryCtrlLogicNode* pLogicNode = (SDynQueryCtrlLogicNode*)pNode;
×
1887
      destroyLogicNode((SLogicNode*)pLogicNode);
×
1888
      if (pLogicNode->qType == DYN_QTYPE_VTB_SCAN) {
×
1889
        taosMemoryFreeClear(pLogicNode->vtbScan.pVgroupList);
×
1890
      }
1891
      break;
×
1892
    }
1893
    case QUERY_NODE_LOGIC_SUBPLAN: {
328,531✔
1894
      SLogicSubplan* pSubplan = (SLogicSubplan*)pNode;
328,531✔
1895
      nodesDestroyList(pSubplan->pChildren);
328,531✔
1896
      nodesDestroyNode((SNode*)pSubplan->pNode);
328,566✔
1897
      nodesClearList(pSubplan->pParents);
328,622✔
1898
      taosMemoryFreeClear(pSubplan->pVgroupList);
328,588✔
1899
      break;
328,588✔
1900
    }
1901
    case QUERY_NODE_LOGIC_PLAN:
161,338✔
1902
      nodesDestroyList(((SQueryLogicPlan*)pNode)->pTopSubplans);
161,338✔
1903
      break;
161,345✔
1904
    case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN:
1,539✔
1905
    case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
1906
    case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
1907
      destroyScanPhysiNode((SScanPhysiNode*)pNode);
1,539✔
1908
      break;
1,539✔
1909
    case QUERY_NODE_PHYSICAL_PLAN_VIRTUAL_TABLE_SCAN: {
×
1910
      SVirtualScanPhysiNode* pPhyNode = (SVirtualScanPhysiNode*)pNode;
×
1911
      destroyScanPhysiNode((SScanPhysiNode*)pNode);
×
1912
      nodesDestroyList(pPhyNode->pGroupTags);
×
1913
      nodesDestroyList(pPhyNode->pTargets);
×
1914
      nodesDestroyList(pPhyNode->pTags);
×
1915
      nodesDestroyNode(pPhyNode->pSubtable);
×
1916
      break;
×
1917
    }
1918
    case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
48✔
1919
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_COUNT_SCAN: {
1920
      SLastRowScanPhysiNode* pPhyNode = (SLastRowScanPhysiNode*)pNode;
48✔
1921
      destroyScanPhysiNode((SScanPhysiNode*)pNode);
48✔
1922
      nodesDestroyList(pPhyNode->pGroupTags);
48✔
1923
      nodesDestroyList(pPhyNode->pTargets);
48✔
1924
      taosArrayDestroy(pPhyNode->pFuncTypes);
48✔
1925
      break;
48✔
1926
    }
1927
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
9,771✔
1928
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN:
1929
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
1930
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN: {
1931
      STableScanPhysiNode* pPhyNode = (STableScanPhysiNode*)pNode;
9,771✔
1932
      destroyScanPhysiNode((SScanPhysiNode*)pNode);
9,771✔
1933
      nodesDestroyList(pPhyNode->pDynamicScanFuncs);
9,771✔
1934
      nodesDestroyList(pPhyNode->pGroupTags);
9,772✔
1935
      nodesDestroyList(pPhyNode->pTags);
9,772✔
1936
      nodesDestroyNode(pPhyNode->pSubtable);
9,772✔
1937
      break;
9,772✔
1938
    }
1939
    case QUERY_NODE_PHYSICAL_PLAN_PROJECT: {
2,386✔
1940
      SProjectPhysiNode* pPhyNode = (SProjectPhysiNode*)pNode;
2,386✔
1941
      destroyPhysiNode((SPhysiNode*)pPhyNode);
2,386✔
1942
      nodesDestroyList(pPhyNode->pProjections);
2,386✔
1943
      break;
2,386✔
1944
    }
1945
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN: {
86✔
1946
      SSortMergeJoinPhysiNode* pPhyNode = (SSortMergeJoinPhysiNode*)pNode;
86✔
1947
      destroyPhysiNode((SPhysiNode*)pPhyNode);
86✔
1948
      nodesDestroyNode(pPhyNode->pWindowOffset);
86✔
1949
      nodesDestroyNode(pPhyNode->pJLimit);
86✔
1950
      nodesDestroyNode(pPhyNode->leftPrimExpr);
86✔
1951
      nodesDestroyNode(pPhyNode->rightPrimExpr);
86✔
1952
      nodesDestroyList(pPhyNode->pEqLeft);
86✔
1953
      nodesDestroyList(pPhyNode->pEqRight);
86✔
1954
      nodesDestroyNode(pPhyNode->pPrimKeyCond);
86✔
1955
      nodesDestroyNode(pPhyNode->pFullOnCond);
86✔
1956
      nodesDestroyList(pPhyNode->pTargets);
86✔
1957
      nodesDestroyNode(pPhyNode->pColEqCond);
86✔
1958
      nodesDestroyNode(pPhyNode->pColOnCond);
86✔
1959
      break;
86✔
1960
    }
1961
    case QUERY_NODE_PHYSICAL_PLAN_HASH_JOIN: {
×
1962
      SHashJoinPhysiNode* pPhyNode = (SHashJoinPhysiNode*)pNode;
×
1963
      destroyPhysiNode((SPhysiNode*)pPhyNode);
×
1964
      nodesDestroyNode(pPhyNode->pWindowOffset);
×
1965
      nodesDestroyNode(pPhyNode->pJLimit);
×
1966
      nodesDestroyList(pPhyNode->pOnLeft);
×
1967
      nodesDestroyList(pPhyNode->pOnRight);
×
1968
      nodesDestroyNode(pPhyNode->leftPrimExpr);
×
1969
      nodesDestroyNode(pPhyNode->rightPrimExpr);
×
1970
      nodesDestroyNode(pPhyNode->pLeftOnCond);
×
1971
      nodesDestroyNode(pPhyNode->pRightOnCond);
×
1972
      nodesDestroyNode(pPhyNode->pFullOnCond);
×
1973
      nodesDestroyList(pPhyNode->pTargets);
×
1974

1975
      nodesDestroyNode(pPhyNode->pPrimKeyCond);
×
1976
      nodesDestroyNode(pPhyNode->pColEqCond);
×
1977
      nodesDestroyNode(pPhyNode->pTagEqCond);
×
1978

1979
      break;
×
1980
    }
1981
    case QUERY_NODE_PHYSICAL_PLAN_HASH_AGG: {
6,716✔
1982
      SAggPhysiNode* pPhyNode = (SAggPhysiNode*)pNode;
6,716✔
1983
      destroyPhysiNode((SPhysiNode*)pPhyNode);
6,716✔
1984
      nodesDestroyList(pPhyNode->pExprs);
6,716✔
1985
      nodesDestroyList(pPhyNode->pAggFuncs);
6,716✔
1986
      nodesDestroyList(pPhyNode->pGroupKeys);
6,718✔
1987
      break;
6,718✔
1988
    }
1989
    case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE: {
2,157✔
1990
      SExchangePhysiNode* pPhyNode = (SExchangePhysiNode*)pNode;
2,157✔
1991
      destroyPhysiNode((SPhysiNode*)pPhyNode);
2,157✔
1992
      nodesDestroyList(pPhyNode->pSrcEndPoints);
2,157✔
1993
      break;
2,157✔
1994
    }
1995
    case QUERY_NODE_PHYSICAL_PLAN_MERGE: {
267✔
1996
      SMergePhysiNode* pPhyNode = (SMergePhysiNode*)pNode;
267✔
1997
      destroyPhysiNode((SPhysiNode*)pPhyNode);
267✔
1998
      nodesDestroyList(pPhyNode->pMergeKeys);
267✔
1999
      nodesDestroyList(pPhyNode->pTargets);
267✔
2000
      break;
267✔
2001
    }
2002
    case QUERY_NODE_PHYSICAL_PLAN_SORT:
217✔
2003
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT: {
2004
      SSortPhysiNode* pPhyNode = (SSortPhysiNode*)pNode;
217✔
2005
      destroyPhysiNode((SPhysiNode*)pPhyNode);
217✔
2006
      nodesDestroyList(pPhyNode->pExprs);
217✔
2007
      nodesDestroyList(pPhyNode->pSortKeys);
217✔
2008
      nodesDestroyList(pPhyNode->pTargets);
217✔
2009
      break;
217✔
2010
    }
2011
    case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL:
465✔
2012
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL:
2013
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL:
2014
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL:
2015
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL:
2016
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL:
2017
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_MID_INTERVAL:
2018
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_INTERVAL:
2019
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_FINAL_INTERVAL:
2020
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_SEMI_INTERVAL:
2021
      destroyWinodwPhysiNode((SWindowPhysiNode*)pNode);
465✔
2022
      break;
465✔
2023
    case QUERY_NODE_PHYSICAL_PLAN_FILL:
50✔
2024
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL: {
2025
      SFillPhysiNode* pPhyNode = (SFillPhysiNode*)pNode;
50✔
2026
      destroyPhysiNode((SPhysiNode*)pPhyNode);
50✔
2027
      nodesDestroyList(pPhyNode->pFillExprs);
50✔
2028
      nodesDestroyList(pPhyNode->pNotFillExprs);
50✔
2029
      nodesDestroyNode(pPhyNode->pWStartTs);
50✔
2030
      nodesDestroyNode(pPhyNode->pValues);
50✔
2031
      nodesDestroyList(pPhyNode->pFillNullExprs);
50✔
2032
      break;
50✔
2033
    }
2034
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_SESSION:
24✔
2035
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION:
2036
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION:
2037
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION:
2038
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_SESSION:
2039
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_FINAL_SESSION:
2040
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_SEMI_SESSION:
2041
      destroyWinodwPhysiNode((SWindowPhysiNode*)pNode);
24✔
2042
      break;
24✔
2043
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE:
18✔
2044
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE:
2045
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_STATE: {
2046
      SStateWinodwPhysiNode* pPhyNode = (SStateWinodwPhysiNode*)pNode;
18✔
2047
      destroyWinodwPhysiNode((SWindowPhysiNode*)pPhyNode);
18✔
2048
      nodesDestroyNode(pPhyNode->pStateKey);
18✔
2049
      break;
18✔
2050
    }
2051
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_EVENT:
6✔
2052
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_EVENT:
2053
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_EVENT: {
2054
      SEventWinodwPhysiNode* pPhyNode = (SEventWinodwPhysiNode*)pNode;
6✔
2055
      destroyWinodwPhysiNode((SWindowPhysiNode*)pPhyNode);
6✔
2056
      nodesDestroyNode(pPhyNode->pStartCond);
6✔
2057
      nodesDestroyNode(pPhyNode->pEndCond);
6✔
2058
      break;
6✔
2059
    }
2060
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_COUNT:
×
2061
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_COUNT:
2062
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_CONTINUE_COUNT: {
2063
      SCountWinodwPhysiNode* pPhyNode = (SCountWinodwPhysiNode*)pNode;
×
2064
      destroyWinodwPhysiNode((SWindowPhysiNode*)pPhyNode);
×
2065
      break;
×
2066
    }
2067
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_ANOMALY: {
×
2068
      SAnomalyWindowPhysiNode* pPhyNode = (SAnomalyWindowPhysiNode*)pNode;
×
2069
      destroyWinodwPhysiNode((SWindowPhysiNode*)pPhyNode);
×
2070
      nodesDestroyNode(pPhyNode->pAnomalyKey);
×
2071
      break;
×
2072
    }
2073
    case QUERY_NODE_PHYSICAL_PLAN_PARTITION: {
53✔
2074
      destroyPartitionPhysiNode((SPartitionPhysiNode*)pNode);
53✔
2075
      break;
53✔
2076
    }
2077
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION: {
5✔
2078
      SStreamPartitionPhysiNode* pPhyNode = (SStreamPartitionPhysiNode*)pNode;
5✔
2079
      destroyPartitionPhysiNode((SPartitionPhysiNode*)pPhyNode);
5✔
2080
      nodesDestroyList(pPhyNode->pTags);
5✔
2081
      nodesDestroyNode(pPhyNode->pSubtable);
5✔
2082
      break;
5✔
2083
    }
2084
    case QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC: {
47✔
2085
      SIndefRowsFuncPhysiNode* pPhyNode = (SIndefRowsFuncPhysiNode*)pNode;
47✔
2086
      destroyPhysiNode((SPhysiNode*)pPhyNode);
47✔
2087
      nodesDestroyList(pPhyNode->pExprs);
47✔
2088
      nodesDestroyList(pPhyNode->pFuncs);
47✔
2089
      break;
47✔
2090
    }
2091
    case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
12✔
2092
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERP_FUNC: {
2093
      SInterpFuncPhysiNode* pPhyNode = (SInterpFuncPhysiNode*)pNode;
12✔
2094
      destroyPhysiNode((SPhysiNode*)pPhyNode);
12✔
2095
      nodesDestroyList(pPhyNode->pExprs);
12✔
2096
      nodesDestroyList(pPhyNode->pFuncs);
12✔
2097
      nodesDestroyNode(pPhyNode->pFillValues);
12✔
2098
      nodesDestroyNode(pPhyNode->pTimeSeries);
12✔
2099
      break;
12✔
2100
    }
2101
    case QUERY_NODE_PHYSICAL_PLAN_FORECAST_FUNC: {
×
2102
      SForecastFuncPhysiNode* pPhyNode = (SForecastFuncPhysiNode*)pNode;
×
2103
      destroyPhysiNode((SPhysiNode*)pPhyNode);
×
2104
      nodesDestroyList(pPhyNode->pExprs);
×
2105
      nodesDestroyList(pPhyNode->pFuncs);
×
2106
      break;
×
2107
    }
2108
    case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
12,637✔
2109
      destroyDataSinkNode((SDataSinkNode*)pNode);
12,637✔
2110
      break;
12,632✔
2111
    case QUERY_NODE_PHYSICAL_PLAN_INSERT: {
155,372✔
2112
      SDataInserterNode* pSink = (SDataInserterNode*)pNode;
155,372✔
2113
      destroyDataSinkNode((SDataSinkNode*)pSink);
155,372✔
2114
      taosMemFreeClear(pSink->pData);
155,317✔
2115
      break;
155,328✔
2116
    }
2117
    case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT: {
9✔
2118
      SQueryInserterNode* pSink = (SQueryInserterNode*)pNode;
9✔
2119
      destroyDataSinkNode((SDataSinkNode*)pSink);
9✔
2120
      nodesDestroyList(pSink->pCols);
9✔
2121
      break;
9✔
2122
    }
2123
    case QUERY_NODE_PHYSICAL_PLAN_DELETE: {
317✔
2124
      SDataDeleterNode* pSink = (SDataDeleterNode*)pNode;
317✔
2125
      destroyDataSinkNode((SDataSinkNode*)pSink);
317✔
2126
      nodesDestroyNode(pSink->pAffectedRows);
317✔
2127
      nodesDestroyNode(pSink->pStartTs);
317✔
2128
      nodesDestroyNode(pSink->pEndTs);
317✔
2129
      break;
317✔
2130
    }
2131
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE: {
×
2132
      SGroupCachePhysiNode* pPhyNode = (SGroupCachePhysiNode*)pNode;
×
2133
      destroyPhysiNode((SPhysiNode*)pPhyNode);
×
2134
      nodesDestroyList(pPhyNode->pGroupCols);
×
2135
      break;
×
2136
    }
2137
    case QUERY_NODE_PHYSICAL_PLAN_DYN_QUERY_CTRL: {
×
2138
      SDynQueryCtrlPhysiNode* pPhyNode = (SDynQueryCtrlPhysiNode*)pNode;
×
2139
      if (pPhyNode->qType == DYN_QTYPE_VTB_SCAN) {
×
2140
        nodesDestroyList(pPhyNode->vtbScan.pScanCols);
×
2141
      }
2142
      destroyPhysiNode((SPhysiNode*)pPhyNode);
×
2143
      break;
×
2144
    }
2145
    case QUERY_NODE_PHYSICAL_SUBPLAN: {
168,558✔
2146
      SSubplan* pSubplan = (SSubplan*)pNode;
168,558✔
2147
      nodesClearList(pSubplan->pChildren);
168,558✔
2148
      nodesDestroyNode((SNode*)pSubplan->pNode);
168,578✔
2149
      nodesDestroyNode((SNode*)pSubplan->pDataSink);
168,573✔
2150
      nodesDestroyNode((SNode*)pSubplan->pTagCond);
168,573✔
2151
      nodesDestroyNode((SNode*)pSubplan->pTagIndexCond);
168,576✔
2152
      tSimpleHashCleanup(pSubplan->pVTables);
168,584✔
2153
      nodesClearList(pSubplan->pParents);
168,512✔
2154
      break;
168,532✔
2155
    }
2156
    case QUERY_NODE_PHYSICAL_PLAN:
161,428✔
2157
      nodesDestroyList(((SQueryPlan*)pNode)->pSubplans);
161,428✔
2158
      break;
161,436✔
2159
    default:
×
2160
      break;
×
2161
  }
2162
  nodesFree(pNode);
3,654,993✔
2163
  return;
3,650,165✔
2164
}
2165

2166
int32_t nodesMakeList(SNodeList** ppListOut) {
1,109,250✔
2167
  SNodeList* p = NULL;
1,109,250✔
2168
  int32_t    code = nodesCalloc(1, sizeof(SNodeList), (void**)&p);
1,109,250✔
2169
  if (TSDB_CODE_SUCCESS == code) {
1,109,232✔
2170
    *ppListOut = p;
1,109,354✔
2171
  }
2172
  return code;
1,109,232✔
2173
}
2174

2175
int32_t nodesListAppend(SNodeList* pList, SNode* pNode) {
2,085,769✔
2176
  if (NULL == pList || NULL == pNode) {
2,085,769✔
2177
    return TSDB_CODE_INVALID_PARA;
×
2178
  }
2179
  SListCell* p = NULL;
2,086,070✔
2180
  int32_t    code = nodesCalloc(1, sizeof(SListCell), (void**)&p);
2,086,070✔
2181
  if (TSDB_CODE_SUCCESS != code) {
2,085,030✔
2182
    return code;
×
2183
  }
2184
  p->pNode = pNode;
2,085,030✔
2185
  if (NULL == pList->pHead) {
2,085,030✔
2186
    pList->pHead = p;
1,067,178✔
2187
  }
2188
  if (NULL != pList->pTail) {
2,085,030✔
2189
    pList->pTail->pNext = p;
1,019,678✔
2190
  }
2191
  p->pPrev = pList->pTail;
2,085,030✔
2192
  pList->pTail = p;
2,085,030✔
2193
  ++(pList->length);
2,085,030✔
2194
  return TSDB_CODE_SUCCESS;
2,085,030✔
2195
}
2196

2197
int32_t nodesListStrictAppend(SNodeList* pList, SNode* pNode) {
1,363,003✔
2198
  if (NULL == pNode) {
1,363,003✔
2199
    return TSDB_CODE_INVALID_PARA;
×
2200
  }
2201
  int32_t code = nodesListAppend(pList, pNode);
1,363,003✔
2202
  if (TSDB_CODE_SUCCESS != code) {
1,362,031✔
2203
    nodesDestroyNode(pNode);
×
2204
  }
2205
  return code;
1,361,902✔
2206
}
2207

2208
int32_t nodesListMakeAppend(SNodeList** pList, SNode* pNode) {
14,004✔
2209
  if (NULL == *pList) {
14,004✔
2210
    int32_t code = nodesMakeList(pList);
9,991✔
2211
    if (NULL == *pList) {
9,992✔
2212
      return code;
×
2213
    }
2214
  }
2215
  return nodesListAppend(*pList, pNode);
14,005✔
2216
}
2217

2218
int32_t nodesListMakeStrictAppend(SNodeList** pList, SNode* pNode) {
773,948✔
2219
  if (NULL == *pList) {
773,948✔
2220
    int32_t code = nodesMakeList(pList);
177,893✔
2221
    if (NULL == *pList) {
177,868✔
2222
      return code;
×
2223
    }
2224
  }
2225
  return nodesListStrictAppend(*pList, pNode);
773,923✔
2226
}
2227

2228
int32_t nodesListAppendList(SNodeList* pTarget, SNodeList* pSrc) {
108✔
2229
  if (NULL == pTarget || NULL == pSrc) {
108✔
2230
    return TSDB_CODE_FAILED;
×
2231
  }
2232

2233
  if (NULL == pTarget->pHead) {
108✔
2234
    pTarget->pHead = pSrc->pHead;
29✔
2235
  } else {
2236
    pTarget->pTail->pNext = pSrc->pHead;
79✔
2237
    if (NULL != pSrc->pHead) {
79✔
2238
      pSrc->pHead->pPrev = pTarget->pTail;
79✔
2239
    }
2240
  }
2241
  pTarget->pTail = pSrc->pTail;
108✔
2242
  pTarget->length += pSrc->length;
108✔
2243
  nodesFree(pSrc);
108✔
2244

2245
  return TSDB_CODE_SUCCESS;
108✔
2246
}
2247

2248
int32_t nodesListStrictAppendList(SNodeList* pTarget, SNodeList* pSrc) {
2✔
2249
  if (NULL == pSrc) {
2✔
2250
    return TSDB_CODE_OUT_OF_MEMORY;
×
2251
  }
2252
  int32_t code = nodesListAppendList(pTarget, pSrc);
2✔
2253
  if (TSDB_CODE_SUCCESS != code) {
2✔
2254
    nodesDestroyList(pSrc);
×
2255
  }
2256
  return code;
2✔
2257
}
2258

2259
int32_t nodesListMakeStrictAppendList(SNodeList** pTarget, SNodeList* pSrc) {
2✔
2260
  if (NULL == *pTarget) {
2✔
2261
    int32_t code = nodesMakeList(pTarget);
1✔
2262
    if (NULL == *pTarget) {
1✔
2263
      return code;
×
2264
    }
2265
  }
2266
  return nodesListStrictAppendList(*pTarget, pSrc);
2✔
2267
}
2268

2269
int32_t nodesListMakePushFront(SNodeList** pList, SNode* pNode) {
38✔
2270
  if (*pList == NULL) {
38✔
2271
    int32_t code = nodesMakeList(pList);
38✔
2272
    if (*pList == NULL) {
38✔
2273
      return code;
×
2274
    }
2275
  }
2276
  return nodesListPushFront(*pList, pNode);
38✔
2277
}
2278

2279
int32_t nodesListPushFront(SNodeList* pList, SNode* pNode) {
95✔
2280
  if (NULL == pList || NULL == pNode) {
95✔
2281
    return TSDB_CODE_FAILED;
×
2282
  }
2283
  SListCell* p = NULL;
95✔
2284
  int32_t    code = nodesCalloc(1, sizeof(SListCell), (void**)&p);
95✔
2285
  if (TSDB_CODE_SUCCESS != code) {
95✔
2286
    return code;
×
2287
  }
2288
  p->pNode = pNode;
95✔
2289
  if (NULL != pList->pHead) {
95✔
2290
    pList->pHead->pPrev = p;
57✔
2291
    p->pNext = pList->pHead;
57✔
2292
  }
2293
  pList->pHead = p;
95✔
2294
  pList->pTail = pList->pTail ? pList->pTail : p;
95✔
2295
  ++(pList->length);
95✔
2296
  return TSDB_CODE_SUCCESS;
95✔
2297
}
2298

2299
SListCell* nodesListErase(SNodeList* pList, SListCell* pCell) {
1,905,154✔
2300
  if (NULL == pCell->pPrev) {
1,905,154✔
2301
    pList->pHead = pCell->pNext;
1,900,716✔
2302
  } else {
2303
    pCell->pPrev->pNext = pCell->pNext;
4,438✔
2304
  }
2305
  if (NULL == pCell->pNext) {
1,905,154✔
2306
    pList->pTail = pCell->pPrev;
892,026✔
2307
  } else {
2308
    pCell->pNext->pPrev = pCell->pPrev;
1,013,128✔
2309
  }
2310
  SListCell* pNext = pCell->pNext;
1,905,154✔
2311
  nodesDestroyNode(pCell->pNode);
1,905,154✔
2312
  nodesFree(pCell);
1,906,165✔
2313
  --(pList->length);
1,905,195✔
2314
  return pNext;
1,905,195✔
2315
}
2316

2317
void nodesListInsertList(SNodeList* pTarget, SListCell* pPos, SNodeList* pSrc) {
4,632✔
2318
  if (NULL == pTarget || NULL == pPos || NULL == pSrc || NULL == pSrc->pHead) {
4,632✔
2319
    return;
×
2320
  }
2321

2322
  if (NULL == pPos->pPrev) {
4,635✔
2323
    pTarget->pHead = pSrc->pHead;
4,580✔
2324
  } else {
2325
    pPos->pPrev->pNext = pSrc->pHead;
55✔
2326
  }
2327
  pSrc->pHead->pPrev = pPos->pPrev;
4,635✔
2328
  pSrc->pTail->pNext = pPos;
4,635✔
2329
  pPos->pPrev = pSrc->pTail;
4,635✔
2330

2331
  pTarget->length += pSrc->length;
4,635✔
2332
  nodesFree(pSrc);
4,635✔
2333
}
2334

2335
void nodesListInsertListAfterPos(SNodeList* pTarget, SListCell* pPos, SNodeList* pSrc) {
×
2336
  if (NULL == pTarget || NULL == pPos || NULL == pSrc || NULL == pSrc->pHead) {
×
2337
    return;
×
2338
  }
2339

2340
  if (NULL == pPos->pNext) {
×
2341
    pTarget->pTail = pSrc->pHead;
×
2342
  } else {
2343
    pPos->pNext->pPrev = pSrc->pHead;
×
2344
  }
2345

2346
  pSrc->pHead->pPrev = pPos;
×
2347
  pSrc->pTail->pNext = pPos->pNext;
×
2348

2349
  pPos->pNext = pSrc->pHead;
×
2350

2351
  pTarget->length += pSrc->length;
×
2352
  nodesFree(pSrc);
×
2353
}
2354

2355
SNode* nodesListGetNode(SNodeList* pList, int32_t index) {
696,475✔
2356
  SNode* node;
2357
  FOREACH(node, pList) {
993,857✔
2358
    if (0 == index--) {
993,441✔
2359
      return node;
696,059✔
2360
    }
2361
  }
2362
  return NULL;
416✔
2363
}
2364

2365
SListCell* nodesListGetCell(SNodeList* pList, int32_t index) {
206✔
2366
  SNode* node;
2367
  FOREACH(node, pList) {
385✔
2368
    if (0 == index--) {
385✔
2369
      return cell;
206✔
2370
    }
2371
  }
2372
  return NULL;
×
2373
}
2374

2375
void nodesDestroyList(SNodeList* pList) {
3,030,480✔
2376
  if (NULL == pList) {
3,030,480✔
2377
    return;
2,115,916✔
2378
  }
2379

2380
  SListCell* pNext = pList->pHead;
914,564✔
2381
  while (NULL != pNext) {
2,815,822✔
2382
    pNext = nodesListErase(pList, pNext);
1,900,023✔
2383
  }
2384
  nodesFree(pList);
915,799✔
2385
}
2386

2387
void nodesClearList(SNodeList* pList) {
847,912✔
2388
  if (NULL == pList) {
847,912✔
2389
    return;
659,362✔
2390
  }
2391

2392
  SListCell* pNext = pList->pHead;
188,550✔
2393
  while (NULL != pNext) {
367,711✔
2394
    SListCell* tmp = pNext;
179,053✔
2395
    pNext = pNext->pNext;
179,053✔
2396
    nodesFree(tmp);
179,053✔
2397
  }
2398
  nodesFree(pList);
188,658✔
2399
}
2400

2401
void* nodesGetValueFromNode(SValueNode* pNode) {
17,371✔
2402
  switch (pNode->node.resType.type) {
17,371✔
2403
    case TSDB_DATA_TYPE_BOOL:
16,123✔
2404
    case TSDB_DATA_TYPE_TINYINT:
2405
    case TSDB_DATA_TYPE_SMALLINT:
2406
    case TSDB_DATA_TYPE_INT:
2407
    case TSDB_DATA_TYPE_BIGINT:
2408
    case TSDB_DATA_TYPE_TIMESTAMP:
2409
    case TSDB_DATA_TYPE_UTINYINT:
2410
    case TSDB_DATA_TYPE_USMALLINT:
2411
    case TSDB_DATA_TYPE_UINT:
2412
    case TSDB_DATA_TYPE_UBIGINT:
2413
    case TSDB_DATA_TYPE_FLOAT:
2414
    case TSDB_DATA_TYPE_DOUBLE:
2415
    case TSDB_DATA_TYPE_DECIMAL64:
2416
      return (void*)&pNode->typeData;
16,123✔
2417
    case TSDB_DATA_TYPE_NCHAR:
1,250✔
2418
    case TSDB_DATA_TYPE_VARCHAR:
2419
    case TSDB_DATA_TYPE_VARBINARY:
2420
    case TSDB_DATA_TYPE_JSON:
2421
    case TSDB_DATA_TYPE_GEOMETRY:
2422
    case TSDB_DATA_TYPE_DECIMAL:
2423
      return (void*)pNode->datum.p;
1,250✔
2424
    default:
×
2425
      break;
×
2426
  }
2427

2428
  return NULL;
×
2429
}
2430

2431
int32_t nodesSetValueNodeValue(SValueNode* pNode, void* value) {
330✔
2432
  switch (pNode->node.resType.type) {
330✔
2433
    case TSDB_DATA_TYPE_NULL:
×
2434
      break;
×
2435
    case TSDB_DATA_TYPE_BOOL:
72✔
2436
      pNode->datum.b = *(bool*)value;
72✔
2437
      *(bool*)&pNode->typeData = pNode->datum.b;
72✔
2438
      break;
72✔
2439
    case TSDB_DATA_TYPE_TINYINT:
1✔
2440
      pNode->datum.i = *(int8_t*)value;
1✔
2441
      *(int8_t*)&pNode->typeData = pNode->datum.i;
1✔
2442
      break;
1✔
2443
    case TSDB_DATA_TYPE_SMALLINT:
×
2444
      pNode->datum.i = *(int16_t*)value;
×
2445
      *(int16_t*)&pNode->typeData = pNode->datum.i;
×
2446
      break;
×
2447
    case TSDB_DATA_TYPE_INT:
74✔
2448
      pNode->datum.i = *(int32_t*)value;
74✔
2449
      *(int32_t*)&pNode->typeData = pNode->datum.i;
74✔
2450
      break;
74✔
2451
    case TSDB_DATA_TYPE_BIGINT:
57✔
2452
      pNode->datum.i = *(int64_t*)value;
57✔
2453
      *(int64_t*)&pNode->typeData = pNode->datum.i;
57✔
2454
      break;
57✔
2455
    case TSDB_DATA_TYPE_TIMESTAMP:
101✔
2456
      pNode->datum.i = *(int64_t*)value;
101✔
2457
      *(int64_t*)&pNode->typeData = pNode->datum.i;
101✔
2458
      break;
101✔
2459
    case TSDB_DATA_TYPE_UTINYINT:
×
2460
      pNode->datum.u = *(int8_t*)value;
×
2461
      *(int8_t*)&pNode->typeData = pNode->datum.u;
×
2462
      break;
×
2463
    case TSDB_DATA_TYPE_USMALLINT:
×
2464
      pNode->datum.u = *(int16_t*)value;
×
2465
      *(int16_t*)&pNode->typeData = pNode->datum.u;
×
2466
      break;
×
2467
    case TSDB_DATA_TYPE_UINT:
×
2468
      pNode->datum.u = *(int32_t*)value;
×
2469
      *(int32_t*)&pNode->typeData = pNode->datum.u;
×
2470
      break;
×
2471
    case TSDB_DATA_TYPE_UBIGINT:
1✔
2472
      pNode->datum.u = *(uint64_t*)value;
1✔
2473
      *(uint64_t*)&pNode->typeData = pNode->datum.u;
1✔
2474
      break;
1✔
2475
    case TSDB_DATA_TYPE_FLOAT:
×
2476
      pNode->datum.d = *(float*)value;
×
2477
      *(float*)&pNode->typeData = pNode->datum.d;
×
2478
      break;
×
2479
    case TSDB_DATA_TYPE_DOUBLE:
24✔
2480
      pNode->datum.d = *(double*)value;
24✔
2481
      *(double*)&pNode->typeData = pNode->datum.d;
24✔
2482
      break;
24✔
2483
    case TSDB_DATA_TYPE_NCHAR:
×
2484
    case TSDB_DATA_TYPE_VARCHAR:
2485
    case TSDB_DATA_TYPE_VARBINARY:
2486
    case TSDB_DATA_TYPE_JSON:
2487
    case TSDB_DATA_TYPE_BLOB:
2488
    case TSDB_DATA_TYPE_MEDIUMBLOB:
2489
    case TSDB_DATA_TYPE_GEOMETRY:
2490
      pNode->datum.p = (char*)value;
×
2491
      break;
×
2492
    case TSDB_DATA_TYPE_DECIMAL64:
×
2493
      pNode->datum.i = *(int64_t*)value;
×
2494
      pNode->typeData = *(int64_t*)value;
×
2495
      break;
×
2496
    case TSDB_DATA_TYPE_DECIMAL:
×
2497
      pNode->datum.p = (char*)value;
×
2498
      break;
×
2499
    default:
×
2500
      return TSDB_CODE_APP_ERROR;
×
2501
  }
2502

2503
  return TSDB_CODE_SUCCESS;
330✔
2504
}
2505

2506
char* nodesGetStrValueFromNode(SValueNode* pNode) {
6✔
2507
  switch (pNode->node.resType.type) {
6✔
2508
    case TSDB_DATA_TYPE_BOOL: {
×
2509
      void* buf = taosMemoryMalloc(MAX_NUM_STR_SIZE);
×
2510
      if (NULL == buf) {
×
2511
        return NULL;
×
2512
      }
2513

2514
      snprintf(buf, MAX_NUM_STR_SIZE, "%s", pNode->datum.b ? "true" : "false");
×
2515
      return buf;
×
2516
    }
2517
    case TSDB_DATA_TYPE_TINYINT:
4✔
2518
    case TSDB_DATA_TYPE_SMALLINT:
2519
    case TSDB_DATA_TYPE_INT:
2520
    case TSDB_DATA_TYPE_BIGINT:
2521
    case TSDB_DATA_TYPE_TIMESTAMP: {
2522
      void* buf = taosMemoryMalloc(MAX_NUM_STR_SIZE);
4✔
2523
      if (NULL == buf) {
4✔
2524
        return NULL;
×
2525
      }
2526

2527
      snprintf(buf, MAX_NUM_STR_SIZE, "%" PRId64, pNode->datum.i);
4✔
2528
      return buf;
4✔
2529
    }
2530
    case TSDB_DATA_TYPE_UTINYINT:
×
2531
    case TSDB_DATA_TYPE_USMALLINT:
2532
    case TSDB_DATA_TYPE_UINT:
2533
    case TSDB_DATA_TYPE_UBIGINT: {
2534
      void* buf = taosMemoryMalloc(MAX_NUM_STR_SIZE);
×
2535
      if (NULL == buf) {
×
2536
        return NULL;
×
2537
      }
2538

2539
      snprintf(buf, MAX_NUM_STR_SIZE, "%" PRIu64, pNode->datum.u);
×
2540
      return buf;
×
2541
    }
2542
    case TSDB_DATA_TYPE_FLOAT:
1✔
2543
    case TSDB_DATA_TYPE_DOUBLE: {
2544
      void* buf = taosMemoryMalloc(MAX_NUM_STR_SIZE);
1✔
2545
      if (NULL == buf) {
1✔
2546
        return NULL;
×
2547
      }
2548

2549
      snprintf(buf, MAX_NUM_STR_SIZE, "%e", pNode->datum.d);
1✔
2550
      return buf;
1✔
2551
    }
2552
    case TSDB_DATA_TYPE_NCHAR:
1✔
2553
    case TSDB_DATA_TYPE_VARCHAR:
2554
    case TSDB_DATA_TYPE_VARBINARY:
2555
    case TSDB_DATA_TYPE_GEOMETRY: {
2556
      int32_t bufSize = varDataLen(pNode->datum.p) + 2 + 1;
1✔
2557
      void*   buf = taosMemoryMalloc(bufSize);
1✔
2558
      if (NULL == buf) {
1✔
2559
        return NULL;
×
2560
      }
2561

2562
      snprintf(buf, bufSize, "'%s'", varDataVal(pNode->datum.p));
1✔
2563
      return buf;
1✔
2564
    }
2565
    default:
×
2566
      break;
×
2567
  }
2568

2569
  return NULL;
×
2570
}
2571

2572
bool nodesIsExprNode(const SNode* pNode) {
50,692✔
2573
  ENodeType type = nodeType(pNode);
50,692✔
2574
  return (QUERY_NODE_COLUMN == type || QUERY_NODE_VALUE == type || QUERY_NODE_OPERATOR == type ||
18,913✔
2575
          QUERY_NODE_FUNCTION == type || QUERY_NODE_LOGIC_CONDITION == type || QUERY_NODE_CASE_WHEN == type);
69,605✔
2576
}
2577

2578
bool nodesIsUnaryOp(const SOperatorNode* pOp) {
×
2579
  switch (pOp->opType) {
×
2580
    case OP_TYPE_MINUS:
×
2581
    case OP_TYPE_IS_NULL:
2582
    case OP_TYPE_IS_NOT_NULL:
2583
    case OP_TYPE_IS_TRUE:
2584
    case OP_TYPE_IS_FALSE:
2585
    case OP_TYPE_IS_UNKNOWN:
2586
    case OP_TYPE_IS_NOT_TRUE:
2587
    case OP_TYPE_IS_NOT_FALSE:
2588
    case OP_TYPE_IS_NOT_UNKNOWN:
2589
      return true;
×
2590
    default:
×
2591
      break;
×
2592
  }
2593
  return false;
×
2594
}
2595

2596
bool nodesIsArithmeticOp(const SOperatorNode* pOp) {
×
2597
  switch (pOp->opType) {
×
2598
    case OP_TYPE_ADD:
×
2599
    case OP_TYPE_SUB:
2600
    case OP_TYPE_MULTI:
2601
    case OP_TYPE_DIV:
2602
    case OP_TYPE_REM:
2603
      return true;
×
2604
    default:
×
2605
      break;
×
2606
  }
2607
  return false;
×
2608
}
2609

2610
bool nodesIsComparisonOp(const SOperatorNode* pOp) {
2,952✔
2611
  switch (pOp->opType) {
2,952✔
2612
    case OP_TYPE_GREATER_THAN:
2,948✔
2613
    case OP_TYPE_GREATER_EQUAL:
2614
    case OP_TYPE_LOWER_THAN:
2615
    case OP_TYPE_LOWER_EQUAL:
2616
    case OP_TYPE_EQUAL:
2617
    case OP_TYPE_NOT_EQUAL:
2618
    case OP_TYPE_IN:
2619
    case OP_TYPE_NOT_IN:
2620
    case OP_TYPE_LIKE:
2621
    case OP_TYPE_NOT_LIKE:
2622
    case OP_TYPE_MATCH:
2623
    case OP_TYPE_NMATCH:
2624
    case OP_TYPE_JSON_CONTAINS:
2625
    case OP_TYPE_IS_NULL:
2626
    case OP_TYPE_IS_NOT_NULL:
2627
    case OP_TYPE_IS_TRUE:
2628
    case OP_TYPE_IS_FALSE:
2629
    case OP_TYPE_IS_UNKNOWN:
2630
    case OP_TYPE_IS_NOT_TRUE:
2631
    case OP_TYPE_IS_NOT_FALSE:
2632
    case OP_TYPE_IS_NOT_UNKNOWN:
2633
      return true;
2,948✔
2634
    default:
4✔
2635
      break;
4✔
2636
  }
2637
  return false;
4✔
2638
}
2639

2640
bool nodesIsJsonOp(const SOperatorNode* pOp) {
×
2641
  switch (pOp->opType) {
×
2642
    case OP_TYPE_JSON_GET_VALUE:
×
2643
    case OP_TYPE_JSON_CONTAINS:
2644
      return true;
×
2645
    default:
×
2646
      break;
×
2647
  }
2648
  return false;
×
2649
}
2650

2651
bool nodesIsRegularOp(const SOperatorNode* pOp) {
2,959✔
2652
  switch (pOp->opType) {
2,959✔
2653
    case OP_TYPE_LIKE:
35✔
2654
    case OP_TYPE_NOT_LIKE:
2655
    case OP_TYPE_MATCH:
2656
    case OP_TYPE_NMATCH:
2657
      return true;
35✔
2658
    default:
2,924✔
2659
      break;
2,924✔
2660
  }
2661
  return false;
2,924✔
2662
}
2663

2664
bool nodesIsMatchRegularOp(const SOperatorNode* pOp) {
35✔
2665
  switch (pOp->opType) {
35✔
2666
    case OP_TYPE_MATCH:
×
2667
    case OP_TYPE_NMATCH:
2668
      return true;
×
2669
    default:
35✔
2670
      break;
35✔
2671
  }
2672
  return false;
35✔
2673
}
2674

2675
bool nodesIsBitwiseOp(const SOperatorNode* pOp) {
×
2676
  switch (pOp->opType) {
×
2677
    case OP_TYPE_BIT_AND:
×
2678
    case OP_TYPE_BIT_OR:
2679
      return true;
×
2680
    default:
×
2681
      break;
×
2682
  }
2683
  return false;
×
2684
}
2685

2686
typedef struct SCollectColumnsCxt {
2687
  int32_t         errCode;
2688
  const char*     pTableAlias;
2689
  SSHashObj*      pMultiTableAlias;
2690
  ECollectColType collectType;
2691
  SNodeList*      pCols;
2692
  SHashObj*       pColHash;
2693
} SCollectColumnsCxt;
2694

2695
static EDealRes doCollect(SCollectColumnsCxt* pCxt, SColumnNode* pCol, SNode* pNode) {
61,684✔
2696
  char    name[TSDB_TABLE_NAME_LEN + TSDB_COL_NAME_LEN];
2697
  int32_t len = 0;
61,684✔
2698
  if ('\0' == pCol->tableAlias[0]) {
61,684✔
2699
    len = tsnprintf(name, sizeof(name), "%s", pCol->colName);
58✔
2700
  } else {
2701
    len = tsnprintf(name, sizeof(name), "%s.%s", pCol->tableAlias, pCol->colName);
61,626✔
2702
  }
2703
  if (pCol->projRefIdx > 0) {
61,693✔
2704
    len = taosHashBinary(name, strlen(name));
34✔
2705
    len += tsnprintf(name + len, TSDB_TABLE_NAME_LEN + TSDB_COL_NAME_LEN - len, "_%d", pCol->projRefIdx);
34✔
2706
  }
2707
  SNode** pNodeFound = taosHashGet(pCxt->pColHash, name, len);
61,693✔
2708
  if (pNodeFound == NULL) {
61,669✔
2709
    pCxt->errCode = taosHashPut(pCxt->pColHash, name, len, &pNode, POINTER_BYTES);
42,964✔
2710
    if (TSDB_CODE_SUCCESS == pCxt->errCode) {
43,004✔
2711
      SNode* pNew = NULL;
43,007✔
2712
      pCxt->errCode = nodesCloneNode(pNode, &pNew);
43,007✔
2713
      if (TSDB_CODE_SUCCESS == pCxt->errCode) {
42,976✔
2714
        pCxt->errCode = nodesListStrictAppend(pCxt->pCols, pNew);
42,975✔
2715
      }
2716
    }
2717
    return (TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_IGNORE_CHILD : DEAL_RES_ERROR);
42,988✔
2718
  }
2719
  return DEAL_RES_CONTINUE;
18,705✔
2720
}
2721

2722
static bool isCollectType(ECollectColType collectType, EColumnType colType) {
116,471✔
2723
  return COLLECT_COL_TYPE_ALL == collectType
2724
             ? true
2725
             : (COLLECT_COL_TYPE_TAG == collectType ? COLUMN_TYPE_TAG == colType
170,784✔
2726
                                                    : (COLUMN_TYPE_TAG != colType && COLUMN_TYPE_TBNAME != colType));
54,313✔
2727
}
2728

2729
static EDealRes collectColumns(SNode* pNode, void* pContext) {
361,667✔
2730
  SCollectColumnsCxt* pCxt = (SCollectColumnsCxt*)pContext;
361,667✔
2731
  if (QUERY_NODE_COLUMN == nodeType(pNode)) {
361,667✔
2732
    SColumnNode* pCol = (SColumnNode*)pNode;
116,359✔
2733
    if (isCollectType(pCxt->collectType, pCol->colType) && 0 != strcmp(pCol->colName, "*") &&
116,359✔
2734
        (NULL == pCxt->pTableAlias || 0 == strcmp(pCxt->pTableAlias, pCol->tableAlias))) {
61,804✔
2735
      return doCollect(pCxt, pCol, pNode);
61,519✔
2736
    }
2737
  }
2738
  return DEAL_RES_CONTINUE;
300,150✔
2739
}
2740

2741
static EDealRes collectColumnsExt(SNode* pNode, void* pContext) {
154✔
2742
  SCollectColumnsCxt* pCxt = (SCollectColumnsCxt*)pContext;
154✔
2743
  if (QUERY_NODE_COLUMN == nodeType(pNode)) {
154✔
2744
    SColumnNode* pCol = (SColumnNode*)pNode;
107✔
2745
    if (isCollectType(pCxt->collectType, pCol->colType) && 0 != strcmp(pCol->colName, "*") &&
107✔
2746
        (NULL == pCxt->pMultiTableAlias ||
107✔
2747
         NULL != (pCxt->pTableAlias =
107✔
2748
                      tSimpleHashGet(pCxt->pMultiTableAlias, pCol->tableAlias, strlen(pCol->tableAlias))))) {
107✔
2749
      return doCollect(pCxt, pCol, pNode);
107✔
2750
    }
2751
  }
2752
  return DEAL_RES_CONTINUE;
47✔
2753
}
2754

2755
int32_t nodesCollectColumns(SSelectStmt* pSelect, ESqlClause clause, const char* pTableAlias, ECollectColType type,
14,022✔
2756
                            SNodeList** pCols) {
2757
  if (NULL == pSelect || NULL == pCols) {
14,022✔
2758
    return TSDB_CODE_FAILED;
×
2759
  }
2760
  SNodeList* pList = NULL;
14,028✔
2761
  if (!*pCols) {
14,028✔
2762
    int32_t code = nodesMakeList(&pList);
14,033✔
2763
    if (TSDB_CODE_SUCCESS != code) {
14,027✔
2764
      return code;
×
2765
    }
2766
  }
2767
  SCollectColumnsCxt cxt = {
42,078✔
2768
      .errCode = TSDB_CODE_SUCCESS,
2769
      .pTableAlias = pTableAlias,
2770
      .collectType = type,
2771
      .pCols = (NULL == *pCols ? pList : *pCols),
14,022✔
2772
      .pColHash = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK)};
14,022✔
2773
  if (NULL == cxt.pCols || NULL == cxt.pColHash) {
14,034✔
2774
    return TSDB_CODE_OUT_OF_MEMORY;
×
2775
  }
2776
  *pCols = NULL;
14,034✔
2777
  nodesWalkSelectStmt(pSelect, clause, collectColumns, &cxt);
14,034✔
2778
  taosHashCleanup(cxt.pColHash);
14,036✔
2779
  if (TSDB_CODE_SUCCESS != cxt.errCode) {
14,032✔
2780
    nodesDestroyList(cxt.pCols);
×
2781
    return cxt.errCode;
×
2782
  }
2783
  if (LIST_LENGTH(cxt.pCols) > 0) {
14,032✔
2784
    *pCols = cxt.pCols;
7,434✔
2785
  } else {
2786
    nodesDestroyList(cxt.pCols);
6,598✔
2787
  }
2788

2789
  return TSDB_CODE_SUCCESS;
14,032✔
2790
}
2791

2792
int32_t nodesCollectColumnsExt(SSelectStmt* pSelect, ESqlClause clause, SSHashObj* pMultiTableAlias,
38✔
2793
                               ECollectColType type, SNodeList** pCols) {
2794
  if (NULL == pSelect || NULL == pCols) {
38✔
2795
    return TSDB_CODE_FAILED;
×
2796
  }
2797

2798
  SNodeList* pList = NULL;
38✔
2799
  if (!*pCols) {
38✔
2800
    int32_t code = nodesMakeList(&pList);
38✔
2801
    if (TSDB_CODE_SUCCESS != code) {
38✔
2802
      return code;
×
2803
    }
2804
  }
2805

2806
  SCollectColumnsCxt cxt = {
114✔
2807
      .errCode = TSDB_CODE_SUCCESS,
2808
      .pTableAlias = NULL,
2809
      .pMultiTableAlias = pMultiTableAlias,
2810
      .collectType = type,
2811
      .pCols = (NULL == *pCols ? pList : *pCols),
38✔
2812
      .pColHash = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK)};
38✔
2813
  if (NULL == cxt.pCols || NULL == cxt.pColHash) {
38✔
2814
    return TSDB_CODE_OUT_OF_MEMORY;
×
2815
  }
2816
  *pCols = NULL;
38✔
2817
  nodesWalkSelectStmtImpl(pSelect, clause, collectColumnsExt, &cxt);
38✔
2818
  taosHashCleanup(cxt.pColHash);
38✔
2819
  if (TSDB_CODE_SUCCESS != cxt.errCode) {
38✔
2820
    nodesDestroyList(cxt.pCols);
×
2821
    return cxt.errCode;
×
2822
  }
2823
  if (LIST_LENGTH(cxt.pCols) > 0) {
38✔
2824
    *pCols = cxt.pCols;
38✔
2825
  } else {
2826
    nodesDestroyList(cxt.pCols);
×
2827
  }
2828

2829
  return TSDB_CODE_SUCCESS;
38✔
2830
}
2831

2832
int32_t nodesCollectColumnsFromNode(SNode* node, const char* pTableAlias, ECollectColType type, SNodeList** pCols) {
5,768✔
2833
  if (NULL == pCols) {
5,768✔
2834
    return TSDB_CODE_FAILED;
×
2835
  }
2836
  SNodeList* pList = NULL;
5,768✔
2837
  if (!*pCols) {
5,768✔
2838
    int32_t code = nodesMakeList(&pList);
2✔
2839
    if (TSDB_CODE_SUCCESS != code) {
2✔
2840
      return code;
×
2841
    }
2842
  }
2843

2844
  SCollectColumnsCxt cxt = {
17,306✔
2845
      .errCode = TSDB_CODE_SUCCESS,
2846
      .pTableAlias = pTableAlias,
2847
      .collectType = type,
2848
      .pCols = (NULL == *pCols ? pList : *pCols),
5,768✔
2849
      .pColHash = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK)};
5,768✔
2850
  if (NULL == cxt.pCols || NULL == cxt.pColHash) {
5,770✔
2851
    return TSDB_CODE_OUT_OF_MEMORY;
×
2852
  }
2853
  *pCols = NULL;
5,770✔
2854

2855
  nodesWalkExpr(node, collectColumns, &cxt);
5,770✔
2856

2857
  taosHashCleanup(cxt.pColHash);
5,770✔
2858
  if (TSDB_CODE_SUCCESS != cxt.errCode) {
5,769✔
2859
    nodesDestroyList(cxt.pCols);
×
2860
    return cxt.errCode;
×
2861
  }
2862
  if (LIST_LENGTH(cxt.pCols) > 0) {
5,769✔
2863
    *pCols = cxt.pCols;
5,741✔
2864
  } else {
2865
    nodesDestroyList(cxt.pCols);
28✔
2866
  }
2867

2868
  return TSDB_CODE_SUCCESS;
5,769✔
2869
}
2870

2871
typedef struct SCollectFuncsCxt {
2872
  int32_t         errCode;
2873
  char*           tableAlias;
2874
  FFuncClassifier classifier;
2875
  SNodeList*      pFuncs;
2876
} SCollectFuncsCxt;
2877

2878
static EDealRes collectFuncs(SNode* pNode, void* pContext) {
148,740✔
2879
  SCollectFuncsCxt* pCxt = (SCollectFuncsCxt*)pContext;
148,740✔
2880
  if (QUERY_NODE_FUNCTION == nodeType(pNode) && pCxt->classifier(((SFunctionNode*)pNode)->funcId)) {
148,740✔
2881
    SFunctionNode* pFunc = (SFunctionNode*)pNode;
18,119✔
2882
    if (FUNCTION_TYPE_TBNAME == pFunc->funcType && pCxt->tableAlias) {
18,119✔
2883
      SValueNode* pVal = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 0);
123✔
2884
      if (pVal && strcmp(pVal->literal, pCxt->tableAlias)) {
123✔
2885
        return DEAL_RES_CONTINUE;
×
2886
      }
2887
    }
2888

2889
    bool   bFound = false;
18,119✔
2890
    SNode* pn = NULL;
18,119✔
2891
    FOREACH(pn, pCxt->pFuncs) {
51,806✔
2892
      if (nodesEqualNode(pn, pNode)) {
33,760✔
2893
        bFound = true;
73✔
2894
        break;
73✔
2895
      }
2896
    }
2897
    if (!bFound) {
18,119✔
2898
      SNode* pNew = NULL;
18,040✔
2899
      pCxt->errCode = nodesCloneNode(pNode, &pNew);
18,040✔
2900
      if (TSDB_CODE_SUCCESS == pCxt->errCode) {
18,038✔
2901
        pCxt->errCode = nodesListStrictAppend(pCxt->pFuncs, pNew);
18,038✔
2902
      }
2903
    }
2904
    return (TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_IGNORE_CHILD : DEAL_RES_ERROR);
18,120✔
2905
  }
2906
  return DEAL_RES_CONTINUE;
130,620✔
2907
}
2908

2909
static uint32_t funcNodeHash(const char* pKey, uint32_t len) {
×
2910
  SExprNode* pExpr = *(SExprNode**)pKey;
×
2911
  return MurmurHash3_32(pExpr->aliasName, strlen(pExpr->aliasName));
×
2912
}
2913

2914
static int32_t funcNodeEqual(const void* pLeft, const void* pRight, size_t len) {
×
2915
  // if (0 != strcmp((*(const SExprNode**)pLeft)->aliasName, (*(const SExprNode**)pRight)->aliasName)) {
2916
  //   return 1;
2917
  // }
2918
  return nodesEqualNode(*(const SNode**)pLeft, *(const SNode**)pRight) ? 0 : 1;
×
2919
}
2920

2921
int32_t nodesCollectSelectFuncs(SSelectStmt* pSelect, ESqlClause clause, char* tableAlias, FFuncClassifier classifier,
110✔
2922
                                SNodeList* pFuncs) {
2923
  if (NULL == pSelect || NULL == pFuncs) {
110✔
2924
    return TSDB_CODE_FAILED;
×
2925
  }
2926

2927
  SCollectFuncsCxt cxt = {
110✔
2928
      .errCode = TSDB_CODE_SUCCESS, .classifier = classifier, .tableAlias = tableAlias, .pFuncs = pFuncs};
2929

2930
  nodesWalkSelectStmt(pSelect, clause, collectFuncs, &cxt);
110✔
2931
  return cxt.errCode;
110✔
2932
}
2933

2934
int32_t nodesCollectFuncs(SSelectStmt* pSelect, ESqlClause clause, char* tableAlias, FFuncClassifier classifier,
11,703✔
2935
                          SNodeList** pFuncs) {
2936
  if (NULL == pSelect || NULL == pFuncs) {
11,703✔
2937
    return TSDB_CODE_FAILED;
×
2938
  }
2939
  SNodeList* pList = NULL;
11,710✔
2940
  if (!*pFuncs) {
11,710✔
2941
    int32_t code = nodesMakeList(&pList);
11,338✔
2942
    if (TSDB_CODE_SUCCESS != code) {
11,339✔
2943
      return code;
×
2944
    }
2945
  }
2946
  SCollectFuncsCxt cxt = {.errCode = TSDB_CODE_SUCCESS,
23,422✔
2947
                          .classifier = classifier,
2948
                          .tableAlias = tableAlias,
2949
                          .pFuncs = (NULL == *pFuncs ? pList : *pFuncs)};
11,711✔
2950
  if (NULL == cxt.pFuncs) {
11,711✔
2951
    return TSDB_CODE_OUT_OF_MEMORY;
×
2952
  }
2953
  *pFuncs = NULL;
11,711✔
2954
  nodesWalkSelectStmt(pSelect, clause, collectFuncs, &cxt);
11,711✔
2955
  if (TSDB_CODE_SUCCESS == cxt.errCode) {
11,714✔
2956
    if (LIST_LENGTH(cxt.pFuncs) > 0) {
11,715✔
2957
      *pFuncs = cxt.pFuncs;
5,253✔
2958
    } else {
2959
      nodesDestroyList(cxt.pFuncs);
6,462✔
2960
    }
2961
  } else {
2962
    nodesDestroyList(cxt.pFuncs);
×
2963
  }
2964

2965
  return cxt.errCode;
11,713✔
2966
}
2967

2968
typedef struct SCollectSpecialNodesCxt {
2969
  int32_t    errCode;
2970
  ENodeType  type;
2971
  SNodeList* pNodes;
2972
} SCollectSpecialNodesCxt;
2973

2974
static EDealRes collectSpecialNodes(SNode* pNode, void* pContext) {
×
2975
  SCollectSpecialNodesCxt* pCxt = (SCollectSpecialNodesCxt*)pContext;
×
2976
  if (pCxt->type == nodeType(pNode)) {
×
2977
    SNode* pNew = NULL;
×
2978
    pCxt->errCode = nodesCloneNode(pNode, &pNew);
×
2979
    if (TSDB_CODE_SUCCESS == pCxt->errCode) {
×
2980
      pCxt->errCode = nodesListStrictAppend(pCxt->pNodes, pNew);
×
2981
    }
2982
    return (TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_IGNORE_CHILD : DEAL_RES_ERROR);
×
2983
  }
2984
  return DEAL_RES_CONTINUE;
×
2985
}
2986

2987
int32_t nodesCollectSpecialNodes(SSelectStmt* pSelect, ESqlClause clause, ENodeType type, SNodeList** ppNodes) {
×
2988
  if (NULL == pSelect || NULL == ppNodes) {
×
2989
    return TSDB_CODE_FAILED;
×
2990
  }
2991
  SCollectSpecialNodesCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .type = type, .pNodes = NULL};
×
2992
  if (!*ppNodes) {
×
2993
    cxt.errCode = nodesMakeList(&cxt.pNodes);
×
2994
  } else {
2995
    cxt.pNodes = *ppNodes;
×
2996
  }
2997
  if (NULL == cxt.pNodes) {
×
2998
    return cxt.errCode;
×
2999
  }
3000
  *ppNodes = NULL;
×
3001
  nodesWalkSelectStmt(pSelect, SQL_CLAUSE_GROUP_BY, collectSpecialNodes, &cxt);
×
3002
  if (TSDB_CODE_SUCCESS != cxt.errCode) {
×
3003
    nodesDestroyList(cxt.pNodes);
×
3004
    return cxt.errCode;
×
3005
  }
3006
  if (LIST_LENGTH(cxt.pNodes) > 0) {
×
3007
    *ppNodes = cxt.pNodes;
×
3008
  } else {
3009
    nodesDestroyList(cxt.pNodes);
×
3010
  }
3011

3012
  return TSDB_CODE_SUCCESS;
×
3013
}
3014

3015
static EDealRes hasColumn(SNode* pNode, void* pContext) {
30✔
3016
  if (QUERY_NODE_COLUMN == nodeType(pNode)) {
30✔
3017
    *(bool*)pContext = true;
30✔
3018
    return DEAL_RES_END;
30✔
3019
  }
3020
  return DEAL_RES_CONTINUE;
×
3021
}
3022

3023
bool nodesExprHasColumn(SNode* pNode) {
30✔
3024
  bool hasCol = false;
30✔
3025
  nodesWalkExprPostOrder(pNode, hasColumn, &hasCol);
30✔
3026
  return hasCol;
30✔
3027
}
3028

3029
bool nodesExprsHasColumn(SNodeList* pList) {
×
3030
  bool hasCol = false;
×
3031
  nodesWalkExprsPostOrder(pList, hasColumn, &hasCol);
×
3032
  return hasCol;
×
3033
}
3034

3035
char* nodesGetFillModeString(EFillMode mode) {
2✔
3036
  switch (mode) {
2✔
3037
    case FILL_MODE_NONE:
×
3038
      return "none";
×
3039
    case FILL_MODE_VALUE:
2✔
3040
      return "value";
2✔
3041
    case FILL_MODE_VALUE_F:
×
3042
      return "value_f";
×
3043
    case FILL_MODE_PREV:
×
3044
      return "prev";
×
3045
    case FILL_MODE_NULL:
×
3046
      return "null";
×
3047
    case FILL_MODE_NULL_F:
×
3048
      return "null_f";
×
3049
    case FILL_MODE_LINEAR:
×
3050
      return "linear";
×
3051
    case FILL_MODE_NEXT:
×
3052
      return "next";
×
3053
    default:
×
3054
      return "unknown";
×
3055
  }
3056
}
3057

3058
char* nodesGetNameFromColumnNode(SNode* pNode) {
7✔
3059
  if (NULL == pNode || QUERY_NODE_COLUMN != pNode->type) {
7✔
3060
    return "NULL";
×
3061
  }
3062

3063
  return ((SColumnNode*)pNode)->node.userAlias;
7✔
3064
}
3065

3066
int32_t nodesGetOutputNumFromSlotList(SNodeList* pSlots) {
14✔
3067
  if (NULL == pSlots || pSlots->length <= 0) {
14✔
3068
    return 0;
×
3069
  }
3070

3071
  SNode*  pNode = NULL;
14✔
3072
  int32_t num = 0;
14✔
3073
  FOREACH(pNode, pSlots) {
82✔
3074
    if (QUERY_NODE_SLOT_DESC != pNode->type) {
68✔
3075
      continue;
×
3076
    }
3077

3078
    SSlotDescNode* descNode = (SSlotDescNode*)pNode;
68✔
3079
    if (descNode->output) {
68✔
3080
      ++num;
67✔
3081
    }
3082
  }
3083

3084
  return num;
14✔
3085
}
3086

3087
int32_t nodesValueNodeToVariant(const SValueNode* pNode, SVariant* pVal) {
132✔
3088
  int32_t code = 0;
132✔
3089
  if (pNode->isNull) {
132✔
3090
    pVal->nType = TSDB_DATA_TYPE_NULL;
4✔
3091
    pVal->nLen = tDataTypes[TSDB_DATA_TYPE_NULL].bytes;
4✔
3092
    return code;
4✔
3093
  }
3094
  pVal->nType = pNode->node.resType.type;
128✔
3095
  pVal->nLen = pNode->node.resType.bytes;
128✔
3096
  switch (pNode->node.resType.type) {
128✔
3097
    case TSDB_DATA_TYPE_NULL:
×
3098
      break;
×
3099
    case TSDB_DATA_TYPE_BOOL:
×
3100
      pVal->i = pNode->datum.b;
×
3101
      break;
×
3102
    case TSDB_DATA_TYPE_TINYINT:
113✔
3103
    case TSDB_DATA_TYPE_SMALLINT:
3104
    case TSDB_DATA_TYPE_INT:
3105
    case TSDB_DATA_TYPE_BIGINT:
3106
    case TSDB_DATA_TYPE_TIMESTAMP:
3107
      pVal->i = pNode->datum.i;
113✔
3108
      break;
113✔
3109
    case TSDB_DATA_TYPE_UTINYINT:
×
3110
    case TSDB_DATA_TYPE_USMALLINT:
3111
    case TSDB_DATA_TYPE_UINT:
3112
    case TSDB_DATA_TYPE_UBIGINT:
3113
      pVal->u = pNode->datum.u;
×
3114
      break;
×
3115
    case TSDB_DATA_TYPE_FLOAT:
×
3116
      pVal->f = pNode->datum.d;
×
3117
      break;
×
3118
    case TSDB_DATA_TYPE_DOUBLE:
9✔
3119
      pVal->d = pNode->datum.d;
9✔
3120
      break;
9✔
3121
    case TSDB_DATA_TYPE_NCHAR:
6✔
3122
    case TSDB_DATA_TYPE_VARCHAR:
3123
    case TSDB_DATA_TYPE_VARBINARY:
3124
    case TSDB_DATA_TYPE_GEOMETRY:
3125
      pVal->pz = taosMemoryCalloc(1, pVal->nLen + 1);
6✔
3126
      if (pVal->pz) {
6✔
3127
        memcpy(pVal->pz, pNode->datum.p, varDataTLen(pNode->datum.p));
6✔
3128
      } else {
3129
        code = terrno;
×
3130
      }
3131
      break;
6✔
3132
    case TSDB_DATA_TYPE_JSON:
×
3133
      pVal->nLen = getJsonValueLen(pNode->datum.p);
×
3134
      pVal->pz = taosMemoryCalloc(1, pVal->nLen);
×
3135
      if (pVal->pz) {
×
3136
        memcpy(pVal->pz, pNode->datum.p, pVal->nLen);
×
3137
      } else {
3138
        code = terrno;
×
3139
      }
3140
      break;
×
3141
    case TSDB_DATA_TYPE_DECIMAL64:
×
3142
      pVal->d = pNode->datum.d;
×
3143
      break;
×
3144
    case TSDB_DATA_TYPE_DECIMAL:
×
3145
      pVal->pz = taosMemoryCalloc(1, pVal->nLen);
×
3146
      if (!pVal->pz) {
×
3147
        code = terrno;
×
3148
        break;
×
3149
      }
3150
      memcpy(pVal->pz, pNode->datum.p, pVal->nLen);
×
3151
      break;
×
3152
    case TSDB_DATA_TYPE_BLOB:
×
3153
      // todo
3154
    default:
3155
      break;
×
3156
  }
3157
  return code;
128✔
3158
}
3159

3160
int32_t nodesMergeConds(SNode** pDst, SNodeList** pSrc) {
6,366✔
3161
  if (NULL == *pSrc) {
6,366✔
3162
    return TSDB_CODE_SUCCESS;
5,031✔
3163
  }
3164

3165
  if (1 == LIST_LENGTH(*pSrc)) {
1,335✔
3166
    *pDst = nodesListGetNode(*pSrc, 0);
83✔
3167
    nodesClearList(*pSrc);
83✔
3168
  } else {
3169
    SLogicConditionNode* pLogicCond = NULL;
1,252✔
3170
    int32_t              code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogicCond);
1,252✔
3171
    if (TSDB_CODE_SUCCESS != code) {
1,253✔
3172
      return code;
×
3173
    }
3174
    pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL;
1,253✔
3175
    pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes;
1,253✔
3176
    pLogicCond->condType = LOGIC_COND_TYPE_AND;
1,253✔
3177
    pLogicCond->pParameterList = *pSrc;
1,253✔
3178
    *pDst = (SNode*)pLogicCond;
1,253✔
3179
  }
3180
  *pSrc = NULL;
1,336✔
3181

3182
  return TSDB_CODE_SUCCESS;
1,336✔
3183
}
3184

3185
const char* dataOrderStr(EDataOrderLevel order) {
×
3186
  switch (order) {
×
3187
    case DATA_ORDER_LEVEL_NONE:
×
3188
      return "no order required";
×
3189
    case DATA_ORDER_LEVEL_IN_BLOCK:
×
3190
      return "in-datablock order";
×
3191
    case DATA_ORDER_LEVEL_IN_GROUP:
×
3192
      return "in-group order";
×
3193
    case DATA_ORDER_LEVEL_GLOBAL:
×
3194
      return "global order";
×
3195
    default:
×
3196
      break;
×
3197
  }
3198
  return "unknown";
×
3199
}
3200

3201
int32_t nodesMakeValueNodeFromString(char* literal, SValueNode** ppValNode) {
76✔
3202
  int32_t     lenStr = strlen(literal);
76✔
3203
  SValueNode* pValNode = NULL;
76✔
3204
  int32_t     code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pValNode);
76✔
3205
  if (pValNode) {
76✔
3206
    pValNode->node.resType.type = TSDB_DATA_TYPE_VARCHAR;
76✔
3207
    pValNode->node.resType.bytes = lenStr + VARSTR_HEADER_SIZE;
76✔
3208
    char* p = taosMemoryMalloc(lenStr + 1 + VARSTR_HEADER_SIZE);
76✔
3209
    if (p == NULL) {
76✔
3210
      return terrno;
×
3211
    }
3212
    varDataSetLen(p, lenStr);
76✔
3213
    memcpy(varDataVal(p), literal, lenStr + 1);
76✔
3214
    pValNode->datum.p = p;
76✔
3215
    pValNode->literal = tstrdup(literal);
76✔
3216
    pValNode->translate = true;
76✔
3217
    pValNode->isNull = false;
76✔
3218
    *ppValNode = pValNode;
76✔
3219
  }
3220
  return code;
76✔
3221
}
3222

3223
int32_t nodesMakeValueNodeFromBool(bool b, SValueNode** ppValNode) {
×
3224
  SValueNode* pValNode = NULL;
×
3225
  int32_t     code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pValNode);
×
3226
  if (TSDB_CODE_SUCCESS == code) {
×
3227
    pValNode->node.resType.type = TSDB_DATA_TYPE_BOOL;
×
3228
    pValNode->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes;
×
3229
    code = nodesSetValueNodeValue(pValNode, &b);
×
3230
    if (TSDB_CODE_SUCCESS == code) {
×
3231
      pValNode->translate = true;
×
3232
      pValNode->isNull = false;
×
3233
      *ppValNode = pValNode;
×
3234
    } else {
3235
      nodesDestroyNode((SNode*)pValNode);
×
3236
    }
3237
  }
3238
  return code;
×
3239
}
3240

3241
int32_t nodesMakeValueNodeFromInt32(int32_t value, SNode** ppNode) {
×
3242
  SValueNode* pValNode = NULL;
×
3243
  int32_t     code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pValNode);
×
3244
  if (TSDB_CODE_SUCCESS == code) {
×
3245
    pValNode->node.resType.type = TSDB_DATA_TYPE_INT;
×
3246
    pValNode->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_INT].bytes;
×
3247
    code = nodesSetValueNodeValue(pValNode, &value);
×
3248
    if (TSDB_CODE_SUCCESS == code) {
×
3249
      pValNode->translate = true;
×
3250
      pValNode->isNull = false;
×
3251
      *ppNode = (SNode*)pValNode;
×
3252
    } else {
3253
      nodesDestroyNode((SNode*)pValNode);
×
3254
    }
3255
  }
3256
  return code;
×
3257
}
3258

3259
int32_t nodesMakeValueNodeFromInt64(int64_t value, SNode** ppNode) {
16✔
3260
  SValueNode* pValNode = NULL;
16✔
3261
  int32_t     code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pValNode);
16✔
3262
  if (TSDB_CODE_SUCCESS == code) {
16✔
3263
    pValNode->node.resType.type = TSDB_DATA_TYPE_BIGINT;
16✔
3264
    pValNode->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes;
16✔
3265
    code = nodesSetValueNodeValue(pValNode, &value);
16✔
3266
    if (TSDB_CODE_SUCCESS == code) {
16✔
3267
      pValNode->translate = true;
16✔
3268
      pValNode->isNull = false;
16✔
3269
      *ppNode = (SNode*)pValNode;
16✔
3270
    } else {
3271
      nodesDestroyNode((SNode*)pValNode);
×
3272
    }
3273
  }
3274
  return code;
16✔
3275
}
3276

3277

3278
bool nodesIsStar(SNode* pNode) {
13,318✔
3279
  return (QUERY_NODE_COLUMN == nodeType(pNode)) && ('\0' == ((SColumnNode*)pNode)->tableAlias[0]) &&
17,946✔
3280
         (0 == strcmp(((SColumnNode*)pNode)->colName, "*"));
4,628✔
3281
}
3282

3283
bool nodesIsTableStar(SNode* pNode) {
5,573✔
3284
  return (QUERY_NODE_COLUMN == nodeType(pNode)) && ('\0' != ((SColumnNode*)pNode)->tableAlias[0]) &&
8,085✔
3285
         (0 == strcmp(((SColumnNode*)pNode)->colName, "*"));
2,512✔
3286
}
3287

3288
void nodesSortList(SNodeList** pList, int32_t (*comp)(SNode* pNode1, SNode* pNode2)) {
1✔
3289
  if ((*pList)->length == 1) return;
1✔
3290

3291
  uint32_t   inSize = 1;
1✔
3292
  SListCell* pHead = (*pList)->pHead;
1✔
3293
  while (1) {
2✔
3294
    SListCell* p = pHead;
3✔
3295
    pHead = NULL;
3✔
3296
    SListCell* pTail = NULL;
3✔
3297

3298
    uint32_t nMerges = 0;
3✔
3299
    while (p) {
9✔
3300
      ++nMerges;
6✔
3301
      SListCell* q = p;
6✔
3302
      uint32_t   pSize = 0;
6✔
3303
      for (uint32_t i = 0; i < inSize; ++i) {
14✔
3304
        ++pSize;
10✔
3305
        q = q->pNext;
10✔
3306
        if (!q) {
10✔
3307
          break;
2✔
3308
        }
3309
      }
3310

3311
      uint32_t qSize = inSize;
6✔
3312

3313
      while (pSize > 0 || (qSize > 0 && q)) {
21✔
3314
        SListCell* pCell;
3315
        if (pSize == 0) {
15✔
3316
          pCell = q;
×
3317
          q = q->pNext;
×
3318
          --qSize;
×
3319
        } else if (qSize == 0 || !q) {
15✔
3320
          pCell = p;
10✔
3321
          p = p->pNext;
10✔
3322
          --pSize;
10✔
3323
        } else if (comp(q->pNode, p->pNode) >= 0) {
5✔
3324
          pCell = p;
×
3325
          p = p->pNext;
×
3326
          --pSize;
×
3327
        } else {
3328
          pCell = q;
5✔
3329
          q = q->pNext;
5✔
3330
          --qSize;
5✔
3331
        }
3332

3333
        if (pTail) {
15✔
3334
          pTail->pNext = pCell;
12✔
3335
          pCell->pPrev = pTail;
12✔
3336
        } else {
3337
          pHead = pCell;
3✔
3338
          pHead->pPrev = NULL;
3✔
3339
        }
3340
        pTail = pCell;
15✔
3341
      }
3342
      p = q;
6✔
3343
    }
3344
    pTail->pNext = NULL;
3✔
3345

3346
    if (nMerges <= 1) {
3✔
3347
      (*pList)->pHead = pHead;
1✔
3348
      (*pList)->pTail = pTail;
1✔
3349
      return;
1✔
3350
    }
3351
    inSize *= 2;
2✔
3352
  }
3353
}
3354

3355
static SNode* nodesListFindNode(SNodeList* pList, SNode* pNode) {
×
3356
  SNode* pFound = NULL;
×
3357
  FOREACH(pFound, pList) {
×
3358
    if (nodesEqualNode(pFound, pNode)) {
×
3359
      break;
×
3360
    }
3361
  }
3362
  return pFound;
×
3363
}
3364

3365
int32_t nodesListDeduplicate(SNodeList** ppList) {
187✔
3366
  if (!ppList || LIST_LENGTH(*ppList) <= 1) return TSDB_CODE_SUCCESS;
187✔
3367
  if (LIST_LENGTH(*ppList) == 2) {
19✔
3368
    SNode* pNode1 = nodesListGetNode(*ppList, 0);
19✔
3369
    SNode* pNode2 = nodesListGetNode(*ppList, 1);
19✔
3370
    if (nodesEqualNode(pNode1, pNode2)) {
19✔
3371
      SListCell* pCell = nodesListGetCell(*ppList, 1);
×
3372
      (void)nodesListErase(*ppList, pCell);
×
3373
    }
3374
    return TSDB_CODE_SUCCESS;
19✔
3375
  }
3376
  SNodeList* pTmp = NULL;
×
3377
  int32_t    code = nodesMakeList(&pTmp);
×
3378
  if (TSDB_CODE_SUCCESS == code) {
×
3379
    SNode* pNode = NULL;
×
3380
    FOREACH(pNode, *ppList) {
×
3381
      SNode* pFound = nodesListFindNode(pTmp, pNode);
×
3382
      if (NULL == pFound) {
×
3383
        code = nodesCloneNode(pNode, &pFound);
×
3384
        if (TSDB_CODE_SUCCESS == code) code = nodesListStrictAppend(pTmp, pFound);
×
3385
        if (TSDB_CODE_SUCCESS != code) break;
×
3386
      }
3387
    }
3388
  }
3389
  if (TSDB_CODE_SUCCESS == code) {
×
3390
    nodesDestroyList(*ppList);
×
3391
    *ppList = pTmp;
×
3392
  } else {
3393
    nodesDestroyList(pTmp);
×
3394
  }
3395
  return code;
×
3396
}
3397

3398
void rewriteExprAliasName(SExprNode* pNode, int64_t num) {
37,696✔
3399
  (void)tsnprintf(pNode->aliasName, TSDB_COL_NAME_LEN, "expr_%x", num);
37,696✔
3400
  return;
37,709✔
3401
}
3402

3403
bool isRelatedToOtherExpr(SExprNode* pExpr) {
7,150✔
3404
  return pExpr->relatedTo != 0;
7,150✔
3405
}
3406

3407
typedef struct SContainsColCxt {
3408
  bool       containsCol;
3409
} SContainsColCxt;
3410

3411
static EDealRes nodeContainsCol(SNode* pNode, void* pContext) {
120✔
3412
  SContainsColCxt* pCxt = pContext;
120✔
3413
  if (QUERY_NODE_COLUMN == nodeType(pNode)) {
120✔
3414
    pCxt->containsCol = true;
118✔
3415
    return DEAL_RES_END;
118✔
3416
  }
3417

3418
  return DEAL_RES_CONTINUE;
2✔
3419
}
3420

3421
bool nodesContainsColumn(SNode* pNode) {
120✔
3422
  if (NULL == pNode) {
120✔
3423
    return false;
×
3424
  }
3425

3426
  SContainsColCxt cxt = {0};
120✔
3427
  nodesWalkExpr(pNode, nodeContainsCol, &cxt);
120✔
3428
  
3429
  return cxt.containsCol;
120✔
3430
}
3431

3432
int32_t mergeNodeToLogic(SNode** pDst, SNode** pSrc) {
5✔
3433
  SLogicConditionNode* pLogicCond = NULL;
5✔
3434
  int32_t              code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogicCond);
5✔
3435
  if (NULL == pLogicCond) {
5✔
3436
    return code;
×
3437
  }
3438
  pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL;
5✔
3439
  pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes;
5✔
3440
  pLogicCond->condType = LOGIC_COND_TYPE_AND;
5✔
3441
  code = nodesListMakeAppend(&pLogicCond->pParameterList, *pSrc);
5✔
3442
  if (TSDB_CODE_SUCCESS == code) {
5✔
3443
    *pSrc = NULL;
5✔
3444
    code = nodesListMakeAppend(&pLogicCond->pParameterList, *pDst);
5✔
3445
  }
3446
  if (TSDB_CODE_SUCCESS == code) {
5✔
3447
    *pDst = (SNode*)pLogicCond;
5✔
3448
  } else {
3449
    nodesDestroyNode((SNode*)pLogicCond);
×
3450
  }
3451
  return code;
5✔
3452
}
3453

3454

3455
int32_t nodesMergeNode(SNode** pCond, SNode** pAdditionalCond) {
502✔
3456
  if (NULL == *pCond) {
502✔
3457
    TSWAP(*pCond, *pAdditionalCond);
497✔
3458
    return TSDB_CODE_SUCCESS;
497✔
3459
  }
3460

3461
  int32_t code = TSDB_CODE_SUCCESS;
5✔
3462
  if (QUERY_NODE_LOGIC_CONDITION == nodeType(*pCond) &&
5✔
3463
      LOGIC_COND_TYPE_AND == ((SLogicConditionNode*)*pCond)->condType) {
×
3464
    code = nodesListAppend(((SLogicConditionNode*)*pCond)->pParameterList, *pAdditionalCond);
×
3465
    if (TSDB_CODE_SUCCESS == code) {
×
3466
      *pAdditionalCond = NULL;
×
3467
    }
3468
  } else {
3469
    code = mergeNodeToLogic(pCond, pAdditionalCond);
5✔
3470
  }
3471
  
3472
  return code;
5✔
3473
}
3474

3475
void tFreeStreamVtbColName(void* param) {
×
3476
  if (NULL == param) {
×
3477
    return;
×
3478
  }
3479

3480
  SColIdName* pColId = (SColIdName*)param;
×
3481

3482
  taosMemoryFreeClear(pColId->colName);
×
3483
}
3484

3485
void tFreeStreamVtbOtbInfo(void* param) {
×
3486
  SArray** ppArray = (SArray**)param;
×
3487
  if (NULL == param || NULL == *ppArray) {
×
3488
    return;
×
3489
  }
3490

3491
  taosArrayDestroyEx(*ppArray, tFreeStreamVtbColName);
×
3492
}
3493

3494

3495
void tFreeStreamVtbVtbInfo(void* param) {
×
3496
  SSHashObj** ppHash = (SSHashObj**)param;
×
3497
  if (NULL == param || NULL == *ppHash) {
×
3498
    return;
×
3499
  }
3500

3501
  tSimpleHashCleanup(*ppHash);
×
3502
}
3503

3504

3505
void tFreeStreamVtbDbVgInfo(void* param) {
×
3506
  SSHashObj** ppHash = (SSHashObj**)param;
×
3507
  if (NULL == param || NULL == *ppHash) {
×
3508
    return;
×
3509
  }
3510

3511
  tSimpleHashCleanup(*ppHash);
×
3512
}
3513

3514

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