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

taosdata / TDengine / #3903

24 Apr 2025 11:36AM UTC coverage: 55.307% (+0.09%) from 55.213%
#3903

push

travis-ci

happyguoxy
Sync branches at 2025-04-24 19:35

175024 of 316459 relevant lines covered (55.31%)

1151858.11 hits per line

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

74.84
/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) {
3✔
68
  if (NULL == *ppSrc) {
3✔
69
    return TSDB_CODE_SUCCESS;
3✔
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,233✔
120
  SNodeMemChunk* pNewChunk = taosMemoryCalloc(1, sizeof(SNodeMemChunk) + pAllocator->chunkSize);
76,233✔
121
  if (NULL == pNewChunk) {
76,230✔
122
    if (pOutChunk) *pOutChunk = NULL;
×
123
    return terrno;
×
124
  }
125
  pNewChunk->pBuf = (char*)(pNewChunk + 1);
76,230✔
126
  pNewChunk->availableSize = pAllocator->chunkSize;
76,230✔
127
  pNewChunk->usedSize = 0;
76,230✔
128
  pNewChunk->pNext = NULL;
76,230✔
129
  if (NULL != pAllocator->pCurrChunk) {
76,230✔
130
    pAllocator->pCurrChunk->pNext = pNewChunk;
32,159✔
131
  }
132
  pAllocator->pCurrChunk = pNewChunk;
76,230✔
133
  if (NULL == pAllocator->pChunks) {
76,230✔
134
    pAllocator->pChunks = pNewChunk;
44,081✔
135
  }
136
  ++(pAllocator->chunkNum);
76,230✔
137
  if (pOutChunk) *pOutChunk = pNewChunk;
76,230✔
138
  return TSDB_CODE_SUCCESS;
76,230✔
139
}
140

141
static int32_t nodesCallocImpl(int32_t size, void** pOut) {
6,927,121✔
142
  if (NULL == g_pNodeAllocator) {
6,927,121✔
143
    *pOut = taosMemoryCalloc(1, size);
2,795,120✔
144
    if (!*pOut) return terrno;
2,795,325✔
145
    return TSDB_CODE_SUCCESS;
2,795,325✔
146
  }
147

148
  int32_t alignedSize = size;
4,132,001✔
149
#ifdef NO_UNALIGNED_ACCESS
150
  alignedSize = (size + 3) & (~3);
151
#endif
152
  if (g_pNodeAllocator->pCurrChunk->usedSize + alignedSize > g_pNodeAllocator->pCurrChunk->availableSize) {
4,132,001✔
153
    int32_t code = callocNodeChunk(g_pNodeAllocator, NULL);
32,166✔
154
    if (TSDB_CODE_SUCCESS != code) {
32,159✔
155
      *pOut = NULL;
×
156
      return code;
×
157
    }
158
  }
159
  void* p = g_pNodeAllocator->pCurrChunk->pBuf + g_pNodeAllocator->pCurrChunk->usedSize;
4,131,994✔
160
  g_pNodeAllocator->pCurrChunk->usedSize += alignedSize;
4,131,994✔
161
  *pOut = p;
4,131,994✔
162
  return TSDB_CODE_SUCCESS;
4,131,994✔
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,924,455✔
173
  void*   p = NULL;
6,924,455✔
174
  int32_t code = nodesCallocImpl(num * size + NODE_ALLOCATOR_HEAD_LEN, &p);
6,924,455✔
175
  if (TSDB_CODE_SUCCESS != code) {
6,930,661✔
176
    return code;
×
177
  }
178
  *(char*)p = (NULL != g_pNodeAllocator) ? 1 : 0;
6,930,661✔
179
  *pOut = (char*)p + NODE_ALLOCATOR_HEAD_LEN;
6,930,661✔
180
  return TSDB_CODE_SUCCESS;
6,930,661✔
181
}
182

183
void nodesFree(void* p) {
6,930,306✔
184
  char* ptr = (char*)p - NODE_ALLOCATOR_HEAD_LEN;
6,930,306✔
185
  if (0 == *ptr) {
6,930,306✔
186
    taosMemoryFree(ptr);
2,794,591✔
187
  }
188
  return;
6,931,400✔
189
}
190

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

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

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

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

218
  SNodeMemChunk* pChunk = pAllocator->pChunks;
44,100✔
219
  while (NULL != pChunk) {
120,383✔
220
    SNodeMemChunk* pTemp = pChunk->pNext;
76,280✔
221
    taosMemoryFree(pChunk);
76,280✔
222
    pChunk = pTemp;
76,283✔
223
  }
224
  (void)taosThreadMutexDestroy(&pAllocator->mutex);
44,103✔
225
  taosMemoryFree(pAllocator);
44,096✔
226
}
227

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

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

240
  return TSDB_CODE_SUCCESS;
420✔
241
}
242

243
void nodesDestroyAllocatorSet() {
420✔
244
  if (g_allocatorReqRefPool >= 0) {
420✔
245
    SNodeAllocator* pAllocator = taosIterateRef(g_allocatorReqRefPool, 0);
420✔
246
    int64_t         refId = 0;
420✔
247
    while (NULL != pAllocator) {
492✔
248
      refId = pAllocator->self;
72✔
249
      int32_t code = taosRemoveRef(g_allocatorReqRefPool, refId);
72✔
250
      if (TSDB_CODE_SUCCESS != code) {
72✔
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);
72✔
255
    }
256
    taosCloseRef(g_allocatorReqRefPool);
420✔
257
  }
258
}
420✔
259

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

274
int32_t nodesSimAcquireAllocator(int64_t allocatorId) {
154,076✔
275
  if (allocatorId <= 0) {
154,076✔
276
    return TSDB_CODE_SUCCESS;
110,063✔
277
  }
278

279
  SNodeAllocator* pAllocator = taosAcquireRef(g_allocatorReqRefPool, allocatorId);
44,013✔
280
  if (NULL == pAllocator) {
44,031✔
281
    return terrno;
5✔
282
  }
283
  return TSDB_CODE_SUCCESS;
44,026✔
284
}
285

286
int32_t nodesSimReleaseAllocator(int64_t allocatorId) {
154,082✔
287
  if (allocatorId <= 0) {
154,082✔
288
    return TSDB_CODE_SUCCESS;
110,053✔
289
  }
290

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

294
int32_t nodesAcquireAllocator(int64_t allocatorId) {
357,335✔
295
  if (allocatorId <= 0) {
357,335✔
296
    return TSDB_CODE_SUCCESS;
228,518✔
297
  }
298

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

308
int32_t nodesReleaseAllocator(int64_t allocatorId) {
357,383✔
309
  if (allocatorId <= 0) {
357,383✔
310
    return TSDB_CODE_SUCCESS;
228,757✔
311
  }
312

313
  if (NULL == g_pNodeAllocator) {
128,626✔
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;
128,626✔
321
  g_pNodeAllocator = NULL;
128,626✔
322
  (void)taosThreadMutexUnlock(&pAllocator->mutex);
128,626✔
323
  return taosReleaseRef(g_allocatorReqRefPool, allocatorId);
128,929✔
324
}
325

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

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

339
int64_t nodesReleaseAllocatorWeakRef(int64_t allocatorId) { return taosReleaseRef(g_allocatorReqRefPool, allocatorId); }
161,918✔
340

341
void nodesDestroyAllocator(int64_t allocatorId) {
154,364✔
342
  if (allocatorId <= 0) {
154,364✔
343
    return;
110,357✔
344
  }
345

346
  int32_t code = taosRemoveRef(g_allocatorReqRefPool, allocatorId);
44,007✔
347
  if (TSDB_CODE_SUCCESS != code) {
44,032✔
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,695,722✔
354
  SNode*  p = NULL;
3,695,722✔
355
  int32_t code = nodesCalloc(1, size, (void**)&p);
3,695,722✔
356
  if (TSDB_CODE_SUCCESS == code) {
3,696,976✔
357
    setNodeType(p, type);
3,697,007✔
358
    *ppNode = p;
3,697,007✔
359
  }
360
  return code;
3,696,976✔
361
}
362

363
int32_t nodesMakeNode(ENodeType type, SNode** ppNodeOut) {
3,696,229✔
364
  SNode*  pNode = NULL;
3,696,229✔
365
  int32_t code = 0;
3,696,229✔
366
  switch (type) {
3,696,229✔
367
    case QUERY_NODE_COLUMN:
701,102✔
368
      code = makeNode(type, sizeof(SColumnNode), &pNode);
701,102✔
369
      break;
701,065✔
370
    case QUERY_NODE_VALUE:
407,706✔
371
      code = makeNode(type, sizeof(SValueNode), &pNode);
407,706✔
372
      break;
407,682✔
373
    case QUERY_NODE_OPERATOR:
22,181✔
374
      code = makeNode(type, sizeof(SOperatorNode), &pNode);
22,181✔
375
      break;
22,182✔
376
    case QUERY_NODE_LOGIC_CONDITION:
5,355✔
377
      code = makeNode(type, sizeof(SLogicConditionNode), &pNode);
5,355✔
378
      break;
5,356✔
379
    case QUERY_NODE_FUNCTION:
116,153✔
380
      code = makeNode(type, sizeof(SFunctionNode), &pNode);
116,153✔
381
      break;
116,171✔
382
    case QUERY_NODE_REAL_TABLE:
83,888✔
383
      code = makeNode(type, sizeof(SRealTableNode), &pNode);
83,888✔
384
      break;
83,906✔
385
    case QUERY_NODE_VIRTUAL_TABLE:
×
386
      code = makeNode(type, sizeof(SVirtualTableNode), &pNode);
×
387
      break;
×
388
    case QUERY_NODE_TEMP_TABLE:
423✔
389
      code = makeNode(type, sizeof(STempTableNode), &pNode);
423✔
390
      break;
423✔
391
    case QUERY_NODE_JOIN_TABLE:
159✔
392
      code = makeNode(type, sizeof(SJoinTableNode), &pNode);
159✔
393
      break;
159✔
394
    case QUERY_NODE_GROUPING_SET:
1,607✔
395
      code = makeNode(type, sizeof(SGroupingSetNode), &pNode);
1,607✔
396
      break;
1,607✔
397
    case QUERY_NODE_ORDER_BY_EXPR:
2,529✔
398
      code = makeNode(type, sizeof(SOrderByExprNode), &pNode);
2,529✔
399
      break;
2,529✔
400
    case QUERY_NODE_LIMIT:
1,611✔
401
      code = makeNode(type, sizeof(SLimitNode), &pNode);
1,611✔
402
      break;
1,611✔
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:
612✔
410
      code = makeNode(type, sizeof(SIntervalWindowNode), &pNode);
612✔
411
      break;
612✔
412
    case QUERY_NODE_NODE_LIST:
167,020✔
413
      code = makeNode(type, sizeof(SNodeListNode), &pNode);
167,020✔
414
      break;
167,110✔
415
    case QUERY_NODE_FILL:
83✔
416
      code = makeNode(type, sizeof(SFillNode), &pNode);
83✔
417
      break;
83✔
418
    case QUERY_NODE_RAW_EXPR:
24,973✔
419
      code = makeNode(type, sizeof(SRawExprNode), &pNode);
24,973✔
420
      break;
24,974✔
421
    case QUERY_NODE_TARGET:
95,048✔
422
      code = makeNode(type, sizeof(STargetNode), &pNode);
95,048✔
423
      break;
95,076✔
424
    case QUERY_NODE_DATABLOCK_DESC:
38,236✔
425
      code = makeNode(type, sizeof(SDataBlockDescNode), &pNode);
38,236✔
426
      break;
38,257✔
427
    case QUERY_NODE_SLOT_DESC:
164,257✔
428
      code = makeNode(type, sizeof(SSlotDescNode), &pNode);
164,257✔
429
      break;
164,250✔
430
    case QUERY_NODE_COLUMN_DEF:
32,919✔
431
      code = makeNode(type, sizeof(SColumnDefNode), &pNode);
32,919✔
432
      break;
32,919✔
433
    case QUERY_NODE_DOWNSTREAM_SOURCE:
3,484✔
434
      code = makeNode(type, sizeof(SDownstreamSourceNode), &pNode);
3,484✔
435
      break;
3,484✔
436
    case QUERY_NODE_DATABASE_OPTIONS:
1,035✔
437
      code = makeNode(type, sizeof(SDatabaseOptions), &pNode);
1,035✔
438
      break;
1,035✔
439
    case QUERY_NODE_TABLE_OPTIONS:
36,638✔
440
      code = makeNode(type, sizeof(STableOptions), &pNode);
36,638✔
441
      break;
36,678✔
442
    case QUERY_NODE_COLUMN_OPTIONS:
31,646✔
443
      code = makeNode(type, sizeof(SColumnOptions), &pNode);
31,646✔
444
      break;
31,646✔
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,224✔
494
      code = makeNode(type, sizeof(SSelectStmt), &pNode);
10,224✔
495
      break;
10,224✔
496
    case QUERY_NODE_VNODE_MODIFY_STMT:
141,891✔
497
      code = makeNode(type, sizeof(SVnodeModifyOpStmt), &pNode);
141,891✔
498
      break;
141,927✔
499
    case QUERY_NODE_CREATE_DATABASE_STMT:
454✔
500
      code = makeNode(type, sizeof(SCreateDatabaseStmt), &pNode);
454✔
501
      break;
454✔
502
    case QUERY_NODE_DROP_DATABASE_STMT:
380✔
503
      code = makeNode(type, sizeof(SDropDatabaseStmt), &pNode);
380✔
504
      break;
380✔
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:
78✔
509
      code = makeNode(type, sizeof(SFlushDatabaseStmt), &pNode);
78✔
510
      break;
78✔
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:
401✔
518
      code = makeNode(type, sizeof(SCreateTableStmt), &pNode);
401✔
519
      break;
401✔
520
    case QUERY_NODE_CREATE_SUBTABLE_CLAUSE:
36,187✔
521
      code = makeNode(type, sizeof(SCreateSubTableClause), &pNode);
36,187✔
522
      break;
36,222✔
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:
33,858✔
533
      code = makeNode(type, sizeof(SCreateMultiTablesStmt), &pNode);
33,858✔
534
      break;
33,927✔
535
    case QUERY_NODE_DROP_TABLE_CLAUSE:
372✔
536
      code = makeNode(type, sizeof(SDropTableClause), &pNode);
372✔
537
      break;
372✔
538
    case QUERY_NODE_DROP_TABLE_STMT:
358✔
539
      code = makeNode(type, sizeof(SDropTableStmt), &pNode);
358✔
540
      break;
358✔
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:
337✔
548
    case QUERY_NODE_ALTER_SUPER_TABLE_STMT:
549
    case QUERY_NODE_ALTER_VIRTUAL_TABLE_STMT:
550
      code = makeNode(type, sizeof(SAlterTableStmt), &pNode);
337✔
551
      break;
337✔
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:
642✔
562
      code = makeNode(type, sizeof(SUseDatabaseStmt), &pNode);
642✔
563
      break;
642✔
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:
63✔
571
      code = makeNode(type, sizeof(SAlterDnodeStmt), &pNode);
63✔
572
      break;
63✔
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:
343✔
616
      code = makeNode(type, sizeof(SDescribeStmt), &pNode);
343✔
617
      break;
343✔
618
    case QUERY_NODE_RESET_QUERY_CACHE_STMT:
35✔
619
      code = makeNode(type, sizeof(SNode), &pNode);
35✔
620
      break;
35✔
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:
806✔
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);
806✔
721
      break;
805✔
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:
17✔
726
      code = makeNode(type, sizeof(SShowDnodeVariablesStmt), &pNode);
17✔
727
      break;
17✔
728
    case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
22✔
729
      code = makeNode(type, sizeof(SShowCreateDatabaseStmt), &pNode);
22✔
730
      break;
22✔
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:
266✔
764
      code = makeNode(type, sizeof(SDeleteStmt), &pNode);
266✔
765
      break;
266✔
766
    case QUERY_NODE_INSERT_STMT:
23✔
767
      code = makeNode(type, sizeof(SInsertStmt), &pNode);
23✔
768
      break;
23✔
769
    case QUERY_NODE_QUERY:
153,134✔
770
      code = makeNode(type, sizeof(SQuery), &pNode);
153,134✔
771
      break;
153,178✔
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:
17,112✔
794
      code = makeNode(type, sizeof(SScanLogicNode), &pNode);
17,112✔
795
      break;
17,118✔
796
    case QUERY_NODE_LOGIC_PLAN_JOIN:
135✔
797
      code = makeNode(type, sizeof(SJoinLogicNode), &pNode);
135✔
798
      break;
135✔
799
    case QUERY_NODE_LOGIC_PLAN_AGG:
11,692✔
800
      code = makeNode(type, sizeof(SAggLogicNode), &pNode);
11,692✔
801
      break;
11,719✔
802
    case QUERY_NODE_LOGIC_PLAN_PROJECT:
9,352✔
803
      code = makeNode(type, sizeof(SProjectLogicNode), &pNode);
9,352✔
804
      break;
9,365✔
805
    case QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY:
311,911✔
806
      code = makeNode(type, sizeof(SVnodeModifyLogicNode), &pNode);
311,911✔
807
      break;
312,041✔
808
    case QUERY_NODE_LOGIC_PLAN_EXCHANGE:
2,492✔
809
      code = makeNode(type, sizeof(SExchangeLogicNode), &pNode);
2,492✔
810
      break;
2,492✔
811
    case QUERY_NODE_LOGIC_PLAN_MERGE:
321✔
812
      code = makeNode(type, sizeof(SMergeLogicNode), &pNode);
321✔
813
      break;
321✔
814
    case QUERY_NODE_LOGIC_PLAN_WINDOW:
655✔
815
      code = makeNode(type, sizeof(SWindowLogicNode), &pNode);
655✔
816
      break;
655✔
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:
573✔
821
      code = makeNode(type, sizeof(SSortLogicNode), &pNode);
573✔
822
      break;
573✔
823
    case QUERY_NODE_LOGIC_PLAN_PARTITION:
197✔
824
      code = makeNode(type, sizeof(SPartitionLogicNode), &pNode);
197✔
825
      break;
197✔
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:
26✔
830
      code = makeNode(type, sizeof(SInterpFuncLogicNode), &pNode);
26✔
831
      break;
26✔
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:
2✔
836
      code = makeNode(type, sizeof(SGroupCacheLogicNode), &pNode);
2✔
837
      break;
2✔
838
    case QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL:
2✔
839
      code = makeNode(type, sizeof(SDynQueryCtrlLogicNode), &pNode);
2✔
840
      break;
2✔
841
    case QUERY_NODE_LOGIC_PLAN_VIRTUAL_TABLE_SCAN:
×
842
      code = makeNode(type, sizeof(SVirtualScanLogicNode), &pNode);
×
843
      break;
×
844
    case QUERY_NODE_LOGIC_SUBPLAN:
330,956✔
845
      code = makeNode(type, sizeof(SLogicSubplan), &pNode);
330,956✔
846
      break;
331,156✔
847
    case QUERY_NODE_LOGIC_PLAN:
162,306✔
848
      code = makeNode(type, sizeof(SQueryLogicPlan), &pNode);
162,306✔
849
      break;
162,424✔
850
    case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN:
139✔
851
      code = makeNode(type, sizeof(STagScanPhysiNode), &pNode);
139✔
852
      break;
139✔
853
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
9,623✔
854
      code = makeNode(type, sizeof(STableScanPhysiNode), &pNode);
9,623✔
855
      break;
9,642✔
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:
255✔
860
      code = makeNode(type, sizeof(STableMergeScanPhysiNode), &pNode);
255✔
861
      break;
255✔
862
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
259✔
863
      code = makeNode(type, sizeof(SStreamScanPhysiNode), &pNode);
259✔
864
      break;
259✔
865
    case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
1,487✔
866
      code = makeNode(type, sizeof(SSystemTableScanPhysiNode), &pNode);
1,487✔
867
      break;
1,487✔
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,545✔
878
      code = makeNode(type, sizeof(SProjectPhysiNode), &pNode);
2,545✔
879
      break;
2,545✔
880
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN:
98✔
881
      code = makeNode(type, sizeof(SSortMergeJoinPhysiNode), &pNode);
98✔
882
      break;
98✔
883
    case QUERY_NODE_PHYSICAL_PLAN_HASH_JOIN:
2✔
884
      code = makeNode(type, sizeof(SHashJoinPhysiNode), &pNode);
2✔
885
      break;
2✔
886
    case QUERY_NODE_PHYSICAL_PLAN_HASH_AGG:
6,973✔
887
      code = makeNode(type, sizeof(SAggPhysiNode), &pNode);
6,973✔
888
      break;
6,985✔
889
    case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE:
2,398✔
890
      code = makeNode(type, sizeof(SExchangePhysiNode), &pNode);
2,398✔
891
      break;
2,398✔
892
    case QUERY_NODE_PHYSICAL_PLAN_MERGE:
320✔
893
      code = makeNode(type, sizeof(SMergePhysiNode), &pNode);
320✔
894
      break;
320✔
895
    case QUERY_NODE_PHYSICAL_PLAN_SORT:
255✔
896
      code = makeNode(type, sizeof(SSortPhysiNode), &pNode);
255✔
897
      break;
255✔
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:
380✔
902
      code = makeNode(type, sizeof(SIntervalPhysiNode), &pNode);
380✔
903
      break;
380✔
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:
98✔
908
      code = makeNode(type, sizeof(SMergeAlignedIntervalPhysiNode), &pNode);
98✔
909
      break;
98✔
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:
54✔
969
      code = makeNode(type, sizeof(SPartitionPhysiNode), &pNode);
54✔
970
      break;
54✔
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:
13✔
978
      code = makeNode(type, sizeof(SInterpFuncLogicNode), &pNode);
13✔
979
      break;
13✔
980
    case QUERY_NODE_PHYSICAL_PLAN_FORECAST_FUNC:
×
981
      code = makeNode(type, sizeof(SForecastFuncLogicNode), &pNode);
×
982
      break;
×
983
    case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
13,257✔
984
      code = makeNode(type, sizeof(SDataDispatcherNode), &pNode);
13,257✔
985
      break;
13,260✔
986
    case QUERY_NODE_PHYSICAL_PLAN_INSERT:
156,252✔
987
      code = makeNode(type, sizeof(SDataInserterNode), &pNode);
156,252✔
988
      break;
156,413✔
989
    case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT:
17✔
990
      code = makeNode(type, sizeof(SQueryInserterNode), &pNode);
17✔
991
      break;
17✔
992
    case QUERY_NODE_PHYSICAL_PLAN_DELETE:
318✔
993
      code = makeNode(type, sizeof(SDataDeleterNode), &pNode);
318✔
994
      break;
318✔
995
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE:
2✔
996
      code = makeNode(type, sizeof(SGroupCachePhysiNode), &pNode);
2✔
997
      break;
2✔
998
    case QUERY_NODE_PHYSICAL_PLAN_DYN_QUERY_CTRL:
2✔
999
      code = makeNode(type, sizeof(SDynQueryCtrlPhysiNode), &pNode);
2✔
1000
      break;
2✔
1001
    case QUERY_NODE_PHYSICAL_SUBPLAN:
170,100✔
1002
      code = makeNode(type, sizeof(SSubplan), &pNode);
170,100✔
1003
      break;
170,225✔
1004
    case QUERY_NODE_PHYSICAL_PLAN:
162,452✔
1005
      code = makeNode(type, sizeof(SQueryPlan), &pNode);
162,452✔
1006
      break;
162,500✔
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,697,424✔
1020
    nodesError("nodesMakeNode unknown node = %s", nodesNodeName(type));
×
1021
  }
1022
  else
1023
    *ppNodeOut = pNode;
3,697,424✔
1024
  return code;
3,696,825✔
1025
}
1026

1027
static void destroyVgDataBlockArray(SArray* pArray) {
453,952✔
1028
  size_t size = taosArrayGetSize(pArray);
453,952✔
1029
  for (size_t i = 0; i < size; ++i) {
610,436✔
1030
    SVgDataBlocks* pVg = taosArrayGetP(pArray, i);
156,412✔
1031
    taosMemoryFreeClear(pVg->pData);
156,445✔
1032
    taosMemoryFreeClear(pVg);
156,397✔
1033
  }
1034
  taosArrayDestroy(pArray);
454,024✔
1035
}
454,046✔
1036

1037
static void destroyLogicNode(SLogicNode* pNode) {
354,655✔
1038
  nodesDestroyList(pNode->pTargets);
354,655✔
1039
  nodesDestroyNode(pNode->pConditions);
354,805✔
1040
  nodesDestroyList(pNode->pChildren);
354,725✔
1041
  nodesDestroyNode(pNode->pLimit);
354,753✔
1042
  nodesDestroyNode(pNode->pSlimit);
354,670✔
1043
  nodesDestroyList(pNode->pHint);
354,850✔
1044
}
354,887✔
1045

1046
static void destroyPhysiNode(SPhysiNode* pNode) {
25,213✔
1047
  nodesDestroyList(pNode->pChildren);
25,213✔
1048
  nodesDestroyNode(pNode->pConditions);
25,216✔
1049
  nodesDestroyNode((SNode*)pNode->pOutputDataBlockDesc);
25,218✔
1050
  nodesDestroyNode(pNode->pLimit);
25,222✔
1051
  nodesDestroyNode(pNode->pSlimit);
25,220✔
1052
}
25,222✔
1053

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

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

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

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

1077
static void destroyExprNode(SExprNode* pExpr) { taosArrayDestroy(pExpr->pAssociation); }
1,251,653✔
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,636,134✔
1106
  if (NULL == pNode) {
7,636,134✔
1107
    return;
3,943,332✔
1108
  }
1109

1110
  switch (nodeType(pNode)) {
3,692,802✔
1111
    case QUERY_NODE_COLUMN:
700,741✔
1112
      destroyExprNode((SExprNode*)pNode);
700,741✔
1113
      break;
700,902✔
1114
    case QUERY_NODE_VALUE: {
407,530✔
1115
      SValueNode* pValue = (SValueNode*)pNode;
407,530✔
1116
      destroyExprNode((SExprNode*)pNode);
407,530✔
1117
      taosMemoryFreeClear(pValue->literal);
407,629✔
1118
      if (IS_VAR_DATA_TYPE(pValue->node.resType.type) || pValue->node.resType.type == TSDB_DATA_TYPE_DECIMAL) {
407,913✔
1119
        taosMemoryFreeClear(pValue->datum.p);
46,972✔
1120
      }
1121
      break;
407,913✔
1122
    }
1123
    case QUERY_NODE_OPERATOR: {
22,183✔
1124
      SOperatorNode* pOp = (SOperatorNode*)pNode;
22,183✔
1125
      destroyExprNode((SExprNode*)pNode);
22,183✔
1126
      nodesDestroyNode(pOp->pLeft);
22,183✔
1127
      nodesDestroyNode(pOp->pRight);
22,183✔
1128
      break;
22,183✔
1129
    }
1130
    case QUERY_NODE_LOGIC_CONDITION:
5,305✔
1131
      destroyExprNode((SExprNode*)pNode);
5,305✔
1132
      nodesDestroyList(((SLogicConditionNode*)pNode)->pParameterList);
5,305✔
1133
      break;
5,305✔
1134
    case QUERY_NODE_FUNCTION:
116,148✔
1135
      destroyExprNode((SExprNode*)pNode);
116,148✔
1136
      nodesDestroyList(((SFunctionNode*)pNode)->pParameterList);
116,161✔
1137
      break;
116,160✔
1138
    case QUERY_NODE_REAL_TABLE: {
83,836✔
1139
      SRealTableNode* pReal = (SRealTableNode*)pNode;
83,836✔
1140
      taosMemoryFreeClear(pReal->pMeta);
83,836✔
1141
      taosMemoryFreeClear(pReal->pVgroupList);
83,836✔
1142
      taosArrayDestroyEx(pReal->pSmaIndexes, destroySmaIndex);
83,836✔
1143
      taosArrayDestroyP(pReal->tsmaTargetTbVgInfo, NULL);
83,845✔
1144
      taosArrayDestroy(pReal->tsmaTargetTbInfo);
83,852✔
1145
      break;
83,861✔
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:
423✔
1155
      nodesDestroyNode(((STempTableNode*)pNode)->pSubquery);
423✔
1156
      break;
423✔
1157
    case QUERY_NODE_JOIN_TABLE: {
159✔
1158
      SJoinTableNode* pJoin = (SJoinTableNode*)pNode;
159✔
1159
      nodesDestroyNode(pJoin->pWindowOffset);
159✔
1160
      nodesDestroyNode(pJoin->pJLimit);
159✔
1161
      nodesDestroyNode(pJoin->addPrimCond);
159✔
1162
      nodesDestroyNode(pJoin->pLeft);
159✔
1163
      nodesDestroyNode(pJoin->pRight);
159✔
1164
      nodesDestroyNode(pJoin->pOnCond);
159✔
1165
      break;
159✔
1166
    }
1167
    case QUERY_NODE_GROUPING_SET:
1,607✔
1168
      nodesDestroyList(((SGroupingSetNode*)pNode)->pParameterList);
1,607✔
1169
      break;
1,607✔
1170
    case QUERY_NODE_ORDER_BY_EXPR:
2,529✔
1171
      nodesDestroyNode(((SOrderByExprNode*)pNode)->pExpr);
2,529✔
1172
      break;
2,529✔
1173
    case QUERY_NODE_LIMIT: {
1,609✔
1174
      SLimitNode* pLimit = (SLimitNode*)pNode;
1,609✔
1175
      nodesDestroyNode((SNode*)pLimit->limit);
1,609✔
1176
      nodesDestroyNode((SNode*)pLimit->offset);
1,609✔
1177
      break;
1,610✔
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: {
612✔
1193
      SIntervalWindowNode* pJoin = (SIntervalWindowNode*)pNode;
612✔
1194
      nodesDestroyNode(pJoin->pCol);
612✔
1195
      nodesDestroyNode(pJoin->pInterval);
612✔
1196
      nodesDestroyNode(pJoin->pOffset);
612✔
1197
      nodesDestroyNode(pJoin->pSliding);
612✔
1198
      nodesDestroyNode(pJoin->pFill);
612✔
1199
      break;
612✔
1200
    }
1201
    case QUERY_NODE_NODE_LIST:
167,154✔
1202
      nodesDestroyList(((SNodeListNode*)pNode)->pNodeList);
167,154✔
1203
      break;
167,202✔
1204
    case QUERY_NODE_FILL: {
83✔
1205
      SFillNode* pFill = (SFillNode*)pNode;
83✔
1206
      nodesDestroyNode(pFill->pValues);
83✔
1207
      nodesDestroyNode(pFill->pWStartTs);
83✔
1208
      break;
83✔
1209
    }
1210
    case QUERY_NODE_RAW_EXPR:
24,975✔
1211
      nodesDestroyNode(((SRawExprNode*)pNode)->pNode);
24,975✔
1212
      break;
24,976✔
1213
    case QUERY_NODE_TARGET:
95,077✔
1214
      nodesDestroyNode(((STargetNode*)pNode)->pExpr);
95,077✔
1215
      break;
95,090✔
1216
    case QUERY_NODE_DATABLOCK_DESC:
38,254✔
1217
      nodesDestroyList(((SDataBlockDescNode*)pNode)->pSlots);
38,254✔
1218
      break;
38,261✔
1219
    case QUERY_NODE_SLOT_DESC:  // no pointer field
164,254✔
1220
      break;
164,254✔
1221
    case QUERY_NODE_COLUMN_DEF:
32,817✔
1222
      nodesDestroyNode(((SColumnDefNode*)pNode)->pOptions);
32,817✔
1223
      break;
32,817✔
1224
    case QUERY_NODE_DOWNSTREAM_SOURCE:  // no pointer field
3,484✔
1225
      break;
3,484✔
1226
    case QUERY_NODE_DATABASE_OPTIONS: {
1,035✔
1227
      SDatabaseOptions* pOptions = (SDatabaseOptions*)pNode;
1,035✔
1228
      nodesDestroyNode((SNode*)pOptions->pDaysPerFile);
1,035✔
1229
      nodesDestroyNode((SNode*)pOptions->s3KeepLocalStr);
1,035✔
1230
      nodesDestroyList(pOptions->pKeep);
1,035✔
1231
      nodesDestroyList(pOptions->pRetentions);
1,035✔
1232
      nodesDestroyNode((SNode*)pOptions->pCompactIntervalNode);
1,035✔
1233
      nodesDestroyList(pOptions->pCompactTimeRangeList);
1,035✔
1234
      nodesDestroyNode((SNode*)pOptions->pCompactTimeOffsetNode);
1,035✔
1235
      nodesDestroyNode((SNode*)pOptions->pKeepTimeOffsetNode);
1,035✔
1236
      break;
1,035✔
1237
    }
1238
    case QUERY_NODE_TABLE_OPTIONS: {
36,605✔
1239
      STableOptions* pOptions = (STableOptions*)pNode;
36,605✔
1240
      nodesDestroyList(pOptions->pMaxDelay);
36,605✔
1241
      nodesDestroyList(pOptions->pWatermark);
36,623✔
1242
      nodesDestroyList(pOptions->pRollupFuncs);
36,663✔
1243
      nodesDestroyList(pOptions->pSma);
36,684✔
1244
      nodesDestroyList(pOptions->pDeleteMark);
36,704✔
1245
      nodesDestroyNode((SNode*)pOptions->pKeepNode);
36,713✔
1246
      break;
36,707✔
1247
    }
1248
    case QUERY_NODE_COLUMN_OPTIONS: {
31,617✔
1249
      SColumnOptions* pOptions = (SColumnOptions*)pNode;
31,617✔
1250
      break;
31,617✔
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,228✔
1353
      SSelectStmt* pStmt = (SSelectStmt*)pNode;
10,228✔
1354
      nodesDestroyList(pStmt->pProjectionList);
10,228✔
1355
      nodesDestroyList(pStmt->pProjectionBindList);
10,229✔
1356
      nodesDestroyNode(pStmt->pFromTable);
10,229✔
1357
      nodesDestroyNode(pStmt->pWhere);
10,229✔
1358
      nodesDestroyList(pStmt->pPartitionByList);
10,229✔
1359
      nodesDestroyList(pStmt->pTags);
10,229✔
1360
      nodesDestroyNode(pStmt->pSubtable);
10,229✔
1361
      nodesDestroyNode(pStmt->pWindow);
10,229✔
1362
      nodesDestroyList(pStmt->pGroupByList);
10,229✔
1363
      nodesDestroyNode(pStmt->pHaving);
10,229✔
1364
      nodesDestroyNode(pStmt->pRange);
10,229✔
1365
      nodesDestroyNode(pStmt->pRangeAround);
10,229✔
1366
      nodesDestroyNode(pStmt->pEvery);
10,229✔
1367
      nodesDestroyNode(pStmt->pFill);
10,229✔
1368
      nodesDestroyList(pStmt->pOrderByList);
10,228✔
1369
      nodesDestroyNode((SNode*)pStmt->pLimit);
10,228✔
1370
      nodesDestroyNode((SNode*)pStmt->pSlimit);
10,228✔
1371
      nodesDestroyList(pStmt->pHint);
10,228✔
1372
      break;
10,228✔
1373
    }
1374
    case QUERY_NODE_VNODE_MODIFY_STMT: {
141,941✔
1375
      SVnodeModifyOpStmt* pStmt = (SVnodeModifyOpStmt*)pNode;
141,941✔
1376
      destroyVgDataBlockArray(pStmt->pDataBlocks);
141,941✔
1377
      taosMemoryFreeClear(pStmt->pTableMeta);
141,941✔
1378
      nodesDestroyNode(pStmt->pTagCond);
141,956✔
1379
      taosArrayDestroy(pStmt->pTableTag);
141,978✔
1380
      taosHashCleanup(pStmt->pVgroupsHashObj);
141,976✔
1381
      taosHashCleanup(pStmt->pSubTableHashObj);
141,986✔
1382
      taosHashCleanup(pStmt->pSuperTableHashObj);
141,981✔
1383
      taosHashCleanup(pStmt->pTableNameHashObj);
141,989✔
1384
      taosHashCleanup(pStmt->pDbFNameHashObj);
141,989✔
1385
      taosHashCleanup(pStmt->pTableCxtHashObj);
141,991✔
1386
      if (pStmt->freeHashFunc) {
141,991✔
1387
        pStmt->freeHashFunc(pStmt->pTableBlockHashObj);
107,396✔
1388
      }
1389
      if (pStmt->freeArrayFunc) {
141,989✔
1390
        pStmt->freeArrayFunc(pStmt->pVgDataBlocks);
107,394✔
1391
      }
1392
      tdDestroySVCreateTbReq(pStmt->pCreateTblReq);
141,985✔
1393
      taosMemoryFreeClear(pStmt->pCreateTblReq);
141,985✔
1394
      if (pStmt->freeStbRowsCxtFunc) {
141,985✔
1395
        pStmt->freeStbRowsCxtFunc(pStmt->pStbRowsCxt);
107,144✔
1396
      }
1397
      taosMemoryFreeClear(pStmt->pStbRowsCxt);
141,984✔
1398

1399
      taosMemoryFreeClear(pStmt->pCreateTbInfo);
141,984✔
1400

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

1405
      int32_t code = taosCloseFile(&pStmt->fp);
141,984✔
1406
      if (TSDB_CODE_SUCCESS != code) {
141,963✔
1407
        nodesError("failed to close file %s:%d", __func__, __LINE__);
×
1408
      }
1409
      break;
141,962✔
1410
    }
1411
    case QUERY_NODE_CREATE_DATABASE_STMT: {
454✔
1412
      SDatabaseOptions* pOptions = ((SCreateDatabaseStmt*)pNode)->pOptions;
454✔
1413
      taosMemoryFreeClear(pOptions->pDbCfg);
454✔
1414
      nodesDestroyNode((SNode*)pOptions);
454✔
1415
      break;
454✔
1416
    }
1417
    case QUERY_NODE_DROP_DATABASE_STMT:  // no pointer field
380✔
1418
      break;
380✔
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
104✔
1426
    case QUERY_NODE_TRIM_DATABASE_STMT:   // no pointer field
1427
      break;
104✔
1428
    case QUERY_NODE_S3MIGRATE_DATABASE_STMT:  // no pointer field
3✔
1429
      break;
3✔
1430
    case QUERY_NODE_CREATE_TABLE_STMT: {
401✔
1431
      SCreateTableStmt* pStmt = (SCreateTableStmt*)pNode;
401✔
1432
      nodesDestroyList(pStmt->pCols);
401✔
1433
      nodesDestroyList(pStmt->pTags);
401✔
1434
      nodesDestroyNode((SNode*)pStmt->pOptions);
401✔
1435
      break;
401✔
1436
    }
1437
    case QUERY_NODE_CREATE_SUBTABLE_CLAUSE: {
36,176✔
1438
      SCreateSubTableClause* pStmt = (SCreateSubTableClause*)pNode;
36,176✔
1439
      nodesDestroyList(pStmt->pSpecificTags);
36,176✔
1440
      nodesDestroyList(pStmt->pValsOfTags);
36,169✔
1441
      nodesDestroyNode((SNode*)pStmt->pOptions);
36,252✔
1442
      break;
36,254✔
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:
33,825✔
1463
      nodesDestroyList(((SCreateMultiTablesStmt*)pNode)->pSubTables);
33,825✔
1464
      break;
33,886✔
1465
    case QUERY_NODE_DROP_TABLE_CLAUSE:  // no pointer field
372✔
1466
      break;
372✔
1467
    case QUERY_NODE_DROP_TABLE_STMT:
358✔
1468
      nodesDestroyList(((SDropTableStmt*)pNode)->pTables);
358✔
1469
      break;
358✔
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:
323✔
1474
    case QUERY_NODE_ALTER_SUPER_TABLE_STMT:
1475
    case QUERY_NODE_ALTER_VIRTUAL_TABLE_STMT: {
1476
      SAlterTableStmt* pStmt = (SAlterTableStmt*)pNode;
323✔
1477
      nodesDestroyNode((SNode*)pStmt->pOptions);
323✔
1478
      nodesDestroyNode((SNode*)pStmt->pVal);
323✔
1479
      if (pStmt->pNodeListTagValue != NULL) {
323✔
1480
        SNodeList* pNodeList = pStmt->pNodeListTagValue;
14✔
1481
        SNode*     pSubNode = NULL;
14✔
1482
        FOREACH(pSubNode, pNodeList) {
28✔
1483
          SAlterTableStmt* pSubAlterTable = (SAlterTableStmt*)pSubNode;
14✔
1484
          nodesDestroyNode((SNode*)pSubAlterTable->pOptions);
14✔
1485
          nodesDestroyNode((SNode*)pSubAlterTable->pVal);
14✔
1486
        }
1487
      }
1488
      break;
323✔
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,051✔
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,051✔
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:
343✔
1545
      taosMemoryFree(((SDescribeStmt*)pNode)->pMeta);
343✔
1546
      break;
343✔
1547
    case QUERY_NODE_RESET_QUERY_CACHE_STMT:  // no pointer field
35✔
1548
      break;
35✔
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:
805✔
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;
805✔
1643
      nodesDestroyNode(pStmt->pDbName);
805✔
1644
      nodesDestroyNode(pStmt->pTbName);
804✔
1645
      break;
806✔
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:
17✔
1655
      nodesDestroyNode(((SShowDnodeVariablesStmt*)pNode)->pDnodeId);
17✔
1656
      nodesDestroyNode(((SShowDnodeVariablesStmt*)pNode)->pLikePattern);
17✔
1657
      break;
17✔
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:
22✔
1671
      taosMemoryFreeClear(((SShowCreateDatabaseStmt*)pNode)->pCfg);
22✔
1672
      break;
22✔
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: {
266✔
1687
      SDeleteStmt* pStmt = (SDeleteStmt*)pNode;
266✔
1688
      nodesDestroyNode(pStmt->pFromTable);
266✔
1689
      nodesDestroyNode(pStmt->pWhere);
266✔
1690
      nodesDestroyNode(pStmt->pCountFunc);
266✔
1691
      nodesDestroyNode(pStmt->pFirstFunc);
266✔
1692
      nodesDestroyNode(pStmt->pLastFunc);
266✔
1693
      nodesDestroyNode(pStmt->pTagCond);
266✔
1694
      break;
266✔
1695
    }
1696
    case QUERY_NODE_INSERT_STMT: {
23✔
1697
      SInsertStmt* pStmt = (SInsertStmt*)pNode;
23✔
1698
      nodesDestroyNode(pStmt->pTable);
23✔
1699
      nodesDestroyList(pStmt->pCols);
23✔
1700
      nodesDestroyNode(pStmt->pQuery);
23✔
1701
      break;
23✔
1702
    }
1703
    case QUERY_NODE_QUERY: {
153,186✔
1704
      SQuery* pQuery = (SQuery*)pNode;
153,186✔
1705
      nodesDestroyNode(pQuery->pPrevRoot);
153,186✔
1706
      nodesDestroyNode(pQuery->pRoot);
153,168✔
1707
      nodesDestroyNode(pQuery->pPostRoot);
153,190✔
1708
      taosMemoryFreeClear(pQuery->pResSchema);
153,199✔
1709
      if (NULL != pQuery->pCmdMsg) {
153,200✔
1710
        taosMemoryFreeClear(pQuery->pCmdMsg->pMsg);
2,715✔
1711
        taosMemoryFreeClear(pQuery->pCmdMsg);
2,715✔
1712
      }
1713
      taosMemoryFreeClear(pQuery->pResExtSchema);
153,200✔
1714
      taosArrayDestroy(pQuery->pDbList);
153,201✔
1715
      taosArrayDestroy(pQuery->pTableList);
153,195✔
1716
      taosArrayDestroy(pQuery->pTargetTableList);
153,195✔
1717
      taosArrayDestroy(pQuery->pPlaceholderValues);
153,199✔
1718
      nodesDestroyNode(pQuery->pPrepareRoot);
153,204✔
1719
      break;
153,209✔
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: {
17,117✔
1745
      SScanLogicNode* pLogicNode = (SScanLogicNode*)pNode;
17,117✔
1746
      destroyLogicNode((SLogicNode*)pLogicNode);
17,117✔
1747
      nodesDestroyList(pLogicNode->pScanCols);
17,118✔
1748
      nodesDestroyList(pLogicNode->pScanPseudoCols);
17,132✔
1749
      taosMemoryFreeClear(pLogicNode->pVgroupList);
17,132✔
1750
      nodesDestroyList(pLogicNode->pDynamicScanFuncs);
17,131✔
1751
      nodesDestroyNode(pLogicNode->pTagCond);
17,131✔
1752
      nodesDestroyNode(pLogicNode->pTagIndexCond);
17,131✔
1753
      taosArrayDestroyEx(pLogicNode->pSmaIndexes, destroySmaIndex);
17,131✔
1754
      nodesDestroyList(pLogicNode->pGroupTags);
17,120✔
1755
      nodesDestroyList(pLogicNode->pTags);
17,131✔
1756
      nodesDestroyNode(pLogicNode->pSubtable);
17,130✔
1757
      taosArrayDestroyEx(pLogicNode->pFuncTypes, destroyFuncParam);
17,130✔
1758
      taosArrayDestroyP(pLogicNode->pTsmaTargetTbVgInfo, NULL);
17,131✔
1759
      taosArrayDestroy(pLogicNode->pTsmaTargetTbInfo);
17,119✔
1760
      break;
17,126✔
1761
    }
1762
    case QUERY_NODE_LOGIC_PLAN_JOIN: {
135✔
1763
      SJoinLogicNode* pLogicNode = (SJoinLogicNode*)pNode;
135✔
1764
      destroyLogicNode((SLogicNode*)pLogicNode);
135✔
1765
      nodesDestroyNode(pLogicNode->pWindowOffset);
135✔
1766
      nodesDestroyNode(pLogicNode->pJLimit);
135✔
1767
      nodesDestroyNode(pLogicNode->addPrimEqCond);
135✔
1768
      nodesDestroyNode(pLogicNode->pPrimKeyEqCond);
135✔
1769
      nodesDestroyNode(pLogicNode->pColEqCond);
135✔
1770
      nodesDestroyNode(pLogicNode->pColOnCond);
135✔
1771
      nodesDestroyNode(pLogicNode->pTagEqCond);
135✔
1772
      nodesDestroyNode(pLogicNode->pTagOnCond);
135✔
1773
      nodesDestroyNode(pLogicNode->pFullOnCond);
135✔
1774
      nodesDestroyList(pLogicNode->pLeftEqNodes);
135✔
1775
      nodesDestroyList(pLogicNode->pRightEqNodes);
135✔
1776
      nodesDestroyNode(pLogicNode->pLeftOnCond);
135✔
1777
      nodesDestroyNode(pLogicNode->pRightOnCond);
135✔
1778
      break;
135✔
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,707✔
1789
      SAggLogicNode* pLogicNode = (SAggLogicNode*)pNode;
11,707✔
1790
      destroyLogicNode((SLogicNode*)pLogicNode);
11,707✔
1791
      nodesDestroyList(pLogicNode->pAggFuncs);
11,711✔
1792
      nodesDestroyList(pLogicNode->pGroupKeys);
11,726✔
1793
      break;
11,726✔
1794
    }
1795
    case QUERY_NODE_LOGIC_PLAN_PROJECT: {
9,343✔
1796
      SProjectLogicNode* pLogicNode = (SProjectLogicNode*)pNode;
9,343✔
1797
      destroyLogicNode((SLogicNode*)pLogicNode);
9,343✔
1798
      nodesDestroyList(pLogicNode->pProjections);
9,352✔
1799
      break;
9,363✔
1800
    }
1801
    case QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY: {
311,838✔
1802
      SVnodeModifyLogicNode* pLogicNode = (SVnodeModifyLogicNode*)pNode;
311,838✔
1803
      destroyLogicNode((SLogicNode*)pLogicNode);
311,838✔
1804
      destroyVgDataBlockArray(pLogicNode->pDataBlocks);
312,026✔
1805
      // pVgDataBlocks is weak reference
1806
      nodesDestroyNode(pLogicNode->pAffectedRows);
312,126✔
1807
      nodesDestroyNode(pLogicNode->pStartTs);
312,136✔
1808
      nodesDestroyNode(pLogicNode->pEndTs);
312,141✔
1809
      taosMemoryFreeClear(pLogicNode->pVgroupList);
312,144✔
1810
      nodesDestroyList(pLogicNode->pInsertCols);
312,144✔
1811
      break;
312,040✔
1812
    }
1813
    case QUERY_NODE_LOGIC_PLAN_EXCHANGE:
2,492✔
1814
      destroyLogicNode((SLogicNode*)pNode);
2,492✔
1815
      break;
2,492✔
1816
    case QUERY_NODE_LOGIC_PLAN_MERGE: {
321✔
1817
      SMergeLogicNode* pLogicNode = (SMergeLogicNode*)pNode;
321✔
1818
      destroyLogicNode((SLogicNode*)pLogicNode);
321✔
1819
      nodesDestroyList(pLogicNode->pMergeKeys);
321✔
1820
      nodesDestroyList(pLogicNode->pInputs);
321✔
1821
      break;
321✔
1822
    }
1823
    case QUERY_NODE_LOGIC_PLAN_WINDOW: {
655✔
1824
      SWindowLogicNode* pLogicNode = (SWindowLogicNode*)pNode;
655✔
1825
      destroyLogicNode((SLogicNode*)pLogicNode);
655✔
1826
      nodesDestroyList(pLogicNode->pFuncs);
655✔
1827
      nodesDestroyNode(pLogicNode->pTspk);
655✔
1828
      nodesDestroyNode(pLogicNode->pTsEnd);
655✔
1829
      nodesDestroyNode(pLogicNode->pStateExpr);
655✔
1830
      nodesDestroyNode(pLogicNode->pStartCond);
655✔
1831
      nodesDestroyNode(pLogicNode->pEndCond);
655✔
1832
      break;
655✔
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: {
573✔
1845
      SSortLogicNode* pLogicNode = (SSortLogicNode*)pNode;
573✔
1846
      destroyLogicNode((SLogicNode*)pLogicNode);
573✔
1847
      nodesDestroyList(pLogicNode->pSortKeys);
573✔
1848
      break;
573✔
1849
    }
1850
    case QUERY_NODE_LOGIC_PLAN_PARTITION: {
197✔
1851
      SPartitionLogicNode* pLogicNode = (SPartitionLogicNode*)pNode;
197✔
1852
      destroyLogicNode((SLogicNode*)pLogicNode);
197✔
1853
      nodesDestroyList(pLogicNode->pPartitionKeys);
197✔
1854
      nodesDestroyList(pLogicNode->pTags);
197✔
1855
      nodesDestroyNode(pLogicNode->pSubtable);
197✔
1856
      nodesDestroyList(pLogicNode->pAggFuncs);
197✔
1857
      break;
197✔
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: {
26✔
1866
      SInterpFuncLogicNode* pLogicNode = (SInterpFuncLogicNode*)pNode;
26✔
1867
      destroyLogicNode((SLogicNode*)pLogicNode);
26✔
1868
      nodesDestroyList(pLogicNode->pFuncs);
26✔
1869
      nodesDestroyNode(pLogicNode->pFillValues);
26✔
1870
      nodesDestroyNode(pLogicNode->pTimeSeries);
26✔
1871
      break;
26✔
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: {
2✔
1880
      SGroupCacheLogicNode* pLogicNode = (SGroupCacheLogicNode*)pNode;
2✔
1881
      destroyLogicNode((SLogicNode*)pLogicNode);
2✔
1882
      nodesDestroyList(pLogicNode->pGroupCols);
2✔
1883
      break;
2✔
1884
    }
1885
    case QUERY_NODE_LOGIC_PLAN_DYN_QUERY_CTRL: {
2✔
1886
      SDynQueryCtrlLogicNode* pLogicNode = (SDynQueryCtrlLogicNode*)pNode;
2✔
1887
      destroyLogicNode((SLogicNode*)pLogicNode);
2✔
1888
      if (pLogicNode->qType == DYN_QTYPE_VTB_SCAN) {
2✔
1889
        taosMemoryFreeClear(pLogicNode->vtbScan.pVgroupList);
×
1890
      }
1891
      break;
2✔
1892
    }
1893
    case QUERY_NODE_LOGIC_SUBPLAN: {
331,039✔
1894
      SLogicSubplan* pSubplan = (SLogicSubplan*)pNode;
331,039✔
1895
      nodesDestroyList(pSubplan->pChildren);
331,039✔
1896
      nodesDestroyNode((SNode*)pSubplan->pNode);
331,120✔
1897
      nodesClearList(pSubplan->pParents);
331,250✔
1898
      taosMemoryFreeClear(pSubplan->pVgroupList);
331,184✔
1899
      break;
331,184✔
1900
    }
1901
    case QUERY_NODE_LOGIC_PLAN:
162,452✔
1902
      nodesDestroyList(((SQueryLogicPlan*)pNode)->pTopSubplans);
162,452✔
1903
      break;
162,462✔
1904
    case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN:
1,644✔
1905
    case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
1906
    case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
1907
      destroyScanPhysiNode((SScanPhysiNode*)pNode);
1,644✔
1908
      break;
1,644✔
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:
10,149✔
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;
10,149✔
1932
      destroyScanPhysiNode((SScanPhysiNode*)pNode);
10,149✔
1933
      nodesDestroyList(pPhyNode->pDynamicScanFuncs);
10,149✔
1934
      nodesDestroyList(pPhyNode->pGroupTags);
10,150✔
1935
      nodesDestroyList(pPhyNode->pTags);
10,151✔
1936
      nodesDestroyNode(pPhyNode->pSubtable);
10,151✔
1937
      break;
10,152✔
1938
    }
1939
    case QUERY_NODE_PHYSICAL_PLAN_PROJECT: {
2,545✔
1940
      SProjectPhysiNode* pPhyNode = (SProjectPhysiNode*)pNode;
2,545✔
1941
      destroyPhysiNode((SPhysiNode*)pPhyNode);
2,545✔
1942
      nodesDestroyList(pPhyNode->pProjections);
2,546✔
1943
      break;
2,546✔
1944
    }
1945
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN: {
98✔
1946
      SSortMergeJoinPhysiNode* pPhyNode = (SSortMergeJoinPhysiNode*)pNode;
98✔
1947
      destroyPhysiNode((SPhysiNode*)pPhyNode);
98✔
1948
      nodesDestroyNode(pPhyNode->pWindowOffset);
98✔
1949
      nodesDestroyNode(pPhyNode->pJLimit);
98✔
1950
      nodesDestroyNode(pPhyNode->leftPrimExpr);
98✔
1951
      nodesDestroyNode(pPhyNode->rightPrimExpr);
98✔
1952
      nodesDestroyList(pPhyNode->pEqLeft);
98✔
1953
      nodesDestroyList(pPhyNode->pEqRight);
98✔
1954
      nodesDestroyNode(pPhyNode->pPrimKeyCond);
98✔
1955
      nodesDestroyNode(pPhyNode->pFullOnCond);
98✔
1956
      nodesDestroyList(pPhyNode->pTargets);
98✔
1957
      nodesDestroyNode(pPhyNode->pColEqCond);
98✔
1958
      nodesDestroyNode(pPhyNode->pColOnCond);
98✔
1959
      break;
98✔
1960
    }
1961
    case QUERY_NODE_PHYSICAL_PLAN_HASH_JOIN: {
2✔
1962
      SHashJoinPhysiNode* pPhyNode = (SHashJoinPhysiNode*)pNode;
2✔
1963
      destroyPhysiNode((SPhysiNode*)pPhyNode);
2✔
1964
      nodesDestroyNode(pPhyNode->pWindowOffset);
2✔
1965
      nodesDestroyNode(pPhyNode->pJLimit);
2✔
1966
      nodesDestroyList(pPhyNode->pOnLeft);
2✔
1967
      nodesDestroyList(pPhyNode->pOnRight);
2✔
1968
      nodesDestroyNode(pPhyNode->leftPrimExpr);
2✔
1969
      nodesDestroyNode(pPhyNode->rightPrimExpr);
2✔
1970
      nodesDestroyNode(pPhyNode->pLeftOnCond);
2✔
1971
      nodesDestroyNode(pPhyNode->pRightOnCond);
2✔
1972
      nodesDestroyNode(pPhyNode->pFullOnCond);
2✔
1973
      nodesDestroyList(pPhyNode->pTargets);
2✔
1974

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

1979
      break;
2✔
1980
    }
1981
    case QUERY_NODE_PHYSICAL_PLAN_HASH_AGG: {
6,991✔
1982
      SAggPhysiNode* pPhyNode = (SAggPhysiNode*)pNode;
6,991✔
1983
      destroyPhysiNode((SPhysiNode*)pPhyNode);
6,991✔
1984
      nodesDestroyList(pPhyNode->pExprs);
6,993✔
1985
      nodesDestroyList(pPhyNode->pAggFuncs);
6,993✔
1986
      nodesDestroyList(pPhyNode->pGroupKeys);
6,993✔
1987
      break;
6,993✔
1988
    }
1989
    case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE: {
2,398✔
1990
      SExchangePhysiNode* pPhyNode = (SExchangePhysiNode*)pNode;
2,398✔
1991
      destroyPhysiNode((SPhysiNode*)pPhyNode);
2,398✔
1992
      nodesDestroyList(pPhyNode->pSrcEndPoints);
2,398✔
1993
      break;
2,398✔
1994
    }
1995
    case QUERY_NODE_PHYSICAL_PLAN_MERGE: {
310✔
1996
      SMergePhysiNode* pPhyNode = (SMergePhysiNode*)pNode;
310✔
1997
      destroyPhysiNode((SPhysiNode*)pPhyNode);
310✔
1998
      nodesDestroyList(pPhyNode->pMergeKeys);
310✔
1999
      nodesDestroyList(pPhyNode->pTargets);
310✔
2000
      break;
310✔
2001
    }
2002
    case QUERY_NODE_PHYSICAL_PLAN_SORT:
261✔
2003
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT: {
2004
      SSortPhysiNode* pPhyNode = (SSortPhysiNode*)pNode;
261✔
2005
      destroyPhysiNode((SPhysiNode*)pPhyNode);
261✔
2006
      nodesDestroyList(pPhyNode->pExprs);
261✔
2007
      nodesDestroyList(pPhyNode->pSortKeys);
261✔
2008
      nodesDestroyList(pPhyNode->pTargets);
261✔
2009
      break;
261✔
2010
    }
2011
    case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL:
548✔
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);
548✔
2022
      break;
548✔
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: {
54✔
2074
      destroyPartitionPhysiNode((SPartitionPhysiNode*)pNode);
54✔
2075
      break;
54✔
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:
13✔
2092
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERP_FUNC: {
2093
      SInterpFuncPhysiNode* pPhyNode = (SInterpFuncPhysiNode*)pNode;
13✔
2094
      destroyPhysiNode((SPhysiNode*)pPhyNode);
13✔
2095
      nodesDestroyList(pPhyNode->pExprs);
13✔
2096
      nodesDestroyList(pPhyNode->pFuncs);
13✔
2097
      nodesDestroyNode(pPhyNode->pFillValues);
13✔
2098
      nodesDestroyNode(pPhyNode->pTimeSeries);
13✔
2099
      break;
13✔
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:
13,254✔
2109
      destroyDataSinkNode((SDataSinkNode*)pNode);
13,254✔
2110
      break;
13,257✔
2111
    case QUERY_NODE_PHYSICAL_PLAN_INSERT: {
156,411✔
2112
      SDataInserterNode* pSink = (SDataInserterNode*)pNode;
156,411✔
2113
      destroyDataSinkNode((SDataSinkNode*)pSink);
156,411✔
2114
      taosMemFreeClear(pSink->pData);
156,364✔
2115
      break;
156,375✔
2116
    }
2117
    case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT: {
17✔
2118
      SQueryInserterNode* pSink = (SQueryInserterNode*)pNode;
17✔
2119
      destroyDataSinkNode((SDataSinkNode*)pSink);
17✔
2120
      nodesDestroyList(pSink->pCols);
17✔
2121
      break;
17✔
2122
    }
2123
    case QUERY_NODE_PHYSICAL_PLAN_DELETE: {
318✔
2124
      SDataDeleterNode* pSink = (SDataDeleterNode*)pNode;
318✔
2125
      destroyDataSinkNode((SDataSinkNode*)pSink);
318✔
2126
      nodesDestroyNode(pSink->pAffectedRows);
318✔
2127
      nodesDestroyNode(pSink->pStartTs);
318✔
2128
      nodesDestroyNode(pSink->pEndTs);
318✔
2129
      break;
318✔
2130
    }
2131
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE: {
2✔
2132
      SGroupCachePhysiNode* pPhyNode = (SGroupCachePhysiNode*)pNode;
2✔
2133
      destroyPhysiNode((SPhysiNode*)pPhyNode);
2✔
2134
      nodesDestroyList(pPhyNode->pGroupCols);
2✔
2135
      break;
2✔
2136
    }
2137
    case QUERY_NODE_PHYSICAL_PLAN_DYN_QUERY_CTRL: {
2✔
2138
      SDynQueryCtrlPhysiNode* pPhyNode = (SDynQueryCtrlPhysiNode*)pNode;
2✔
2139
      if (pPhyNode->qType == DYN_QTYPE_VTB_SCAN) {
2✔
2140
        nodesDestroyList(pPhyNode->vtbScan.pScanCols);
×
2141
      }
2142
      destroyPhysiNode((SPhysiNode*)pPhyNode);
2✔
2143
      break;
2✔
2144
    }
2145
    case QUERY_NODE_PHYSICAL_SUBPLAN: {
170,233✔
2146
      SSubplan* pSubplan = (SSubplan*)pNode;
170,233✔
2147
      nodesClearList(pSubplan->pChildren);
170,233✔
2148
      nodesDestroyNode((SNode*)pSubplan->pNode);
170,260✔
2149
      nodesDestroyNode((SNode*)pSubplan->pDataSink);
170,260✔
2150
      nodesDestroyNode((SNode*)pSubplan->pTagCond);
170,279✔
2151
      nodesDestroyNode((SNode*)pSubplan->pTagIndexCond);
170,289✔
2152
      tSimpleHashCleanup(pSubplan->pVTables);
170,294✔
2153
      nodesClearList(pSubplan->pParents);
170,186✔
2154
      break;
170,205✔
2155
    }
2156
    case QUERY_NODE_PHYSICAL_PLAN:
162,532✔
2157
      nodesDestroyList(((SQueryPlan*)pNode)->pSubplans);
162,532✔
2158
      break;
162,578✔
2159
    default:
×
2160
      break;
×
2161
  }
2162
  nodesFree(pNode);
3,698,530✔
2163
  return;
3,696,966✔
2164
}
2165

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

2175
int32_t nodesListAppend(SNodeList* pList, SNode* pNode) {
2,112,720✔
2176
  if (NULL == pList || NULL == pNode) {
2,112,720✔
2177
    return TSDB_CODE_INVALID_PARA;
×
2178
  }
2179
  SListCell* p = NULL;
2,113,043✔
2180
  int32_t    code = nodesCalloc(1, sizeof(SListCell), (void**)&p);
2,113,043✔
2181
  if (TSDB_CODE_SUCCESS != code) {
2,113,169✔
2182
    return code;
×
2183
  }
2184
  p->pNode = pNode;
2,113,169✔
2185
  if (NULL == pList->pHead) {
2,113,169✔
2186
    pList->pHead = p;
1,082,662✔
2187
  }
2188
  if (NULL != pList->pTail) {
2,113,169✔
2189
    pList->pTail->pNext = p;
1,031,071✔
2190
  }
2191
  p->pPrev = pList->pTail;
2,113,169✔
2192
  pList->pTail = p;
2,113,169✔
2193
  ++(pList->length);
2,113,169✔
2194
  return TSDB_CODE_SUCCESS;
2,113,169✔
2195
}
2196

2197
int32_t nodesListStrictAppend(SNodeList* pList, SNode* pNode) {
1,379,647✔
2198
  if (NULL == pNode) {
1,379,647✔
2199
    return TSDB_CODE_INVALID_PARA;
×
2200
  }
2201
  int32_t code = nodesListAppend(pList, pNode);
1,379,647✔
2202
  if (TSDB_CODE_SUCCESS != code) {
1,379,767✔
2203
    nodesDestroyNode(pNode);
×
2204
  }
2205
  return code;
1,379,806✔
2206
}
2207

2208
int32_t nodesListMakeAppend(SNodeList** pList, SNode* pNode) {
15,216✔
2209
  if (NULL == *pList) {
15,216✔
2210
    int32_t code = nodesMakeList(pList);
10,846✔
2211
    if (NULL == *pList) {
10,846✔
2212
      return code;
×
2213
    }
2214
  }
2215
  return nodesListAppend(*pList, pNode);
15,216✔
2216
}
2217

2218
int32_t nodesListMakeStrictAppend(SNodeList** pList, SNode* pNode) {
784,355✔
2219
  if (NULL == *pList) {
784,355✔
2220
    int32_t code = nodesMakeList(pList);
183,637✔
2221
    if (NULL == *pList) {
183,684✔
2222
      return code;
×
2223
    }
2224
  }
2225
  return nodesListStrictAppend(*pList, pNode);
784,402✔
2226
}
2227

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

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

2245
  return TSDB_CODE_SUCCESS;
131✔
2246
}
2247

2248
int32_t nodesListStrictAppendList(SNodeList* pTarget, SNodeList* pSrc) {
3✔
2249
  if (NULL == pSrc) {
3✔
2250
    return TSDB_CODE_OUT_OF_MEMORY;
×
2251
  }
2252
  int32_t code = nodesListAppendList(pTarget, pSrc);
3✔
2253
  if (TSDB_CODE_SUCCESS != code) {
3✔
2254
    nodesDestroyList(pSrc);
×
2255
  }
2256
  return code;
3✔
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) {
47✔
2270
  if (*pList == NULL) {
47✔
2271
    int32_t code = nodesMakeList(pList);
47✔
2272
    if (*pList == NULL) {
47✔
2273
      return code;
×
2274
    }
2275
  }
2276
  return nodesListPushFront(*pList, pNode);
47✔
2277
}
2278

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

2299
SListCell* nodesListErase(SNodeList* pList, SListCell* pCell) {
1,930,833✔
2300
  if (NULL == pCell->pPrev) {
1,930,833✔
2301
    pList->pHead = pCell->pNext;
1,926,342✔
2302
  } else {
2303
    pCell->pPrev->pNext = pCell->pNext;
4,491✔
2304
  }
2305
  if (NULL == pCell->pNext) {
1,930,833✔
2306
    pList->pTail = pCell->pPrev;
905,625✔
2307
  } else {
2308
    pCell->pNext->pPrev = pCell->pPrev;
1,025,208✔
2309
  }
2310
  SListCell* pNext = pCell->pNext;
1,930,833✔
2311
  nodesDestroyNode(pCell->pNode);
1,930,833✔
2312
  nodesFree(pCell);
1,931,445✔
2313
  --(pList->length);
1,931,383✔
2314
  return pNext;
1,931,383✔
2315
}
2316

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

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

2331
  pTarget->length += pSrc->length;
4,656✔
2332
  nodesFree(pSrc);
4,656✔
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) {
713,011✔
2356
  SNode* node;
2357
  FOREACH(node, pList) {
1,033,618✔
2358
    if (0 == index--) {
1,033,243✔
2359
      return node;
712,636✔
2360
    }
2361
  }
2362
  return NULL;
375✔
2363
}
2364

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

2375
void nodesDestroyList(SNodeList* pList) {
3,061,528✔
2376
  if (NULL == pList) {
3,061,528✔
2377
    return;
2,132,358✔
2378
  }
2379

2380
  SListCell* pNext = pList->pHead;
929,170✔
2381
  while (NULL != pNext) {
2,856,010✔
2382
    pNext = nodesListErase(pList, pNext);
1,925,767✔
2383
  }
2384
  nodesFree(pList);
930,243✔
2385
}
2386

2387
void nodesClearList(SNodeList* pList) {
855,381✔
2388
  if (NULL == pList) {
855,381✔
2389
    return;
664,821✔
2390
  }
2391

2392
  SListCell* pNext = pList->pHead;
190,560✔
2393
  while (NULL != pNext) {
371,965✔
2394
    SListCell* tmp = pNext;
181,238✔
2395
    pNext = pNext->pNext;
181,238✔
2396
    nodesFree(tmp);
181,238✔
2397
  }
2398
  nodesFree(pList);
190,727✔
2399
}
2400

2401
void* nodesGetValueFromNode(SValueNode* pNode) {
17,696✔
2402
  switch (pNode->node.resType.type) {
17,696✔
2403
    case TSDB_DATA_TYPE_BOOL:
16,439✔
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,439✔
2417
    case TSDB_DATA_TYPE_NCHAR:
1,258✔
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,258✔
2424
    default:
×
2425
      break;
×
2426
  }
2427

2428
  return NULL;
×
2429
}
2430

2431
int32_t nodesSetValueNodeValue(SValueNode* pNode, void* value) {
388✔
2432
  switch (pNode->node.resType.type) {
388✔
2433
    case TSDB_DATA_TYPE_NULL:
×
2434
      break;
×
2435
    case TSDB_DATA_TYPE_BOOL:
71✔
2436
      pNode->datum.b = *(bool*)value;
71✔
2437
      *(bool*)&pNode->typeData = pNode->datum.b;
71✔
2438
      break;
71✔
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:
75✔
2448
      pNode->datum.i = *(int32_t*)value;
75✔
2449
      *(int32_t*)&pNode->typeData = pNode->datum.i;
75✔
2450
      break;
75✔
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:
149✔
2456
      pNode->datum.i = *(int64_t*)value;
149✔
2457
      *(int64_t*)&pNode->typeData = pNode->datum.i;
149✔
2458
      break;
149✔
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:
34✔
2480
      pNode->datum.d = *(double*)value;
34✔
2481
      *(double*)&pNode->typeData = pNode->datum.d;
34✔
2482
      break;
34✔
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;
388✔
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) {
52,215✔
2573
  ENodeType type = nodeType(pNode);
52,215✔
2574
  return (QUERY_NODE_COLUMN == type || QUERY_NODE_VALUE == type || QUERY_NODE_OPERATOR == type ||
19,470✔
2575
          QUERY_NODE_FUNCTION == type || QUERY_NODE_LOGIC_CONDITION == type || QUERY_NODE_CASE_WHEN == type);
71,685✔
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) {
3,025✔
2611
  switch (pOp->opType) {
3,025✔
2612
    case OP_TYPE_GREATER_THAN:
3,021✔
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;
3,021✔
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) {
3,036✔
2652
  switch (pOp->opType) {
3,036✔
2653
    case OP_TYPE_LIKE:
37✔
2654
    case OP_TYPE_NOT_LIKE:
2655
    case OP_TYPE_MATCH:
2656
    case OP_TYPE_NMATCH:
2657
      return true;
37✔
2658
    default:
2,999✔
2659
      break;
2,999✔
2660
  }
2661
  return false;
2,999✔
2662
}
2663

2664
bool nodesIsMatchRegularOp(const SOperatorNode* pOp) {
37✔
2665
  switch (pOp->opType) {
37✔
2666
    case OP_TYPE_MATCH:
×
2667
    case OP_TYPE_NMATCH:
2668
      return true;
×
2669
    default:
37✔
2670
      break;
37✔
2671
  }
2672
  return false;
37✔
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,959✔
2696
  char    name[TSDB_TABLE_NAME_LEN + TSDB_COL_NAME_LEN];
2697
  int32_t len = 0;
61,959✔
2698
  if ('\0' == pCol->tableAlias[0]) {
61,959✔
2699
    len = tsnprintf(name, sizeof(name), "%s", pCol->colName);
72✔
2700
  } else {
2701
    len = tsnprintf(name, sizeof(name), "%s.%s", pCol->tableAlias, pCol->colName);
61,887✔
2702
  }
2703
  if (pCol->projRefIdx > 0) {
61,974✔
2704
    len = taosHashBinary(name, strlen(name));
95✔
2705
    len += tsnprintf(name + len, TSDB_TABLE_NAME_LEN + TSDB_COL_NAME_LEN - len, "_%d", pCol->projRefIdx);
95✔
2706
  }
2707
  SNode** pNodeFound = taosHashGet(pCxt->pColHash, name, len);
61,974✔
2708
  if (pNodeFound == NULL) {
61,963✔
2709
    pCxt->errCode = taosHashPut(pCxt->pColHash, name, len, &pNode, POINTER_BYTES);
43,131✔
2710
    if (TSDB_CODE_SUCCESS == pCxt->errCode) {
43,148✔
2711
      SNode* pNew = NULL;
43,149✔
2712
      pCxt->errCode = nodesCloneNode(pNode, &pNew);
43,149✔
2713
      if (TSDB_CODE_SUCCESS == pCxt->errCode) {
43,142✔
2714
        pCxt->errCode = nodesListStrictAppend(pCxt->pCols, pNew);
43,142✔
2715
      }
2716
    }
2717
    return (TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_IGNORE_CHILD : DEAL_RES_ERROR);
43,144✔
2718
  }
2719
  return DEAL_RES_CONTINUE;
18,832✔
2720
}
2721

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

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

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

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

2789
  return TSDB_CODE_SUCCESS;
14,288✔
2790
}
2791

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

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

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

2829
  return TSDB_CODE_SUCCESS;
44✔
2830
}
2831

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

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

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

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

2868
  return TSDB_CODE_SUCCESS;
5,879✔
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) {
149,461✔
2879
  SCollectFuncsCxt* pCxt = (SCollectFuncsCxt*)pContext;
149,461✔
2880
  if (QUERY_NODE_FUNCTION == nodeType(pNode) && pCxt->classifier(((SFunctionNode*)pNode)->funcId)) {
149,461✔
2881
    SFunctionNode* pFunc = (SFunctionNode*)pNode;
18,353✔
2882
    if (FUNCTION_TYPE_TBNAME == pFunc->funcType && pCxt->tableAlias) {
18,353✔
2883
      SValueNode* pVal = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 0);
178✔
2884
      if (pVal && strcmp(pVal->literal, pCxt->tableAlias)) {
178✔
2885
        return DEAL_RES_CONTINUE;
×
2886
      }
2887
    }
2888

2889
    bool   bFound = false;
18,353✔
2890
    SNode* pn = NULL;
18,353✔
2891
    FOREACH(pn, pCxt->pFuncs) {
52,311✔
2892
      if (nodesEqualNode(pn, pNode)) {
34,050✔
2893
        bFound = true;
95✔
2894
        break;
95✔
2895
      }
2896
    }
2897
    if (!bFound) {
18,356✔
2898
      SNode* pNew = NULL;
18,246✔
2899
      pCxt->errCode = nodesCloneNode(pNode, &pNew);
18,246✔
2900
      if (TSDB_CODE_SUCCESS == pCxt->errCode) {
18,256✔
2901
        pCxt->errCode = nodesListStrictAppend(pCxt->pFuncs, pNew);
18,250✔
2902
      }
2903
    }
2904
    return (TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_IGNORE_CHILD : DEAL_RES_ERROR);
18,372✔
2905
  }
2906
  return DEAL_RES_CONTINUE;
131,107✔
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,
120✔
2922
                                SNodeList* pFuncs) {
2923
  if (NULL == pSelect || NULL == pFuncs) {
120✔
2924
    return TSDB_CODE_FAILED;
×
2925
  }
2926

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

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

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

2965
  return cxt.errCode;
11,902✔
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) {
137✔
3088
  int32_t code = 0;
137✔
3089
  if (pNode->isNull) {
137✔
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;
133✔
3095
  pVal->nLen = pNode->node.resType.bytes;
133✔
3096
  switch (pNode->node.resType.type) {
133✔
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:
118✔
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;
118✔
3108
      break;
118✔
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;
133✔
3158
}
3159

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

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

3182
  return TSDB_CODE_SUCCESS;
1,384✔
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) {
84✔
3202
  int32_t     lenStr = strlen(literal);
84✔
3203
  SValueNode* pValNode = NULL;
84✔
3204
  int32_t     code = nodesMakeNode(QUERY_NODE_VALUE, (SNode**)&pValNode);
84✔
3205
  if (pValNode) {
84✔
3206
    pValNode->node.resType.type = TSDB_DATA_TYPE_VARCHAR;
84✔
3207
    pValNode->node.resType.bytes = lenStr + VARSTR_HEADER_SIZE;
84✔
3208
    char* p = taosMemoryMalloc(lenStr + 1 + VARSTR_HEADER_SIZE);
84✔
3209
    if (p == NULL) {
84✔
3210
      return terrno;
×
3211
    }
3212
    varDataSetLen(p, lenStr);
84✔
3213
    memcpy(varDataVal(p), literal, lenStr + 1);
84✔
3214
    pValNode->datum.p = p;
84✔
3215
    pValNode->literal = tstrdup(literal);
84✔
3216
    pValNode->translate = true;
84✔
3217
    pValNode->isNull = false;
84✔
3218
    *ppValNode = pValNode;
84✔
3219
  }
3220
  return code;
84✔
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,602✔
3279
  return (QUERY_NODE_COLUMN == nodeType(pNode)) && ('\0' == ((SColumnNode*)pNode)->tableAlias[0]) &&
18,248✔
3280
         (0 == strcmp(((SColumnNode*)pNode)->colName, "*"));
4,646✔
3281
}
3282

3283
bool nodesIsTableStar(SNode* pNode) {
5,845✔
3284
  return (QUERY_NODE_COLUMN == nodeType(pNode)) && ('\0' != ((SColumnNode*)pNode)->tableAlias[0]) &&
8,480✔
3285
         (0 == strcmp(((SColumnNode*)pNode)->colName, "*"));
2,635✔
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) {
12✔
3356
  SNode* pFound = NULL;
12✔
3357
  FOREACH(pFound, pList) {
24✔
3358
    if (nodesEqualNode(pFound, pNode)) {
12✔
3359
      break;
×
3360
    }
3361
  }
3362
  return pFound;
12✔
3363
}
3364

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

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

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

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

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

3418
  return DEAL_RES_CONTINUE;
3✔
3419
}
3420

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

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

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

3454

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

3461
  int32_t code = TSDB_CODE_SUCCESS;
8✔
3462
  if (QUERY_NODE_LOGIC_CONDITION == nodeType(*pCond) &&
8✔
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);
8✔
3470
  }
3471
  
3472
  return code;
8✔
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