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

16
#include "cmdnodes.h"
X
Xiaoyu Wang 已提交
17
#include "nodesUtil.h"
X
Xiaoyu Wang 已提交
18
#include "plannodes.h"
19
#include "querynodes.h"
X
Xiaoyu Wang 已提交
20
#include "taos.h"
21
#include "taoserror.h"
wmmhello's avatar
wmmhello 已提交
22
#include "tdatablock.h"
X
Xiaoyu Wang 已提交
23
#include "thash.h"
24

X
Xiaoyu Wang 已提交
25 26 27 28 29 30 31 32 33
static SNode* makeNode(ENodeType type, size_t size) {
  SNode* p = taosMemoryCalloc(1, size);
  if (NULL == p) {
    return NULL;
  }
  setNodeType(p, type);
  return p;
}

34
SNode* nodesMakeNode(ENodeType type) {
35 36
  switch (type) {
    case QUERY_NODE_COLUMN:
X
Xiaoyu Wang 已提交
37
      return makeNode(type, sizeof(SColumnNode));
38
    case QUERY_NODE_VALUE:
X
Xiaoyu Wang 已提交
39
      return makeNode(type, sizeof(SValueNode));
40
    case QUERY_NODE_OPERATOR:
X
Xiaoyu Wang 已提交
41
      return makeNode(type, sizeof(SOperatorNode));
42
    case QUERY_NODE_LOGIC_CONDITION:
X
Xiaoyu Wang 已提交
43
      return makeNode(type, sizeof(SLogicConditionNode));
44
    case QUERY_NODE_FUNCTION:
X
Xiaoyu Wang 已提交
45
      return makeNode(type, sizeof(SFunctionNode));
46
    case QUERY_NODE_REAL_TABLE:
X
Xiaoyu Wang 已提交
47
      return makeNode(type, sizeof(SRealTableNode));
48
    case QUERY_NODE_TEMP_TABLE:
X
Xiaoyu Wang 已提交
49
      return makeNode(type, sizeof(STempTableNode));
50
    case QUERY_NODE_JOIN_TABLE:
X
Xiaoyu Wang 已提交
51
      return makeNode(type, sizeof(SJoinTableNode));
52
    case QUERY_NODE_GROUPING_SET:
X
Xiaoyu Wang 已提交
53
      return makeNode(type, sizeof(SGroupingSetNode));
54
    case QUERY_NODE_ORDER_BY_EXPR:
X
Xiaoyu Wang 已提交
55
      return makeNode(type, sizeof(SOrderByExprNode));
56
    case QUERY_NODE_LIMIT:
X
Xiaoyu Wang 已提交
57
      return makeNode(type, sizeof(SLimitNode));
58
    case QUERY_NODE_STATE_WINDOW:
X
Xiaoyu Wang 已提交
59
      return makeNode(type, sizeof(SStateWindowNode));
60
    case QUERY_NODE_SESSION_WINDOW:
X
Xiaoyu Wang 已提交
61
      return makeNode(type, sizeof(SSessionWindowNode));
62
    case QUERY_NODE_INTERVAL_WINDOW:
X
Xiaoyu Wang 已提交
63
      return makeNode(type, sizeof(SIntervalWindowNode));
64
    case QUERY_NODE_NODE_LIST:
X
Xiaoyu Wang 已提交
65
      return makeNode(type, sizeof(SNodeListNode));
66
    case QUERY_NODE_FILL:
X
Xiaoyu Wang 已提交
67
      return makeNode(type, sizeof(SFillNode));
68
    case QUERY_NODE_RAW_EXPR:
X
Xiaoyu Wang 已提交
69
      return makeNode(type, sizeof(SRawExprNode));
70
    case QUERY_NODE_TARGET:
X
Xiaoyu Wang 已提交
71
      return makeNode(type, sizeof(STargetNode));
72
    case QUERY_NODE_DATABLOCK_DESC:
X
Xiaoyu Wang 已提交
73
      return makeNode(type, sizeof(SDataBlockDescNode));
74
    case QUERY_NODE_SLOT_DESC:
X
Xiaoyu Wang 已提交
75
      return makeNode(type, sizeof(SSlotDescNode));
76
    case QUERY_NODE_COLUMN_DEF:
X
Xiaoyu Wang 已提交
77
      return makeNode(type, sizeof(SColumnDefNode));
X
Xiaoyu Wang 已提交
78
    case QUERY_NODE_DOWNSTREAM_SOURCE:
X
Xiaoyu Wang 已提交
79
      return makeNode(type, sizeof(SDownstreamSourceNode));
X
Xiaoyu Wang 已提交
80
    case QUERY_NODE_DATABASE_OPTIONS:
X
Xiaoyu Wang 已提交
81
      return makeNode(type, sizeof(SDatabaseOptions));
X
Xiaoyu Wang 已提交
82
    case QUERY_NODE_TABLE_OPTIONS:
X
Xiaoyu Wang 已提交
83
      return makeNode(type, sizeof(STableOptions));
X
Xiaoyu Wang 已提交
84
    case QUERY_NODE_INDEX_OPTIONS:
X
Xiaoyu Wang 已提交
85
      return makeNode(type, sizeof(SIndexOptions));
86
    case QUERY_NODE_EXPLAIN_OPTIONS:
X
Xiaoyu Wang 已提交
87
      return makeNode(type, sizeof(SExplainOptions));
88
    case QUERY_NODE_STREAM_OPTIONS:
X
Xiaoyu Wang 已提交
89
      return makeNode(type, sizeof(SStreamOptions));
90
    case QUERY_NODE_LEFT_VALUE:
X
Xiaoyu Wang 已提交
91
      return makeNode(type, sizeof(SLeftValueNode));
92 93
    case QUERY_NODE_COLUMN_REF:
      return makeNode(type, sizeof(SColumnDefNode));
94
    case QUERY_NODE_SET_OPERATOR:
X
Xiaoyu Wang 已提交
95
      return makeNode(type, sizeof(SSetOperator));
96
    case QUERY_NODE_SELECT_STMT:
X
Xiaoyu Wang 已提交
97
      return makeNode(type, sizeof(SSelectStmt));
98
    case QUERY_NODE_VNODE_MODIF_STMT:
X
Xiaoyu Wang 已提交
99
      return makeNode(type, sizeof(SVnodeModifOpStmt));
100
    case QUERY_NODE_CREATE_DATABASE_STMT:
X
Xiaoyu Wang 已提交
101
      return makeNode(type, sizeof(SCreateDatabaseStmt));
102
    case QUERY_NODE_DROP_DATABASE_STMT:
X
Xiaoyu Wang 已提交
103
      return makeNode(type, sizeof(SDropDatabaseStmt));
104
    case QUERY_NODE_ALTER_DATABASE_STMT:
X
Xiaoyu Wang 已提交
105
      return makeNode(type, sizeof(SAlterDatabaseStmt));
X
Xiaoyu Wang 已提交
106 107
    case QUERY_NODE_FLUSH_DATABASE_STMT:
      return makeNode(type, sizeof(SFlushDatabaseStmt));
X
Xiaoyu Wang 已提交
108 109
    case QUERY_NODE_TRIM_DATABASE_STMT:
      return makeNode(type, sizeof(STrimDatabaseStmt));
110
    case QUERY_NODE_CREATE_TABLE_STMT:
X
Xiaoyu Wang 已提交
111
      return makeNode(type, sizeof(SCreateTableStmt));
112
    case QUERY_NODE_CREATE_SUBTABLE_CLAUSE:
X
Xiaoyu Wang 已提交
113
      return makeNode(type, sizeof(SCreateSubTableClause));
114
    case QUERY_NODE_CREATE_MULTI_TABLE_STMT:
X
Xiaoyu Wang 已提交
115
      return makeNode(type, sizeof(SCreateMultiTableStmt));
116
    case QUERY_NODE_DROP_TABLE_CLAUSE:
X
Xiaoyu Wang 已提交
117
      return makeNode(type, sizeof(SDropTableClause));
118
    case QUERY_NODE_DROP_TABLE_STMT:
X
Xiaoyu Wang 已提交
119
      return makeNode(type, sizeof(SDropTableStmt));
120
    case QUERY_NODE_DROP_SUPER_TABLE_STMT:
X
Xiaoyu Wang 已提交
121
      return makeNode(type, sizeof(SDropSuperTableStmt));
122
    case QUERY_NODE_ALTER_TABLE_STMT:
X
Xiaoyu Wang 已提交
123
      return makeNode(type, sizeof(SAlterTableStmt));
124
    case QUERY_NODE_CREATE_USER_STMT:
X
Xiaoyu Wang 已提交
125
      return makeNode(type, sizeof(SCreateUserStmt));
126
    case QUERY_NODE_ALTER_USER_STMT:
X
Xiaoyu Wang 已提交
127
      return makeNode(type, sizeof(SAlterUserStmt));
128
    case QUERY_NODE_DROP_USER_STMT:
X
Xiaoyu Wang 已提交
129
      return makeNode(type, sizeof(SDropUserStmt));
130
    case QUERY_NODE_USE_DATABASE_STMT:
X
Xiaoyu Wang 已提交
131
      return makeNode(type, sizeof(SUseDatabaseStmt));
132
    case QUERY_NODE_CREATE_DNODE_STMT:
X
Xiaoyu Wang 已提交
133
      return makeNode(type, sizeof(SCreateDnodeStmt));
134
    case QUERY_NODE_DROP_DNODE_STMT:
X
Xiaoyu Wang 已提交
135
      return makeNode(type, sizeof(SDropDnodeStmt));
136
    case QUERY_NODE_ALTER_DNODE_STMT:
X
Xiaoyu Wang 已提交
137
      return makeNode(type, sizeof(SAlterDnodeStmt));
X
Xiaoyu Wang 已提交
138
    case QUERY_NODE_CREATE_INDEX_STMT:
X
Xiaoyu Wang 已提交
139
      return makeNode(type, sizeof(SCreateIndexStmt));
140
    case QUERY_NODE_DROP_INDEX_STMT:
X
Xiaoyu Wang 已提交
141
      return makeNode(type, sizeof(SDropIndexStmt));
X
Xiaoyu Wang 已提交
142
    case QUERY_NODE_CREATE_QNODE_STMT:
143 144 145
    case QUERY_NODE_CREATE_BNODE_STMT:
    case QUERY_NODE_CREATE_SNODE_STMT:
    case QUERY_NODE_CREATE_MNODE_STMT:
X
Xiaoyu Wang 已提交
146
      return makeNode(type, sizeof(SCreateComponentNodeStmt));
147
    case QUERY_NODE_DROP_QNODE_STMT:
148 149 150
    case QUERY_NODE_DROP_BNODE_STMT:
    case QUERY_NODE_DROP_SNODE_STMT:
    case QUERY_NODE_DROP_MNODE_STMT:
X
Xiaoyu Wang 已提交
151
      return makeNode(type, sizeof(SDropComponentNodeStmt));
152
    case QUERY_NODE_CREATE_TOPIC_STMT:
X
Xiaoyu Wang 已提交
153
      return makeNode(type, sizeof(SCreateTopicStmt));
154
    case QUERY_NODE_DROP_TOPIC_STMT:
X
Xiaoyu Wang 已提交
155 156 157
      return makeNode(type, sizeof(SDropTopicStmt));
    case QUERY_NODE_DROP_CGROUP_STMT:
      return makeNode(type, sizeof(SDropCGroupStmt));
158 159
    case QUERY_NODE_ALTER_LOCAL_STMT:
      return makeNode(type, sizeof(SAlterLocalStmt));
160
    case QUERY_NODE_EXPLAIN_STMT:
X
Xiaoyu Wang 已提交
161
      return makeNode(type, sizeof(SExplainStmt));
162
    case QUERY_NODE_DESCRIBE_STMT:
X
Xiaoyu Wang 已提交
163
      return makeNode(type, sizeof(SDescribeStmt));
164
    case QUERY_NODE_RESET_QUERY_CACHE_STMT:
X
Xiaoyu Wang 已提交
165
      return makeNode(type, sizeof(SNode));
166
    case QUERY_NODE_COMPACT_STMT:
167
      break;
168
    case QUERY_NODE_CREATE_FUNCTION_STMT:
X
Xiaoyu Wang 已提交
169
      return makeNode(type, sizeof(SCreateFunctionStmt));
170
    case QUERY_NODE_DROP_FUNCTION_STMT:
X
Xiaoyu Wang 已提交
171
      return makeNode(type, sizeof(SDropFunctionStmt));
172
    case QUERY_NODE_CREATE_STREAM_STMT:
X
Xiaoyu Wang 已提交
173
      return makeNode(type, sizeof(SCreateStreamStmt));
174
    case QUERY_NODE_DROP_STREAM_STMT:
X
Xiaoyu Wang 已提交
175
      return makeNode(type, sizeof(SDropStreamStmt));
X
Xiaoyu Wang 已提交
176 177
    case QUERY_NODE_BALANCE_VGROUP_STMT:
      return makeNode(type, sizeof(SBalanceVgroupStmt));
178
    case QUERY_NODE_MERGE_VGROUP_STMT:
X
Xiaoyu Wang 已提交
179
      return makeNode(type, sizeof(SMergeVgroupStmt));
180
    case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
X
Xiaoyu Wang 已提交
181
      return makeNode(type, sizeof(SRedistributeVgroupStmt));
182
    case QUERY_NODE_SPLIT_VGROUP_STMT:
X
Xiaoyu Wang 已提交
183
      return makeNode(type, sizeof(SSplitVgroupStmt));
184 185
    case QUERY_NODE_SYNCDB_STMT:
      break;
186
    case QUERY_NODE_GRANT_STMT:
X
Xiaoyu Wang 已提交
187
      return makeNode(type, sizeof(SGrantStmt));
188
    case QUERY_NODE_REVOKE_STMT:
X
Xiaoyu Wang 已提交
189
      return makeNode(type, sizeof(SRevokeStmt));
190
    case QUERY_NODE_SHOW_DNODES_STMT:
X
Xiaoyu Wang 已提交
191
    case QUERY_NODE_SHOW_MNODES_STMT:
X
Xiaoyu Wang 已提交
192 193
    case QUERY_NODE_SHOW_MODULES_STMT:
    case QUERY_NODE_SHOW_QNODES_STMT:
194 195
    case QUERY_NODE_SHOW_SNODES_STMT:
    case QUERY_NODE_SHOW_BNODES_STMT:
196
    case QUERY_NODE_SHOW_CLUSTER_STMT:
197
    case QUERY_NODE_SHOW_DATABASES_STMT:
X
Xiaoyu Wang 已提交
198 199
    case QUERY_NODE_SHOW_FUNCTIONS_STMT:
    case QUERY_NODE_SHOW_INDEXES_STMT:
200
    case QUERY_NODE_SHOW_STABLES_STMT:
X
Xiaoyu Wang 已提交
201
    case QUERY_NODE_SHOW_STREAMS_STMT:
202 203
    case QUERY_NODE_SHOW_TABLES_STMT:
    case QUERY_NODE_SHOW_USERS_STMT:
X
Xiaoyu Wang 已提交
204
    case QUERY_NODE_SHOW_LICENCES_STMT:
205
    case QUERY_NODE_SHOW_VGROUPS_STMT:
S
Shengliang Guan 已提交
206
    case QUERY_NODE_SHOW_TOPICS_STMT:
207
    case QUERY_NODE_SHOW_CONSUMERS_STMT:
208
    case QUERY_NODE_SHOW_CONNECTIONS_STMT:
209 210
    case QUERY_NODE_SHOW_QUERIES_STMT:
    case QUERY_NODE_SHOW_VNODES_STMT:
211 212
    case QUERY_NODE_SHOW_APPS_STMT:
    case QUERY_NODE_SHOW_SCORES_STMT:
213 214
    case QUERY_NODE_SHOW_VARIABLES_STMT:
    case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT:
215
    case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
216
    case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT:
217
    case QUERY_NODE_SHOW_TAGS_STMT:
218
      return makeNode(type, sizeof(SShowStmt));
219 220
    case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
      return makeNode(type, sizeof(SShowDnodeVariablesStmt));
221
    case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
222
      return makeNode(type, sizeof(SShowCreateDatabaseStmt));
223 224
    case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
    case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
225
      return makeNode(type, sizeof(SShowCreateTableStmt));
226 227
    case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT:
      return makeNode(type, sizeof(SShowTableDistributedStmt));
228
    case QUERY_NODE_KILL_QUERY_STMT:
X
Xiaoyu Wang 已提交
229
      return makeNode(type, sizeof(SKillQueryStmt));
230
    case QUERY_NODE_KILL_TRANSACTION_STMT:
X
Xiaoyu Wang 已提交
231
    case QUERY_NODE_KILL_CONNECTION_STMT:
X
Xiaoyu Wang 已提交
232
      return makeNode(type, sizeof(SKillStmt));
X
Xiaoyu Wang 已提交
233 234
    case QUERY_NODE_DELETE_STMT:
      return makeNode(type, sizeof(SDeleteStmt));
235 236
    case QUERY_NODE_INSERT_STMT:
      return makeNode(type, sizeof(SInsertStmt));
237 238
    case QUERY_NODE_QUERY:
      return makeNode(type, sizeof(SQuery));
X
Xiaoyu Wang 已提交
239
    case QUERY_NODE_LOGIC_PLAN_SCAN:
X
Xiaoyu Wang 已提交
240
      return makeNode(type, sizeof(SScanLogicNode));
X
Xiaoyu Wang 已提交
241
    case QUERY_NODE_LOGIC_PLAN_JOIN:
X
Xiaoyu Wang 已提交
242
      return makeNode(type, sizeof(SJoinLogicNode));
X
Xiaoyu Wang 已提交
243
    case QUERY_NODE_LOGIC_PLAN_AGG:
X
Xiaoyu Wang 已提交
244
      return makeNode(type, sizeof(SAggLogicNode));
X
Xiaoyu Wang 已提交
245
    case QUERY_NODE_LOGIC_PLAN_PROJECT:
X
Xiaoyu Wang 已提交
246
      return makeNode(type, sizeof(SProjectLogicNode));
X
Xiaoyu Wang 已提交
247 248
    case QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY:
      return makeNode(type, sizeof(SVnodeModifyLogicNode));
X
Xiaoyu Wang 已提交
249
    case QUERY_NODE_LOGIC_PLAN_EXCHANGE:
X
Xiaoyu Wang 已提交
250
      return makeNode(type, sizeof(SExchangeLogicNode));
X
Xiaoyu Wang 已提交
251 252
    case QUERY_NODE_LOGIC_PLAN_MERGE:
      return makeNode(type, sizeof(SMergeLogicNode));
X
Xiaoyu Wang 已提交
253
    case QUERY_NODE_LOGIC_PLAN_WINDOW:
X
Xiaoyu Wang 已提交
254
      return makeNode(type, sizeof(SWindowLogicNode));
X
Xiaoyu Wang 已提交
255
    case QUERY_NODE_LOGIC_PLAN_FILL:
X
Xiaoyu Wang 已提交
256
      return makeNode(type, sizeof(SFillLogicNode));
X
Xiaoyu Wang 已提交
257
    case QUERY_NODE_LOGIC_PLAN_SORT:
X
Xiaoyu Wang 已提交
258
      return makeNode(type, sizeof(SSortLogicNode));
259
    case QUERY_NODE_LOGIC_PLAN_PARTITION:
X
Xiaoyu Wang 已提交
260
      return makeNode(type, sizeof(SPartitionLogicNode));
261 262
    case QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC:
      return makeNode(type, sizeof(SIndefRowsFuncLogicNode));
X
Xiaoyu Wang 已提交
263 264
    case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC:
      return makeNode(type, sizeof(SInterpFuncLogicNode));
X
Xiaoyu Wang 已提交
265
    case QUERY_NODE_LOGIC_SUBPLAN:
X
Xiaoyu Wang 已提交
266
      return makeNode(type, sizeof(SLogicSubplan));
X
Xiaoyu Wang 已提交
267
    case QUERY_NODE_LOGIC_PLAN:
X
Xiaoyu Wang 已提交
268
      return makeNode(type, sizeof(SQueryLogicPlan));
X
Xiaoyu Wang 已提交
269
    case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN:
X
Xiaoyu Wang 已提交
270
      return makeNode(type, sizeof(STagScanPhysiNode));
X
Xiaoyu Wang 已提交
271
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
X
Xiaoyu Wang 已提交
272
      return makeNode(type, sizeof(STableScanPhysiNode));
273
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN:
X
Xiaoyu Wang 已提交
274
      return makeNode(type, sizeof(STableSeqScanPhysiNode));
X
Xiaoyu Wang 已提交
275 276
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
      return makeNode(type, sizeof(STableMergeScanPhysiNode));
277
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN:
X
Xiaoyu Wang 已提交
278
      return makeNode(type, sizeof(SStreamScanPhysiNode));
X
Xiaoyu Wang 已提交
279
    case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
X
Xiaoyu Wang 已提交
280
      return makeNode(type, sizeof(SSystemTableScanPhysiNode));
281 282
    case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
      return makeNode(type, sizeof(SBlockDistScanPhysiNode));
X
Xiaoyu Wang 已提交
283 284
    case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN:
      return makeNode(type, sizeof(SLastRowScanPhysiNode));
X
Xiaoyu Wang 已提交
285
    case QUERY_NODE_PHYSICAL_PLAN_PROJECT:
X
Xiaoyu Wang 已提交
286
      return makeNode(type, sizeof(SProjectPhysiNode));
287
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN:
288
      return makeNode(type, sizeof(SSortMergeJoinPhysiNode));
289
    case QUERY_NODE_PHYSICAL_PLAN_HASH_AGG:
X
Xiaoyu Wang 已提交
290
      return makeNode(type, sizeof(SAggPhysiNode));
291
    case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE:
X
Xiaoyu Wang 已提交
292
      return makeNode(type, sizeof(SExchangePhysiNode));
X
Xiaoyu Wang 已提交
293 294
    case QUERY_NODE_PHYSICAL_PLAN_MERGE:
      return makeNode(type, sizeof(SMergePhysiNode));
295
    case QUERY_NODE_PHYSICAL_PLAN_SORT:
X
Xiaoyu Wang 已提交
296
      return makeNode(type, sizeof(SSortPhysiNode));
297 298
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT:
      return makeNode(type, sizeof(SGroupSortPhysiNode));
X
Xiaoyu Wang 已提交
299
    case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL:
X
Xiaoyu Wang 已提交
300
      return makeNode(type, sizeof(SIntervalPhysiNode));
301 302
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL:
      return makeNode(type, sizeof(SMergeAlignedIntervalPhysiNode));
X
Xiaoyu Wang 已提交
303
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL:
X
Xiaoyu Wang 已提交
304
      return makeNode(type, sizeof(SStreamIntervalPhysiNode));
305 306 307 308
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL:
      return makeNode(type, sizeof(SStreamFinalIntervalPhysiNode));
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL:
      return makeNode(type, sizeof(SStreamSemiIntervalPhysiNode));
X
Xiaoyu Wang 已提交
309
    case QUERY_NODE_PHYSICAL_PLAN_FILL:
X
Xiaoyu Wang 已提交
310
      return makeNode(type, sizeof(SFillPhysiNode));
311
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_SESSION:
X
Xiaoyu Wang 已提交
312
      return makeNode(type, sizeof(SSessionWinodwPhysiNode));
313
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION:
X
Xiaoyu Wang 已提交
314
      return makeNode(type, sizeof(SStreamSessionWinodwPhysiNode));
315 316 317 318
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION:
      return makeNode(type, sizeof(SStreamSemiSessionWinodwPhysiNode));
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION:
      return makeNode(type, sizeof(SStreamFinalSessionWinodwPhysiNode));
319
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE:
X
Xiaoyu Wang 已提交
320
      return makeNode(type, sizeof(SStateWinodwPhysiNode));
321
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE:
5
54liuyao 已提交
322
      return makeNode(type, sizeof(SStreamStateWinodwPhysiNode));
323
    case QUERY_NODE_PHYSICAL_PLAN_PARTITION:
X
Xiaoyu Wang 已提交
324
      return makeNode(type, sizeof(SPartitionPhysiNode));
325 326
    case QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC:
      return makeNode(type, sizeof(SIndefRowsFuncPhysiNode));
X
Xiaoyu Wang 已提交
327 328
    case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC:
      return makeNode(type, sizeof(SInterpFuncLogicNode));
329
    case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
X
Xiaoyu Wang 已提交
330
      return makeNode(type, sizeof(SDataDispatcherNode));
331
    case QUERY_NODE_PHYSICAL_PLAN_INSERT:
X
Xiaoyu Wang 已提交
332
      return makeNode(type, sizeof(SDataInserterNode));
333 334
    case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT:
      return makeNode(type, sizeof(SQueryInserterNode));
X
Xiaoyu Wang 已提交
335 336
    case QUERY_NODE_PHYSICAL_PLAN_DELETE:
      return makeNode(type, sizeof(SDataDeleterNode));
X
Xiaoyu Wang 已提交
337
    case QUERY_NODE_PHYSICAL_SUBPLAN:
X
Xiaoyu Wang 已提交
338
      return makeNode(type, sizeof(SSubplan));
X
Xiaoyu Wang 已提交
339
    case QUERY_NODE_PHYSICAL_PLAN:
X
Xiaoyu Wang 已提交
340
      return makeNode(type, sizeof(SQueryPlan));
341 342 343
    default:
      break;
  }
344
  nodesError("nodesMakeNode unknown node = %s", nodesNodeName(type));
X
Xiaoyu Wang 已提交
345
  return NULL;
346 347
}

X
Xiaoyu Wang 已提交
348 349 350 351 352 353 354 355 356 357 358 359
static void destroyVgDataBlockArray(SArray* pArray) {
  size_t size = taosArrayGetSize(pArray);
  for (size_t i = 0; i < size; ++i) {
    SVgDataBlocks* pVg = taosArrayGetP(pArray, i);
    taosMemoryFreeClear(pVg->pData);
    taosMemoryFreeClear(pVg);
  }
  taosArrayDestroy(pArray);
}

static void destroyLogicNode(SLogicNode* pNode) {
  nodesDestroyList(pNode->pTargets);
X
Xiaoyu Wang 已提交
360 361 362 363
  nodesDestroyNode(pNode->pConditions);
  nodesDestroyList(pNode->pChildren);
  nodesDestroyNode(pNode->pLimit);
  nodesDestroyNode(pNode->pSlimit);
X
Xiaoyu Wang 已提交
364 365 366 367 368
}

static void destroyPhysiNode(SPhysiNode* pNode) {
  nodesDestroyList(pNode->pChildren);
  nodesDestroyNode(pNode->pConditions);
369
  nodesDestroyNode((SNode*)pNode->pOutputDataBlockDesc);
370 371
  nodesDestroyNode(pNode->pLimit);
  nodesDestroyNode(pNode->pSlimit);
X
Xiaoyu Wang 已提交
372 373 374 375 376 377
}

static void destroyWinodwPhysiNode(SWinodwPhysiNode* pNode) {
  destroyPhysiNode((SPhysiNode*)pNode);
  nodesDestroyList(pNode->pExprs);
  nodesDestroyList(pNode->pFuncs);
378
  nodesDestroyNode(pNode->pTspk);
5
54liuyao 已提交
379
  nodesDestroyNode(pNode->pTsEnd);
X
Xiaoyu Wang 已提交
380 381 382 383 384
}

static void destroyScanPhysiNode(SScanPhysiNode* pNode) {
  destroyPhysiNode((SPhysiNode*)pNode);
  nodesDestroyList(pNode->pScanCols);
X
Xiaoyu Wang 已提交
385
  nodesDestroyList(pNode->pScanPseudoCols);
X
Xiaoyu Wang 已提交
386 387
}

388
static void destroyDataSinkNode(SDataSinkNode* pNode) { nodesDestroyNode((SNode*)pNode->pInputDataBlockDesc); }
X
Xiaoyu Wang 已提交
389

X
Xiaoyu Wang 已提交
390 391
static void destroyExprNode(SExprNode* pExpr) { taosArrayDestroy(pExpr->pAssociation); }

392
static void destroyTableCfg(STableCfg* pCfg) {
393 394 395
  if (NULL == pCfg) {
    return;
  }
396 397 398 399 400
  taosArrayDestroy(pCfg->pFuncs);
  taosMemoryFree(pCfg->pComment);
  taosMemoryFree(pCfg->pSchemas);
  taosMemoryFree(pCfg->pTags);
  taosMemoryFree(pCfg);
D
dapan1121 已提交
401 402
}

403 404
static void destroySmaIndex(void* pIndex) { taosMemoryFree(((STableIndexInfo*)pIndex)->expr); }

405
void nodesDestroyNode(SNode* pNode) {
X
Xiaoyu Wang 已提交
406 407 408 409 410
  if (NULL == pNode) {
    return;
  }

  switch (nodeType(pNode)) {
X
Xiaoyu Wang 已提交
411
    case QUERY_NODE_COLUMN:  // pProjectRef is weak reference, no need to release
X
Xiaoyu Wang 已提交
412
      destroyExprNode((SExprNode*)pNode);
X
Xiaoyu Wang 已提交
413
      break;
D
dapan1121 已提交
414
    case QUERY_NODE_VALUE: {
X
Xiaoyu Wang 已提交
415
      SValueNode* pValue = (SValueNode*)pNode;
X
Xiaoyu Wang 已提交
416
      destroyExprNode((SExprNode*)pNode);
wafwerar's avatar
wafwerar 已提交
417
      taosMemoryFreeClear(pValue->literal);
D
dapan1121 已提交
418
      if (IS_VAR_DATA_TYPE(pValue->node.resType.type)) {
wafwerar's avatar
wafwerar 已提交
419
        taosMemoryFreeClear(pValue->datum.p);
D
dapan1121 已提交
420
      }
X
Xiaoyu Wang 已提交
421 422 423 424
      break;
    }
    case QUERY_NODE_OPERATOR: {
      SOperatorNode* pOp = (SOperatorNode*)pNode;
X
Xiaoyu Wang 已提交
425
      destroyExprNode((SExprNode*)pNode);
X
Xiaoyu Wang 已提交
426 427
      nodesDestroyNode(pOp->pLeft);
      nodesDestroyNode(pOp->pRight);
D
dapan1121 已提交
428 429 430
      break;
    }
    case QUERY_NODE_LOGIC_CONDITION:
X
Xiaoyu Wang 已提交
431
      destroyExprNode((SExprNode*)pNode);
X
Xiaoyu Wang 已提交
432
      nodesDestroyList(((SLogicConditionNode*)pNode)->pParameterList);
D
dapan1121 已提交
433 434
      break;
    case QUERY_NODE_FUNCTION:
X
Xiaoyu Wang 已提交
435
      destroyExprNode((SExprNode*)pNode);
X
Xiaoyu Wang 已提交
436
      nodesDestroyList(((SFunctionNode*)pNode)->pParameterList);
X
Xiaoyu Wang 已提交
437 438
      break;
    case QUERY_NODE_REAL_TABLE: {
X
Xiaoyu Wang 已提交
439
      SRealTableNode* pReal = (SRealTableNode*)pNode;
wafwerar's avatar
wafwerar 已提交
440 441
      taosMemoryFreeClear(pReal->pMeta);
      taosMemoryFreeClear(pReal->pVgroupList);
442
      taosArrayDestroyEx(pReal->pSmaIndexes, destroySmaIndex);
X
Xiaoyu Wang 已提交
443 444 445
      break;
    }
    case QUERY_NODE_TEMP_TABLE:
X
Xiaoyu Wang 已提交
446
      nodesDestroyNode(((STempTableNode*)pNode)->pSubquery);
D
dapan1121 已提交
447
      break;
X
Xiaoyu Wang 已提交
448 449 450 451 452
    case QUERY_NODE_JOIN_TABLE: {
      SJoinTableNode* pJoin = (SJoinTableNode*)pNode;
      nodesDestroyNode(pJoin->pLeft);
      nodesDestroyNode(pJoin->pRight);
      nodesDestroyNode(pJoin->pOnCond);
D
dapan1121 已提交
453
      break;
X
Xiaoyu Wang 已提交
454
    }
D
dapan1121 已提交
455
    case QUERY_NODE_GROUPING_SET:
X
Xiaoyu Wang 已提交
456 457 458 459 460
      nodesDestroyList(((SGroupingSetNode*)pNode)->pParameterList);
      break;
    case QUERY_NODE_ORDER_BY_EXPR:
      nodesDestroyNode(((SOrderByExprNode*)pNode)->pExpr);
      break;
X
Xiaoyu Wang 已提交
461
    case QUERY_NODE_LIMIT:  // no pointer field
D
dapan1121 已提交
462
      break;
463 464 465 466
    case QUERY_NODE_STATE_WINDOW: {
      SStateWindowNode* pState = (SStateWindowNode*)pNode;
      nodesDestroyNode(pState->pCol);
      nodesDestroyNode(pState->pExpr);
X
Xiaoyu Wang 已提交
467
      break;
468
    }
X
Xiaoyu Wang 已提交
469 470
    case QUERY_NODE_SESSION_WINDOW: {
      SSessionWindowNode* pSession = (SSessionWindowNode*)pNode;
471 472
      nodesDestroyNode((SNode*)pSession->pCol);
      nodesDestroyNode((SNode*)pSession->pGap);
D
dapan1121 已提交
473
      break;
X
Xiaoyu Wang 已提交
474 475 476 477 478 479 480 481 482 483
    }
    case QUERY_NODE_INTERVAL_WINDOW: {
      SIntervalWindowNode* pJoin = (SIntervalWindowNode*)pNode;
      nodesDestroyNode(pJoin->pCol);
      nodesDestroyNode(pJoin->pInterval);
      nodesDestroyNode(pJoin->pOffset);
      nodesDestroyNode(pJoin->pSliding);
      nodesDestroyNode(pJoin->pFill);
      break;
    }
D
dapan1121 已提交
484
    case QUERY_NODE_NODE_LIST:
X
Xiaoyu Wang 已提交
485 486
      nodesDestroyList(((SNodeListNode*)pNode)->pNodeList);
      break;
X
Xiaoyu Wang 已提交
487 488 489 490
    case QUERY_NODE_FILL: {
      SFillNode* pFill = (SFillNode*)pNode;
      nodesDestroyNode(pFill->pValues);
      nodesDestroyNode(pFill->pWStartTs);
X
Xiaoyu Wang 已提交
491
      break;
X
Xiaoyu Wang 已提交
492
    }
X
Xiaoyu Wang 已提交
493 494
    case QUERY_NODE_RAW_EXPR:
      nodesDestroyNode(((SRawExprNode*)pNode)->pNode);
X
Xiaoyu Wang 已提交
495
      break;
X
Xiaoyu Wang 已提交
496 497 498 499 500 501
    case QUERY_NODE_TARGET:
      nodesDestroyNode(((STargetNode*)pNode)->pExpr);
      break;
    case QUERY_NODE_DATABLOCK_DESC:
      nodesDestroyList(((SDataBlockDescNode*)pNode)->pSlots);
      break;
X
Xiaoyu Wang 已提交
502 503 504
    case QUERY_NODE_SLOT_DESC:          // no pointer field
    case QUERY_NODE_COLUMN_DEF:         // no pointer field
    case QUERY_NODE_DOWNSTREAM_SOURCE:  // no pointer field
X
Xiaoyu Wang 已提交
505
      break;
X
Xiaoyu Wang 已提交
506 507
    case QUERY_NODE_DATABASE_OPTIONS: {
      SDatabaseOptions* pOptions = (SDatabaseOptions*)pNode;
508
      nodesDestroyNode((SNode*)pOptions->pDaysPerFile);
X
Xiaoyu Wang 已提交
509 510
      nodesDestroyList(pOptions->pKeep);
      nodesDestroyList(pOptions->pRetentions);
X
Xiaoyu Wang 已提交
511
      break;
X
Xiaoyu Wang 已提交
512
    }
X
Xiaoyu Wang 已提交
513
    case QUERY_NODE_TABLE_OPTIONS: {
X
Xiaoyu Wang 已提交
514
      STableOptions* pOptions = (STableOptions*)pNode;
515 516
      nodesDestroyList(pOptions->pMaxDelay);
      nodesDestroyList(pOptions->pWatermark);
X
Xiaoyu Wang 已提交
517
      nodesDestroyList(pOptions->pRollupFuncs);
518
      nodesDestroyList(pOptions->pSma);
X
Xiaoyu Wang 已提交
519
      break;
X
Xiaoyu Wang 已提交
520
    }
521
    case QUERY_NODE_INDEX_OPTIONS: {
X
Xiaoyu Wang 已提交
522 523 524 525 526
      SIndexOptions* pOptions = (SIndexOptions*)pNode;
      nodesDestroyList(pOptions->pFuncs);
      nodesDestroyNode(pOptions->pInterval);
      nodesDestroyNode(pOptions->pOffset);
      nodesDestroyNode(pOptions->pSliding);
527
      nodesDestroyNode(pOptions->pStreamOptions);
528 529
      break;
    }
530 531
    case QUERY_NODE_EXPLAIN_OPTIONS:  // no pointer field
      break;
532 533 534 535
    case QUERY_NODE_STREAM_OPTIONS: {
      SStreamOptions* pOptions = (SStreamOptions*)pNode;
      nodesDestroyNode(pOptions->pDelay);
      nodesDestroyNode(pOptions->pWatermark);
536
      break;
537
    }
538 539
    case QUERY_NODE_LEFT_VALUE:  // no pointer field
      break;
X
Xiaoyu Wang 已提交
540 541
    case QUERY_NODE_SET_OPERATOR: {
      SSetOperator* pStmt = (SSetOperator*)pNode;
542
      nodesDestroyList(pStmt->pProjectionList);
X
Xiaoyu Wang 已提交
543 544 545 546 547 548
      nodesDestroyNode(pStmt->pLeft);
      nodesDestroyNode(pStmt->pRight);
      nodesDestroyList(pStmt->pOrderByList);
      nodesDestroyNode(pStmt->pLimit);
      break;
    }
X
Xiaoyu Wang 已提交
549
    case QUERY_NODE_SELECT_STMT: {
X
Xiaoyu Wang 已提交
550
      SSelectStmt* pStmt = (SSelectStmt*)pNode;
X
Xiaoyu Wang 已提交
551 552 553 554 555 556 557
      nodesDestroyList(pStmt->pProjectionList);
      nodesDestroyNode(pStmt->pFromTable);
      nodesDestroyNode(pStmt->pWhere);
      nodesDestroyList(pStmt->pPartitionByList);
      nodesDestroyNode(pStmt->pWindow);
      nodesDestroyList(pStmt->pGroupByList);
      nodesDestroyNode(pStmt->pHaving);
X
Xiaoyu Wang 已提交
558 559 560
      nodesDestroyNode(pStmt->pRange);
      nodesDestroyNode(pStmt->pEvery);
      nodesDestroyNode(pStmt->pFill);
X
Xiaoyu Wang 已提交
561
      nodesDestroyList(pStmt->pOrderByList);
562 563
      nodesDestroyNode((SNode*)pStmt->pLimit);
      nodesDestroyNode((SNode*)pStmt->pSlimit);
X
Xiaoyu Wang 已提交
564 565
      break;
    }
X
Xiaoyu Wang 已提交
566 567 568 569
    case QUERY_NODE_VNODE_MODIF_STMT:
      destroyVgDataBlockArray(((SVnodeModifOpStmt*)pNode)->pDataBlocks);
      break;
    case QUERY_NODE_CREATE_DATABASE_STMT:
570
      nodesDestroyNode((SNode*)((SCreateDatabaseStmt*)pNode)->pOptions);
X
Xiaoyu Wang 已提交
571
      break;
X
Xiaoyu Wang 已提交
572
    case QUERY_NODE_DROP_DATABASE_STMT:  // no pointer field
X
Xiaoyu Wang 已提交
573 574
      break;
    case QUERY_NODE_ALTER_DATABASE_STMT:
575
      nodesDestroyNode((SNode*)((SAlterDatabaseStmt*)pNode)->pOptions);
X
Xiaoyu Wang 已提交
576
      break;
X
Xiaoyu Wang 已提交
577
    case QUERY_NODE_FLUSH_DATABASE_STMT:  // no pointer field
X
Xiaoyu Wang 已提交
578
    case QUERY_NODE_TRIM_DATABASE_STMT:   // no pointer field
X
Xiaoyu Wang 已提交
579
      break;
X
Xiaoyu Wang 已提交
580
    case QUERY_NODE_CREATE_TABLE_STMT: {
X
Xiaoyu Wang 已提交
581
      SCreateTableStmt* pStmt = (SCreateTableStmt*)pNode;
X
Xiaoyu Wang 已提交
582 583
      nodesDestroyList(pStmt->pCols);
      nodesDestroyList(pStmt->pTags);
584
      nodesDestroyNode((SNode*)pStmt->pOptions);
X
Xiaoyu Wang 已提交
585 586 587
      break;
    }
    case QUERY_NODE_CREATE_SUBTABLE_CLAUSE: {
X
Xiaoyu Wang 已提交
588
      SCreateSubTableClause* pStmt = (SCreateSubTableClause*)pNode;
X
Xiaoyu Wang 已提交
589 590
      nodesDestroyList(pStmt->pSpecificTags);
      nodesDestroyList(pStmt->pValsOfTags);
wmmhello's avatar
wmmhello 已提交
591
      nodesDestroyNode((SNode*)pStmt->pOptions);
X
Xiaoyu Wang 已提交
592 593 594
      break;
    }
    case QUERY_NODE_CREATE_MULTI_TABLE_STMT:
X
Xiaoyu Wang 已提交
595 596
      nodesDestroyList(((SCreateMultiTableStmt*)pNode)->pSubTables);
      break;
X
Xiaoyu Wang 已提交
597
    case QUERY_NODE_DROP_TABLE_CLAUSE:  // no pointer field
X
Xiaoyu Wang 已提交
598 599
      break;
    case QUERY_NODE_DROP_TABLE_STMT:
600
      nodesDestroyList(((SDropTableStmt*)pNode)->pTables);
X
Xiaoyu Wang 已提交
601
      break;
X
Xiaoyu Wang 已提交
602
    case QUERY_NODE_DROP_SUPER_TABLE_STMT:  // no pointer field
X
Xiaoyu Wang 已提交
603
      break;
604 605
    case QUERY_NODE_ALTER_TABLE_STMT:
    case QUERY_NODE_ALTER_SUPER_TABLE_STMT: {
X
Xiaoyu Wang 已提交
606
      SAlterTableStmt* pStmt = (SAlterTableStmt*)pNode;
607 608
      nodesDestroyNode((SNode*)pStmt->pOptions);
      nodesDestroyNode((SNode*)pStmt->pVal);
X
Xiaoyu Wang 已提交
609 610
      break;
    }
X
Xiaoyu Wang 已提交
611 612 613 614 615 616 617
    case QUERY_NODE_CREATE_USER_STMT:   // no pointer field
    case QUERY_NODE_ALTER_USER_STMT:    // no pointer field
    case QUERY_NODE_DROP_USER_STMT:     // no pointer field
    case QUERY_NODE_USE_DATABASE_STMT:  // no pointer field
    case QUERY_NODE_CREATE_DNODE_STMT:  // no pointer field
    case QUERY_NODE_DROP_DNODE_STMT:    // no pointer field
    case QUERY_NODE_ALTER_DNODE_STMT:   // no pointer field
618
      break;
619
    case QUERY_NODE_CREATE_INDEX_STMT: {
X
Xiaoyu Wang 已提交
620
      SCreateIndexStmt* pStmt = (SCreateIndexStmt*)pNode;
621
      nodesDestroyNode((SNode*)pStmt->pOptions);
622 623 624
      nodesDestroyList(pStmt->pCols);
      break;
    }
X
Xiaoyu Wang 已提交
625 626 627
    case QUERY_NODE_DROP_INDEX_STMT:    // no pointer field
    case QUERY_NODE_CREATE_QNODE_STMT:  // no pointer field
    case QUERY_NODE_DROP_QNODE_STMT:    // no pointer field
628 629 630 631 632 633
    case QUERY_NODE_CREATE_BNODE_STMT:  // no pointer field
    case QUERY_NODE_DROP_BNODE_STMT:    // no pointer field
    case QUERY_NODE_CREATE_SNODE_STMT:  // no pointer field
    case QUERY_NODE_DROP_SNODE_STMT:    // no pointer field
    case QUERY_NODE_CREATE_MNODE_STMT:  // no pointer field
    case QUERY_NODE_DROP_MNODE_STMT:    // no pointer field
X
Xiaoyu Wang 已提交
634 635 636 637
      break;
    case QUERY_NODE_CREATE_TOPIC_STMT:
      nodesDestroyNode(((SCreateTopicStmt*)pNode)->pQuery);
      break;
X
Xiaoyu Wang 已提交
638
    case QUERY_NODE_DROP_TOPIC_STMT:   // no pointer field
639
    case QUERY_NODE_DROP_CGROUP_STMT:  // no pointer field
X
Xiaoyu Wang 已提交
640
    case QUERY_NODE_ALTER_LOCAL_STMT:  // no pointer field
X
Xiaoyu Wang 已提交
641
      break;
642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673
    case QUERY_NODE_EXPLAIN_STMT: {
      SExplainStmt* pStmt = (SExplainStmt*)pNode;
      nodesDestroyNode((SNode*)pStmt->pOptions);
      nodesDestroyNode(pStmt->pQuery);
      break;
    }
    case QUERY_NODE_DESCRIBE_STMT:
      taosMemoryFree(((SDescribeStmt*)pNode)->pMeta);
      break;
    case QUERY_NODE_RESET_QUERY_CACHE_STMT:  // no pointer field
    case QUERY_NODE_COMPACT_STMT:            // no pointer field
    case QUERY_NODE_CREATE_FUNCTION_STMT:    // no pointer field
    case QUERY_NODE_DROP_FUNCTION_STMT:      // no pointer field
      break;
    case QUERY_NODE_CREATE_STREAM_STMT: {
      SCreateStreamStmt* pStmt = (SCreateStreamStmt*)pNode;
      nodesDestroyNode((SNode*)pStmt->pOptions);
      nodesDestroyNode(pStmt->pQuery);
      break;
    }
    case QUERY_NODE_DROP_STREAM_STMT:     // no pointer field
    case QUERY_NODE_BALANCE_VGROUP_STMT:  // no pointer field
    case QUERY_NODE_MERGE_VGROUP_STMT:    // no pointer field
      break;
    case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
      nodesDestroyList(((SRedistributeVgroupStmt*)pNode)->pDnodes);
      break;
    case QUERY_NODE_SPLIT_VGROUP_STMT:  // no pointer field
    case QUERY_NODE_SYNCDB_STMT:        // no pointer field
    case QUERY_NODE_GRANT_STMT:         // no pointer field
    case QUERY_NODE_REVOKE_STMT:        // no pointer field
      break;
X
Xiaoyu Wang 已提交
674 675 676 677
    case QUERY_NODE_SHOW_DNODES_STMT:
    case QUERY_NODE_SHOW_MNODES_STMT:
    case QUERY_NODE_SHOW_MODULES_STMT:
    case QUERY_NODE_SHOW_QNODES_STMT:
678 679 680 681
    case QUERY_NODE_SHOW_SNODES_STMT:
    case QUERY_NODE_SHOW_BNODES_STMT:
    case QUERY_NODE_SHOW_CLUSTER_STMT:
    case QUERY_NODE_SHOW_DATABASES_STMT:
X
Xiaoyu Wang 已提交
682 683
    case QUERY_NODE_SHOW_FUNCTIONS_STMT:
    case QUERY_NODE_SHOW_INDEXES_STMT:
684 685 686 687
    case QUERY_NODE_SHOW_STABLES_STMT:
    case QUERY_NODE_SHOW_STREAMS_STMT:
    case QUERY_NODE_SHOW_TABLES_STMT:
    case QUERY_NODE_SHOW_USERS_STMT:
X
Xiaoyu Wang 已提交
688
    case QUERY_NODE_SHOW_LICENCES_STMT:
689 690 691 692 693 694 695 696
    case QUERY_NODE_SHOW_VGROUPS_STMT:
    case QUERY_NODE_SHOW_TOPICS_STMT:
    case QUERY_NODE_SHOW_CONSUMERS_STMT:
    case QUERY_NODE_SHOW_CONNECTIONS_STMT:
    case QUERY_NODE_SHOW_QUERIES_STMT:
    case QUERY_NODE_SHOW_VNODES_STMT:
    case QUERY_NODE_SHOW_APPS_STMT:
    case QUERY_NODE_SHOW_SCORES_STMT:
697 698
    case QUERY_NODE_SHOW_VARIABLES_STMT:
    case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT:
699
    case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
700 701
    case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT:
    case QUERY_NODE_SHOW_TAGS_STMT: {
X
Xiaoyu Wang 已提交
702 703
      SShowStmt* pStmt = (SShowStmt*)pNode;
      nodesDestroyNode(pStmt->pDbName);
704
      nodesDestroyNode(pStmt->pTbName);
X
Xiaoyu Wang 已提交
705 706
      break;
    }
707 708
    case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
      nodesDestroyNode(((SShowDnodeVariablesStmt*)pNode)->pDnodeId);
709
      break;
710 711 712 713 714
    case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
      taosMemoryFreeClear(((SShowCreateDatabaseStmt*)pNode)->pCfg);
      break;
    case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
    case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
X
Xiaoyu Wang 已提交
715 716
      taosMemoryFreeClear(((SShowCreateTableStmt*)pNode)->pDbCfg);
      destroyTableCfg((STableCfg*)(((SShowCreateTableStmt*)pNode)->pTableCfg));
717 718 719 720 721
      break;
    case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT:  // no pointer field
    case QUERY_NODE_KILL_CONNECTION_STMT:         // no pointer field
    case QUERY_NODE_KILL_QUERY_STMT:              // no pointer field
    case QUERY_NODE_KILL_TRANSACTION_STMT:        // no pointer field
722 723 724 725 726 727
      break;
    case QUERY_NODE_DELETE_STMT: {
      SDeleteStmt* pStmt = (SDeleteStmt*)pNode;
      nodesDestroyNode(pStmt->pFromTable);
      nodesDestroyNode(pStmt->pWhere);
      nodesDestroyNode(pStmt->pCountFunc);
X
Xiaoyu Wang 已提交
728
      nodesDestroyNode(pStmt->pTagCond);
729 730
      break;
    }
731 732 733 734 735 736 737
    case QUERY_NODE_INSERT_STMT: {
      SInsertStmt* pStmt = (SInsertStmt*)pNode;
      nodesDestroyNode(pStmt->pTable);
      nodesDestroyList(pStmt->pCols);
      nodesDestroyNode(pStmt->pQuery);
      break;
    }
738 739 740 741 742 743 744 745 746 747
    case QUERY_NODE_QUERY: {
      SQuery* pQuery = (SQuery*)pNode;
      nodesDestroyNode(pQuery->pRoot);
      taosMemoryFreeClear(pQuery->pResSchema);
      if (NULL != pQuery->pCmdMsg) {
        taosMemoryFreeClear(pQuery->pCmdMsg->pMsg);
        taosMemoryFreeClear(pQuery->pCmdMsg);
      }
      taosArrayDestroy(pQuery->pDbList);
      taosArrayDestroy(pQuery->pTableList);
D
dapan1121 已提交
748
      taosArrayDestroy(pQuery->pTargetTableList);
749 750
      taosArrayDestroy(pQuery->pPlaceholderValues);
      nodesDestroyNode(pQuery->pPrepareRoot);
751 752
      break;
    }
X
Xiaoyu Wang 已提交
753 754 755 756
    case QUERY_NODE_LOGIC_PLAN_SCAN: {
      SScanLogicNode* pLogicNode = (SScanLogicNode*)pNode;
      destroyLogicNode((SLogicNode*)pLogicNode);
      nodesDestroyList(pLogicNode->pScanCols);
X
Xiaoyu Wang 已提交
757
      nodesDestroyList(pLogicNode->pScanPseudoCols);
X
Xiaoyu Wang 已提交
758
      taosMemoryFreeClear(pLogicNode->pVgroupList);
X
Xiaoyu Wang 已提交
759 760 761
      nodesDestroyList(pLogicNode->pDynamicScanFuncs);
      nodesDestroyNode(pLogicNode->pTagCond);
      nodesDestroyNode(pLogicNode->pTagIndexCond);
762
      taosArrayDestroyEx(pLogicNode->pSmaIndexes, destroySmaIndex);
763
      nodesDestroyList(pLogicNode->pGroupTags);
X
Xiaoyu Wang 已提交
764 765 766 767 768
      break;
    }
    case QUERY_NODE_LOGIC_PLAN_JOIN: {
      SJoinLogicNode* pLogicNode = (SJoinLogicNode*)pNode;
      destroyLogicNode((SLogicNode*)pLogicNode);
769
      nodesDestroyNode(pLogicNode->pMergeCondition);
X
Xiaoyu Wang 已提交
770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785
      nodesDestroyNode(pLogicNode->pOnConditions);
      break;
    }
    case QUERY_NODE_LOGIC_PLAN_AGG: {
      SAggLogicNode* pLogicNode = (SAggLogicNode*)pNode;
      destroyLogicNode((SLogicNode*)pLogicNode);
      nodesDestroyList(pLogicNode->pAggFuncs);
      nodesDestroyList(pLogicNode->pGroupKeys);
      break;
    }
    case QUERY_NODE_LOGIC_PLAN_PROJECT: {
      SProjectLogicNode* pLogicNode = (SProjectLogicNode*)pNode;
      destroyLogicNode((SLogicNode*)pLogicNode);
      nodesDestroyList(pLogicNode->pProjections);
      break;
    }
X
Xiaoyu Wang 已提交
786 787
    case QUERY_NODE_LOGIC_PLAN_VNODE_MODIFY: {
      SVnodeModifyLogicNode* pLogicNode = (SVnodeModifyLogicNode*)pNode;
X
Xiaoyu Wang 已提交
788 789
      destroyLogicNode((SLogicNode*)pLogicNode);
      destroyVgDataBlockArray(pLogicNode->pDataBlocks);
X
bugfix  
Xiaoyu Wang 已提交
790
      // pVgDataBlocks is weak reference
791 792 793
      nodesDestroyNode(pLogicNode->pAffectedRows);
      taosMemoryFreeClear(pLogicNode->pVgroupList);
      nodesDestroyList(pLogicNode->pInsertCols);
X
Xiaoyu Wang 已提交
794 795 796 797 798
      break;
    }
    case QUERY_NODE_LOGIC_PLAN_EXCHANGE:
      destroyLogicNode((SLogicNode*)pNode);
      break;
799 800 801 802 803 804 805
    case QUERY_NODE_LOGIC_PLAN_MERGE: {
      SMergeLogicNode* pLogicNode = (SMergeLogicNode*)pNode;
      destroyLogicNode((SLogicNode*)pLogicNode);
      nodesDestroyList(pLogicNode->pMergeKeys);
      nodesDestroyList(pLogicNode->pInputs);
      break;
    }
X
Xiaoyu Wang 已提交
806 807 808 809 810
    case QUERY_NODE_LOGIC_PLAN_WINDOW: {
      SWindowLogicNode* pLogicNode = (SWindowLogicNode*)pNode;
      destroyLogicNode((SLogicNode*)pLogicNode);
      nodesDestroyList(pLogicNode->pFuncs);
      nodesDestroyNode(pLogicNode->pTspk);
5
54liuyao 已提交
811
      nodesDestroyNode(pLogicNode->pTsEnd);
812
      nodesDestroyNode(pLogicNode->pStateExpr);
X
Xiaoyu Wang 已提交
813 814
      break;
    }
815 816 817 818 819
    case QUERY_NODE_LOGIC_PLAN_FILL: {
      SFillLogicNode* pLogicNode = (SFillLogicNode*)pNode;
      destroyLogicNode((SLogicNode*)pLogicNode);
      nodesDestroyNode(pLogicNode->pWStartTs);
      nodesDestroyNode(pLogicNode->pValues);
F
freemine 已提交
820
      nodesDestroyList(pLogicNode->pFillExprs);
821 822
      break;
    }
X
Xiaoyu Wang 已提交
823 824 825 826 827 828 829 830 831 832 833 834
    case QUERY_NODE_LOGIC_PLAN_SORT: {
      SSortLogicNode* pLogicNode = (SSortLogicNode*)pNode;
      destroyLogicNode((SLogicNode*)pLogicNode);
      nodesDestroyList(pLogicNode->pSortKeys);
      break;
    }
    case QUERY_NODE_LOGIC_PLAN_PARTITION: {
      SPartitionLogicNode* pLogicNode = (SPartitionLogicNode*)pNode;
      destroyLogicNode((SLogicNode*)pLogicNode);
      nodesDestroyList(pLogicNode->pPartitionKeys);
      break;
    }
835 836 837
    case QUERY_NODE_LOGIC_PLAN_INDEF_ROWS_FUNC: {
      SIndefRowsFuncLogicNode* pLogicNode = (SIndefRowsFuncLogicNode*)pNode;
      destroyLogicNode((SLogicNode*)pLogicNode);
X
Xiaoyu Wang 已提交
838 839 840 841 842 843 844
      nodesDestroyList(pLogicNode->pFuncs);
      break;
    }
    case QUERY_NODE_LOGIC_PLAN_INTERP_FUNC: {
      SInterpFuncLogicNode* pLogicNode = (SInterpFuncLogicNode*)pNode;
      destroyLogicNode((SLogicNode*)pLogicNode);
      nodesDestroyList(pLogicNode->pFuncs);
X
Xiaoyu Wang 已提交
845 846
      nodesDestroyNode(pLogicNode->pFillValues);
      nodesDestroyNode(pLogicNode->pTimeSeries);
847 848
      break;
    }
X
Xiaoyu Wang 已提交
849 850 851
    case QUERY_NODE_LOGIC_SUBPLAN: {
      SLogicSubplan* pSubplan = (SLogicSubplan*)pNode;
      nodesDestroyList(pSubplan->pChildren);
852
      nodesDestroyNode((SNode*)pSubplan->pNode);
X
bugfix  
Xiaoyu Wang 已提交
853
      nodesClearList(pSubplan->pParents);
X
Xiaoyu Wang 已提交
854 855 856 857 858 859 860 861
      taosMemoryFreeClear(pSubplan->pVgroupList);
      break;
    }
    case QUERY_NODE_LOGIC_PLAN:
      nodesDestroyList(((SQueryLogicPlan*)pNode)->pTopSubplans);
      break;
    case QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN:
    case QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN:
862
    case QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN:
X
Xiaoyu Wang 已提交
863 864
      destroyScanPhysiNode((SScanPhysiNode*)pNode);
      break;
865 866 867 868 869 870
    case QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN: {
      SLastRowScanPhysiNode* pPhyNode = (SLastRowScanPhysiNode*)pNode;
      destroyScanPhysiNode((SScanPhysiNode*)pNode);
      nodesDestroyList(pPhyNode->pGroupTags);
      break;
    }
X
Xiaoyu Wang 已提交
871 872 873 874 875 876 877
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN:
    case QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN:
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN: {
      STableScanPhysiNode* pPhyNode = (STableScanPhysiNode*)pNode;
      destroyScanPhysiNode((SScanPhysiNode*)pNode);
      nodesDestroyList(pPhyNode->pDynamicScanFuncs);
878
      nodesDestroyList(pPhyNode->pGroupTags);
X
Xiaoyu Wang 已提交
879 880
      break;
    }
X
Xiaoyu Wang 已提交
881 882 883 884 885 886
    case QUERY_NODE_PHYSICAL_PLAN_PROJECT: {
      SProjectPhysiNode* pPhyNode = (SProjectPhysiNode*)pNode;
      destroyPhysiNode((SPhysiNode*)pPhyNode);
      nodesDestroyList(pPhyNode->pProjections);
      break;
    }
887
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN: {
888
      SSortMergeJoinPhysiNode* pPhyNode = (SSortMergeJoinPhysiNode*)pNode;
X
Xiaoyu Wang 已提交
889
      destroyPhysiNode((SPhysiNode*)pPhyNode);
890
      nodesDestroyNode(pPhyNode->pMergeCondition);
X
Xiaoyu Wang 已提交
891 892 893 894
      nodesDestroyNode(pPhyNode->pOnConditions);
      nodesDestroyList(pPhyNode->pTargets);
      break;
    }
895
    case QUERY_NODE_PHYSICAL_PLAN_HASH_AGG: {
X
Xiaoyu Wang 已提交
896 897 898 899 900 901 902 903 904 905 906 907 908
      SAggPhysiNode* pPhyNode = (SAggPhysiNode*)pNode;
      destroyPhysiNode((SPhysiNode*)pPhyNode);
      nodesDestroyList(pPhyNode->pExprs);
      nodesDestroyList(pPhyNode->pAggFuncs);
      nodesDestroyList(pPhyNode->pGroupKeys);
      break;
    }
    case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE: {
      SExchangePhysiNode* pPhyNode = (SExchangePhysiNode*)pNode;
      destroyPhysiNode((SPhysiNode*)pPhyNode);
      nodesDestroyList(pPhyNode->pSrcEndPoints);
      break;
    }
909 910 911 912 913 914 915
    case QUERY_NODE_PHYSICAL_PLAN_MERGE: {
      SMergePhysiNode* pPhyNode = (SMergePhysiNode*)pNode;
      destroyPhysiNode((SPhysiNode*)pPhyNode);
      nodesDestroyList(pPhyNode->pMergeKeys);
      nodesDestroyList(pPhyNode->pTargets);
      break;
    }
916 917
    case QUERY_NODE_PHYSICAL_PLAN_SORT:
    case QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT: {
X
Xiaoyu Wang 已提交
918 919
      SSortPhysiNode* pPhyNode = (SSortPhysiNode*)pNode;
      destroyPhysiNode((SPhysiNode*)pPhyNode);
920 921
      nodesDestroyList(pPhyNode->pExprs);
      nodesDestroyList(pPhyNode->pSortKeys);
X
Xiaoyu Wang 已提交
922
      nodesDestroyList(pPhyNode->pTargets);
X
Xiaoyu Wang 已提交
923 924
      break;
    }
X
Xiaoyu Wang 已提交
925
    case QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL:
926
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL:
X
Xiaoyu Wang 已提交
927
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL:
928 929
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL:
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL:
X
Xiaoyu Wang 已提交
930
      destroyWinodwPhysiNode((SWinodwPhysiNode*)pNode);
X
Xiaoyu Wang 已提交
931
      break;
932 933 934
    case QUERY_NODE_PHYSICAL_PLAN_FILL: {
      SFillPhysiNode* pPhyNode = (SFillPhysiNode*)pNode;
      destroyPhysiNode((SPhysiNode*)pPhyNode);
935 936
      nodesDestroyList(pPhyNode->pFillExprs);
      nodesDestroyList(pPhyNode->pNotFillExprs);
937 938 939 940
      nodesDestroyNode(pPhyNode->pWStartTs);
      nodesDestroyNode(pPhyNode->pValues);
      break;
    }
941 942
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_SESSION:
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION:
943
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION:
944
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION:
X
Xiaoyu Wang 已提交
945 946
      destroyWinodwPhysiNode((SWinodwPhysiNode*)pNode);
      break;
947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965
    case QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE:
    case QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE: {
      SStateWinodwPhysiNode* pPhyNode = (SStateWinodwPhysiNode*)pNode;
      destroyWinodwPhysiNode((SWinodwPhysiNode*)pPhyNode);
      nodesDestroyNode(pPhyNode->pStateKey);
      break;
    }
    case QUERY_NODE_PHYSICAL_PLAN_PARTITION: {
      SPartitionPhysiNode* pPhyNode = (SPartitionPhysiNode*)pNode;
      destroyPhysiNode((SPhysiNode*)pPhyNode);
      nodesDestroyList(pPhyNode->pExprs);
      nodesDestroyList(pPhyNode->pPartitionKeys);
      nodesDestroyList(pPhyNode->pTargets);
      break;
    }
    case QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC: {
      SIndefRowsFuncPhysiNode* pPhyNode = (SIndefRowsFuncPhysiNode*)pNode;
      destroyPhysiNode((SPhysiNode*)pPhyNode);
      nodesDestroyList(pPhyNode->pExprs);
X
Xiaoyu Wang 已提交
966 967 968 969 970 971 972 973
      nodesDestroyList(pPhyNode->pFuncs);
      break;
    }
    case QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC: {
      SInterpFuncPhysiNode* pPhyNode = (SInterpFuncPhysiNode*)pNode;
      destroyPhysiNode((SPhysiNode*)pPhyNode);
      nodesDestroyList(pPhyNode->pExprs);
      nodesDestroyList(pPhyNode->pFuncs);
X
Xiaoyu Wang 已提交
974 975
      nodesDestroyNode(pPhyNode->pFillValues);
      nodesDestroyNode(pPhyNode->pTimeSeries);
976 977
      break;
    }
X
Xiaoyu Wang 已提交
978 979 980 981 982 983 984 985 986
    case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
      destroyDataSinkNode((SDataSinkNode*)pNode);
      break;
    case QUERY_NODE_PHYSICAL_PLAN_INSERT: {
      SDataInserterNode* pSink = (SDataInserterNode*)pNode;
      destroyDataSinkNode((SDataSinkNode*)pSink);
      taosMemoryFreeClear(pSink->pData);
      break;
    }
987 988 989
    case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT: {
      SQueryInserterNode* pSink = (SQueryInserterNode*)pNode;
      destroyDataSinkNode((SDataSinkNode*)pSink);
D
dapan1121 已提交
990
      nodesDestroyList(pSink->pCols);
991 992
      break;
    }
993 994 995 996 997 998
    case QUERY_NODE_PHYSICAL_PLAN_DELETE: {
      SDataDeleterNode* pSink = (SDataDeleterNode*)pNode;
      destroyDataSinkNode((SDataSinkNode*)pSink);
      nodesDestroyNode(pSink->pAffectedRows);
      break;
    }
X
Xiaoyu Wang 已提交
999 1000
    case QUERY_NODE_PHYSICAL_SUBPLAN: {
      SSubplan* pSubplan = (SSubplan*)pNode;
X
Xiaoyu Wang 已提交
1001
      nodesClearList(pSubplan->pChildren);
1002 1003
      nodesDestroyNode((SNode*)pSubplan->pNode);
      nodesDestroyNode((SNode*)pSubplan->pDataSink);
X
Xiaoyu Wang 已提交
1004 1005
      nodesDestroyNode((SNode*)pSubplan->pTagCond);
      nodesDestroyNode((SNode*)pSubplan->pTagIndexCond);
X
bugfix  
Xiaoyu Wang 已提交
1006 1007 1008
      nodesClearList(pSubplan->pParents);
      break;
    }
1009 1010
    case QUERY_NODE_PHYSICAL_PLAN:
      nodesDestroyList(((SQueryPlan*)pNode)->pSubplans);
X
Xiaoyu Wang 已提交
1011
      break;
1012 1013 1014
    default:
      break;
  }
X
Xiaoyu Wang 已提交
1015 1016
  taosMemoryFreeClear(pNode);
  return;
1017 1018
}

1019
SNodeList* nodesMakeList() {
wafwerar's avatar
wafwerar 已提交
1020
  SNodeList* p = taosMemoryCalloc(1, sizeof(SNodeList));
1021 1022 1023 1024 1025 1026
  if (NULL == p) {
    return NULL;
  }
  return p;
}

1027
int32_t nodesListAppend(SNodeList* pList, SNode* pNode) {
1028
  if (NULL == pList || NULL == pNode) {
X
Xiaoyu Wang 已提交
1029
    return TSDB_CODE_FAILED;
1030
  }
wafwerar's avatar
wafwerar 已提交
1031
  SListCell* p = taosMemoryCalloc(1, sizeof(SListCell));
1032
  if (NULL == p) {
X
Xiaoyu Wang 已提交
1033 1034
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return TSDB_CODE_OUT_OF_MEMORY;
1035 1036
  }
  p->pNode = pNode;
1037 1038 1039 1040 1041 1042
  if (NULL == pList->pHead) {
    pList->pHead = p;
  }
  if (NULL != pList->pTail) {
    pList->pTail->pNext = p;
  }
1043
  p->pPrev = pList->pTail;
1044
  pList->pTail = p;
1045
  ++(pList->length);
X
Xiaoyu Wang 已提交
1046
  return TSDB_CODE_SUCCESS;
1047 1048
}

1049
int32_t nodesListStrictAppend(SNodeList* pList, SNode* pNode) {
1050
  if (NULL == pNode) {
X
Xiaoyu Wang 已提交
1051
    terrno = TSDB_CODE_OUT_OF_MEMORY;
1052 1053 1054 1055 1056 1057 1058 1059 1060
    return TSDB_CODE_OUT_OF_MEMORY;
  }
  int32_t code = nodesListAppend(pList, pNode);
  if (TSDB_CODE_SUCCESS != code) {
    nodesDestroyNode(pNode);
  }
  return code;
}

1061
int32_t nodesListMakeAppend(SNodeList** pList, SNode* pNode) {
X
Xiaoyu Wang 已提交
1062 1063 1064 1065 1066 1067 1068 1069 1070 1071
  if (NULL == *pList) {
    *pList = nodesMakeList();
    if (NULL == *pList) {
      terrno = TSDB_CODE_OUT_OF_MEMORY;
      return TSDB_CODE_OUT_OF_MEMORY;
    }
  }
  return nodesListAppend(*pList, pNode);
}

1072
int32_t nodesListMakeStrictAppend(SNodeList** pList, SNode* pNode) {
S
Shengliang Guan 已提交
1073 1074 1075 1076 1077 1078 1079 1080 1081 1082
  if (NULL == *pList) {
    *pList = nodesMakeList();
    if (NULL == *pList) {
      terrno = TSDB_CODE_OUT_OF_MEMORY;
      return TSDB_CODE_OUT_OF_MEMORY;
    }
  }
  return nodesListStrictAppend(*pList, pNode);
}

X
Xiaoyu Wang 已提交
1083
int32_t nodesListAppendList(SNodeList* pTarget, SNodeList* pSrc) {
X
Xiaoyu Wang 已提交
1084
  if (NULL == pTarget || NULL == pSrc) {
X
Xiaoyu Wang 已提交
1085
    return TSDB_CODE_FAILED;
X
Xiaoyu Wang 已提交
1086 1087 1088 1089 1090 1091 1092 1093 1094 1095
  }

  if (NULL == pTarget->pHead) {
    pTarget->pHead = pSrc->pHead;
  } else {
    pTarget->pTail->pNext = pSrc->pHead;
    if (NULL != pSrc->pHead) {
      pSrc->pHead->pPrev = pTarget->pTail;
    }
  }
X
Xiaoyu Wang 已提交
1096 1097
  pTarget->pTail = pSrc->pTail;
  pTarget->length += pSrc->length;
wafwerar's avatar
wafwerar 已提交
1098
  taosMemoryFreeClear(pSrc);
X
Xiaoyu Wang 已提交
1099

X
Xiaoyu Wang 已提交
1100 1101 1102
  return TSDB_CODE_SUCCESS;
}

1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113
int32_t nodesListStrictAppendList(SNodeList* pTarget, SNodeList* pSrc) {
  if (NULL == pSrc) {
    return TSDB_CODE_OUT_OF_MEMORY;
  }
  int32_t code = nodesListAppendList(pTarget, pSrc);
  if (TSDB_CODE_SUCCESS != code) {
    nodesDestroyList(pSrc);
  }
  return code;
}

1114
int32_t nodesListPushFront(SNodeList* pList, SNode* pNode) {
X
Xiaoyu Wang 已提交
1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132
  if (NULL == pList || NULL == pNode) {
    return TSDB_CODE_FAILED;
  }
  SListCell* p = taosMemoryCalloc(1, sizeof(SListCell));
  if (NULL == p) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return TSDB_CODE_OUT_OF_MEMORY;
  }
  p->pNode = pNode;
  if (NULL != pList->pHead) {
    pList->pHead->pPrev = p;
    p->pNext = pList->pHead;
  }
  pList->pHead = p;
  ++(pList->length);
  return TSDB_CODE_SUCCESS;
}

1133 1134 1135 1136 1137
SListCell* nodesListErase(SNodeList* pList, SListCell* pCell) {
  if (NULL == pCell->pPrev) {
    pList->pHead = pCell->pNext;
  } else {
    pCell->pPrev->pNext = pCell->pNext;
X
Xiaoyu Wang 已提交
1138 1139 1140 1141
  }
  if (NULL == pCell->pNext) {
    pList->pTail = pCell->pPrev;
  } else {
1142 1143 1144
    pCell->pNext->pPrev = pCell->pPrev;
  }
  SListCell* pNext = pCell->pNext;
X
Xiaoyu Wang 已提交
1145
  nodesDestroyNode(pCell->pNode);
wafwerar's avatar
wafwerar 已提交
1146
  taosMemoryFreeClear(pCell);
1147 1148 1149 1150
  --(pList->length);
  return pNext;
}

X
Xiaoyu Wang 已提交
1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168
void nodesListInsertList(SNodeList* pTarget, SListCell* pPos, SNodeList* pSrc) {
  if (NULL == pTarget || NULL == pPos || NULL == pSrc) {
    return;
  }

  if (NULL == pPos->pPrev) {
    pTarget->pHead = pSrc->pHead;
  } else {
    pPos->pPrev->pNext = pSrc->pHead;
  }
  pSrc->pHead->pPrev = pPos->pPrev;
  pSrc->pTail->pNext = pPos;
  pPos->pPrev = pSrc->pTail;

  pTarget->length += pSrc->length;
  taosMemoryFreeClear(pSrc);
}

1169
SNode* nodesListGetNode(SNodeList* pList, int32_t index) {
1170 1171 1172 1173 1174 1175 1176 1177 1178
  SNode* node;
  FOREACH(node, pList) {
    if (0 == index--) {
      return node;
    }
  }
  return NULL;
}

X
Xiaoyu Wang 已提交
1179 1180 1181 1182 1183 1184 1185 1186 1187 1188
SListCell* nodesListGetCell(SNodeList* pList, int32_t index) {
  SNode* node;
  FOREACH(node, pList) {
    if (0 == index--) {
      return cell;
    }
  }
  return NULL;
}

1189
void nodesDestroyList(SNodeList* pList) {
1190 1191 1192
  if (NULL == pList) {
    return;
  }
X
Xiaoyu Wang 已提交
1193

D
dapan1121 已提交
1194 1195 1196
  SListCell* pNext = pList->pHead;
  while (NULL != pNext) {
    pNext = nodesListErase(pList, pNext);
1197
  }
wafwerar's avatar
wafwerar 已提交
1198
  taosMemoryFreeClear(pList);
1199 1200
}

X
Xiaoyu Wang 已提交
1201 1202 1203 1204 1205 1206 1207 1208 1209
void nodesClearList(SNodeList* pList) {
  if (NULL == pList) {
    return;
  }

  SListCell* pNext = pList->pHead;
  while (NULL != pNext) {
    SListCell* tmp = pNext;
    pNext = pNext->pNext;
wafwerar's avatar
wafwerar 已提交
1210
    taosMemoryFreeClear(tmp);
X
Xiaoyu Wang 已提交
1211
  }
wafwerar's avatar
wafwerar 已提交
1212
  taosMemoryFreeClear(pList);
X
Xiaoyu Wang 已提交
1213 1214
}

X
Xiaoyu Wang 已提交
1215
void* nodesGetValueFromNode(SValueNode* pNode) {
D
dapan1121 已提交
1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227
  switch (pNode->node.resType.type) {
    case TSDB_DATA_TYPE_BOOL:
    case TSDB_DATA_TYPE_TINYINT:
    case TSDB_DATA_TYPE_SMALLINT:
    case TSDB_DATA_TYPE_INT:
    case TSDB_DATA_TYPE_BIGINT:
    case TSDB_DATA_TYPE_TIMESTAMP:
    case TSDB_DATA_TYPE_UTINYINT:
    case TSDB_DATA_TYPE_USMALLINT:
    case TSDB_DATA_TYPE_UINT:
    case TSDB_DATA_TYPE_UBIGINT:
    case TSDB_DATA_TYPE_FLOAT:
1228
    case TSDB_DATA_TYPE_DOUBLE:
D
dapan1121 已提交
1229
      return (void*)&pNode->typeData;
D
dapan1121 已提交
1230 1231
    case TSDB_DATA_TYPE_NCHAR:
    case TSDB_DATA_TYPE_VARCHAR:
1232
    case TSDB_DATA_TYPE_VARBINARY:
wmmhello's avatar
wmmhello 已提交
1233
    case TSDB_DATA_TYPE_JSON:
X
Xiaoyu Wang 已提交
1234
      return (void*)pNode->datum.p;
D
dapan1121 已提交
1235 1236 1237 1238 1239 1240 1241
    default:
      break;
  }

  return NULL;
}

X
Xiaoyu Wang 已提交
1242
int32_t nodesSetValueNodeValue(SValueNode* pNode, void* value) {
D
dapan1121 已提交
1243 1244 1245
  switch (pNode->node.resType.type) {
    case TSDB_DATA_TYPE_BOOL:
      pNode->datum.b = *(bool*)value;
D
dapan1121 已提交
1246
      *(bool*)&pNode->typeData = pNode->datum.b;
D
dapan1121 已提交
1247 1248 1249
      break;
    case TSDB_DATA_TYPE_TINYINT:
      pNode->datum.i = *(int8_t*)value;
D
dapan1121 已提交
1250
      *(int8_t*)&pNode->typeData = pNode->datum.i;
D
dapan1121 已提交
1251 1252 1253
      break;
    case TSDB_DATA_TYPE_SMALLINT:
      pNode->datum.i = *(int16_t*)value;
D
dapan1121 已提交
1254
      *(int16_t*)&pNode->typeData = pNode->datum.i;
D
dapan1121 已提交
1255 1256 1257
      break;
    case TSDB_DATA_TYPE_INT:
      pNode->datum.i = *(int32_t*)value;
D
dapan1121 已提交
1258
      *(int32_t*)&pNode->typeData = pNode->datum.i;
D
dapan1121 已提交
1259 1260 1261
      break;
    case TSDB_DATA_TYPE_BIGINT:
      pNode->datum.i = *(int64_t*)value;
D
dapan1121 已提交
1262
      *(int64_t*)&pNode->typeData = pNode->datum.i;
D
dapan1121 已提交
1263 1264 1265
      break;
    case TSDB_DATA_TYPE_TIMESTAMP:
      pNode->datum.i = *(int64_t*)value;
D
dapan1121 已提交
1266
      *(int64_t*)&pNode->typeData = pNode->datum.i;
D
dapan1121 已提交
1267 1268 1269
      break;
    case TSDB_DATA_TYPE_UTINYINT:
      pNode->datum.u = *(int8_t*)value;
D
dapan1121 已提交
1270
      *(int8_t*)&pNode->typeData = pNode->datum.u;
D
dapan1121 已提交
1271 1272 1273
      break;
    case TSDB_DATA_TYPE_USMALLINT:
      pNode->datum.u = *(int16_t*)value;
D
dapan1121 已提交
1274
      *(int16_t*)&pNode->typeData = pNode->datum.u;
D
dapan1121 已提交
1275 1276 1277
      break;
    case TSDB_DATA_TYPE_UINT:
      pNode->datum.u = *(int32_t*)value;
D
dapan1121 已提交
1278
      *(int32_t*)&pNode->typeData = pNode->datum.u;
D
dapan1121 已提交
1279 1280 1281
      break;
    case TSDB_DATA_TYPE_UBIGINT:
      pNode->datum.u = *(uint64_t*)value;
D
dapan1121 已提交
1282
      *(uint64_t*)&pNode->typeData = pNode->datum.u;
D
dapan1121 已提交
1283 1284 1285
      break;
    case TSDB_DATA_TYPE_FLOAT:
      pNode->datum.d = *(float*)value;
D
dapan1121 已提交
1286
      *(float*)&pNode->typeData = pNode->datum.d;
D
dapan1121 已提交
1287 1288 1289
      break;
    case TSDB_DATA_TYPE_DOUBLE:
      pNode->datum.d = *(double*)value;
D
dapan1121 已提交
1290
      *(double*)&pNode->typeData = pNode->datum.d;
D
dapan1121 已提交
1291 1292 1293 1294
      break;
    case TSDB_DATA_TYPE_NCHAR:
    case TSDB_DATA_TYPE_VARCHAR:
    case TSDB_DATA_TYPE_VARBINARY:
wmmhello's avatar
wmmhello 已提交
1295
    case TSDB_DATA_TYPE_JSON:
D
dapan1121 已提交
1296 1297 1298 1299 1300 1301 1302 1303 1304
      pNode->datum.p = (char*)value;
      break;
    default:
      return TSDB_CODE_QRY_APP_ERROR;
  }

  return TSDB_CODE_SUCCESS;
}

X
Xiaoyu Wang 已提交
1305
char* nodesGetStrValueFromNode(SValueNode* pNode) {
D
dapan1121 已提交
1306
  switch (pNode->node.resType.type) {
D
dapan1121 已提交
1307
    case TSDB_DATA_TYPE_BOOL: {
X
Xiaoyu Wang 已提交
1308
      void* buf = taosMemoryMalloc(MAX_NUM_STR_SIZE);
D
dapan1121 已提交
1309 1310 1311
      if (NULL == buf) {
        return NULL;
      }
1312

D
dapan1121 已提交
1313 1314
      sprintf(buf, "%s", pNode->datum.b ? "true" : "false");
      return buf;
D
dapan1121 已提交
1315
    }
D
dapan1121 已提交
1316 1317 1318 1319 1320
    case TSDB_DATA_TYPE_TINYINT:
    case TSDB_DATA_TYPE_SMALLINT:
    case TSDB_DATA_TYPE_INT:
    case TSDB_DATA_TYPE_BIGINT:
    case TSDB_DATA_TYPE_TIMESTAMP: {
X
Xiaoyu Wang 已提交
1321
      void* buf = taosMemoryMalloc(MAX_NUM_STR_SIZE);
D
dapan1121 已提交
1322 1323 1324
      if (NULL == buf) {
        return NULL;
      }
1325

D
dapan1121 已提交
1326 1327 1328 1329 1330 1331 1332
      sprintf(buf, "%" PRId64, pNode->datum.i);
      return buf;
    }
    case TSDB_DATA_TYPE_UTINYINT:
    case TSDB_DATA_TYPE_USMALLINT:
    case TSDB_DATA_TYPE_UINT:
    case TSDB_DATA_TYPE_UBIGINT: {
X
Xiaoyu Wang 已提交
1333
      void* buf = taosMemoryMalloc(MAX_NUM_STR_SIZE);
D
dapan1121 已提交
1334 1335 1336
      if (NULL == buf) {
        return NULL;
      }
1337

D
dapan1121 已提交
1338 1339 1340 1341 1342
      sprintf(buf, "%" PRIu64, pNode->datum.u);
      return buf;
    }
    case TSDB_DATA_TYPE_FLOAT:
    case TSDB_DATA_TYPE_DOUBLE: {
X
Xiaoyu Wang 已提交
1343
      void* buf = taosMemoryMalloc(MAX_NUM_STR_SIZE);
D
dapan1121 已提交
1344 1345 1346
      if (NULL == buf) {
        return NULL;
      }
1347

D
dapan1121 已提交
1348 1349 1350 1351 1352 1353
      sprintf(buf, "%e", pNode->datum.d);
      return buf;
    }
    case TSDB_DATA_TYPE_NCHAR:
    case TSDB_DATA_TYPE_VARCHAR:
    case TSDB_DATA_TYPE_VARBINARY: {
D
dapan1121 已提交
1354
      int32_t bufSize = varDataLen(pNode->datum.p) + 2 + 1;
X
Xiaoyu Wang 已提交
1355
      void*   buf = taosMemoryMalloc(bufSize);
D
dapan1121 已提交
1356 1357 1358
      if (NULL == buf) {
        return NULL;
      }
1359

D
dapan1121 已提交
1360
      snprintf(buf, bufSize, "'%s'", varDataVal(pNode->datum.p));
D
dapan1121 已提交
1361 1362 1363 1364 1365 1366 1367 1368 1369
      return buf;
    }
    default:
      break;
  }

  return NULL;
}

1370 1371
bool nodesIsExprNode(const SNode* pNode) {
  ENodeType type = nodeType(pNode);
X
Xiaoyu Wang 已提交
1372
  return (QUERY_NODE_COLUMN == type || QUERY_NODE_VALUE == type || QUERY_NODE_OPERATOR == type ||
X
Xiaoyu Wang 已提交
1373
          QUERY_NODE_FUNCTION == type || QUERY_NODE_LOGIC_CONDITION == type);
1374 1375
}

X
Xiaoyu Wang 已提交
1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393
bool nodesIsUnaryOp(const SOperatorNode* pOp) {
  switch (pOp->opType) {
    case OP_TYPE_MINUS:
    case OP_TYPE_IS_NULL:
    case OP_TYPE_IS_NOT_NULL:
    case OP_TYPE_IS_TRUE:
    case OP_TYPE_IS_FALSE:
    case OP_TYPE_IS_UNKNOWN:
    case OP_TYPE_IS_NOT_TRUE:
    case OP_TYPE_IS_NOT_FALSE:
    case OP_TYPE_IS_NOT_UNKNOWN:
      return true;
    default:
      break;
  }
  return false;
}

1394 1395 1396 1397 1398 1399
bool nodesIsArithmeticOp(const SOperatorNode* pOp) {
  switch (pOp->opType) {
    case OP_TYPE_ADD:
    case OP_TYPE_SUB:
    case OP_TYPE_MULTI:
    case OP_TYPE_DIV:
1400
    case OP_TYPE_REM:
1401 1402 1403 1404 1405 1406
      return true;
    default:
      break;
  }
  return false;
}
1407

1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421
bool nodesIsComparisonOp(const SOperatorNode* pOp) {
  switch (pOp->opType) {
    case OP_TYPE_GREATER_THAN:
    case OP_TYPE_GREATER_EQUAL:
    case OP_TYPE_LOWER_THAN:
    case OP_TYPE_LOWER_EQUAL:
    case OP_TYPE_EQUAL:
    case OP_TYPE_NOT_EQUAL:
    case OP_TYPE_IN:
    case OP_TYPE_NOT_IN:
    case OP_TYPE_LIKE:
    case OP_TYPE_NOT_LIKE:
    case OP_TYPE_MATCH:
    case OP_TYPE_NMATCH:
1422
    case OP_TYPE_JSON_CONTAINS:
X
Xiaoyu Wang 已提交
1423 1424 1425 1426 1427 1428 1429 1430
    case OP_TYPE_IS_NULL:
    case OP_TYPE_IS_NOT_NULL:
    case OP_TYPE_IS_TRUE:
    case OP_TYPE_IS_FALSE:
    case OP_TYPE_IS_UNKNOWN:
    case OP_TYPE_IS_NOT_TRUE:
    case OP_TYPE_IS_NOT_FALSE:
    case OP_TYPE_IS_NOT_UNKNOWN:
1431 1432 1433 1434 1435
      return true;
    default:
      break;
  }
  return false;
1436 1437
}

1438 1439 1440
bool nodesIsJsonOp(const SOperatorNode* pOp) {
  switch (pOp->opType) {
    case OP_TYPE_JSON_GET_VALUE:
wmmhello's avatar
wmmhello 已提交
1441
    case OP_TYPE_JSON_CONTAINS:
1442 1443 1444 1445 1446 1447
      return true;
    default:
      break;
  }
  return false;
}
1448

X
Xiaoyu Wang 已提交
1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461
bool nodesIsRegularOp(const SOperatorNode* pOp) {
  switch (pOp->opType) {
    case OP_TYPE_LIKE:
    case OP_TYPE_NOT_LIKE:
    case OP_TYPE_MATCH:
    case OP_TYPE_NMATCH:
      return true;
    default:
      break;
  }
  return false;
}

X
Xiaoyu Wang 已提交
1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472
bool nodesIsBitwiseOp(const SOperatorNode* pOp) {
  switch (pOp->opType) {
    case OP_TYPE_BIT_AND:
    case OP_TYPE_BIT_OR:
      return true;
    default:
      break;
  }
  return false;
}

X
Xiaoyu Wang 已提交
1473
typedef struct SCollectColumnsCxt {
1474 1475 1476 1477 1478
  int32_t         errCode;
  const char*     pTableAlias;
  ECollectColType collectType;
  SNodeList*      pCols;
  SHashObj*       pColHash;
X
Xiaoyu Wang 已提交
1479 1480
} SCollectColumnsCxt;

1481
static EDealRes doCollect(SCollectColumnsCxt* pCxt, SColumnNode* pCol, SNode* pNode) {
X
Xiaoyu Wang 已提交
1482
  char    name[TSDB_TABLE_NAME_LEN + TSDB_COL_NAME_LEN];
1483 1484 1485 1486 1487 1488 1489
  int32_t len = 0;
  if ('\0' == pCol->tableAlias[0]) {
    len = sprintf(name, "%s", pCol->colName);
  }
  len = sprintf(name, "%s.%s", pCol->tableAlias, pCol->colName);
  if (NULL == taosHashGet(pCxt->pColHash, name, len)) {
    pCxt->errCode = taosHashPut(pCxt->pColHash, name, len, NULL, 0);
X
Xiaoyu Wang 已提交
1490
    if (TSDB_CODE_SUCCESS == pCxt->errCode) {
1491
      pCxt->errCode = nodesListStrictAppend(pCxt->pCols, nodesCloneNode(pNode));
X
Xiaoyu Wang 已提交
1492 1493 1494 1495 1496 1497
    }
    return (TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_IGNORE_CHILD : DEAL_RES_ERROR);
  }
  return DEAL_RES_CONTINUE;
}

1498 1499 1500 1501 1502 1503
static bool isCollectType(ECollectColType collectType, EColumnType colType) {
  return COLLECT_COL_TYPE_ALL == collectType
             ? true
             : (COLLECT_COL_TYPE_TAG == collectType ? COLUMN_TYPE_TAG == colType : COLUMN_TYPE_TAG != colType);
}

X
Xiaoyu Wang 已提交
1504 1505
static EDealRes collectColumns(SNode* pNode, void* pContext) {
  SCollectColumnsCxt* pCxt = (SCollectColumnsCxt*)pContext;
X
Xiaoyu Wang 已提交
1506
  if (QUERY_NODE_COLUMN == nodeType(pNode)) {
X
Xiaoyu Wang 已提交
1507
    SColumnNode* pCol = (SColumnNode*)pNode;
X
Xiaoyu Wang 已提交
1508
    if (isCollectType(pCxt->collectType, pCol->colType) && 0 != strcmp(pCol->colName, "*") &&
1509
        (NULL == pCxt->pTableAlias || 0 == strcmp(pCxt->pTableAlias, pCol->tableAlias))) {
1510
      return doCollect(pCxt, pCol, pNode);
X
Xiaoyu Wang 已提交
1511 1512 1513 1514 1515
    }
  }
  return DEAL_RES_CONTINUE;
}

1516 1517
int32_t nodesCollectColumns(SSelectStmt* pSelect, ESqlClause clause, const char* pTableAlias, ECollectColType type,
                            SNodeList** pCols) {
X
Xiaoyu Wang 已提交
1518
  if (NULL == pSelect || NULL == pCols) {
1519
    return TSDB_CODE_FAILED;
X
Xiaoyu Wang 已提交
1520 1521 1522
  }

  SCollectColumnsCxt cxt = {
X
Xiaoyu Wang 已提交
1523 1524
      .errCode = TSDB_CODE_SUCCESS,
      .pTableAlias = pTableAlias,
1525
      .collectType = type,
1526
      .pCols = (NULL == *pCols ? nodesMakeList() : *pCols),
X
Xiaoyu Wang 已提交
1527
      .pColHash = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK)};
1528
  if (NULL == cxt.pCols || NULL == cxt.pColHash) {
X
Xiaoyu Wang 已提交
1529 1530
    return TSDB_CODE_OUT_OF_MEMORY;
  }
1531
  *pCols = NULL;
X
Xiaoyu Wang 已提交
1532
  nodesWalkSelectStmt(pSelect, clause, collectColumns, &cxt);
1533
  taosHashCleanup(cxt.pColHash);
X
Xiaoyu Wang 已提交
1534
  if (TSDB_CODE_SUCCESS != cxt.errCode) {
1535
    nodesDestroyList(cxt.pCols);
X
Xiaoyu Wang 已提交
1536 1537
    return cxt.errCode;
  }
1538 1539 1540
  if (LIST_LENGTH(cxt.pCols) > 0) {
    *pCols = cxt.pCols;
  } else {
1541
    nodesDestroyList(cxt.pCols);
X
Xiaoyu Wang 已提交
1542
  }
1543

X
Xiaoyu Wang 已提交
1544 1545 1546
  return TSDB_CODE_SUCCESS;
}

1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577
int32_t nodesCollectColumnsFromNode(SNode* node, const char* pTableAlias, ECollectColType type, SNodeList** pCols) {
  if (NULL == pCols) {
    return TSDB_CODE_FAILED;
  }
  SCollectColumnsCxt cxt = {
      .errCode = TSDB_CODE_SUCCESS,
      .pTableAlias = pTableAlias,
      .collectType = type,
      .pCols = (NULL == *pCols ? nodesMakeList() : *pCols),
      .pColHash = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK)};
  if (NULL == cxt.pCols || NULL == cxt.pColHash) {
    return TSDB_CODE_OUT_OF_MEMORY;
  }
  *pCols = NULL;

  nodesWalkExpr(node, collectColumns, &cxt);

  taosHashCleanup(cxt.pColHash);
  if (TSDB_CODE_SUCCESS != cxt.errCode) {
    nodesDestroyList(cxt.pCols);
    return cxt.errCode;
  }
  if (LIST_LENGTH(cxt.pCols) > 0) {
    *pCols = cxt.pCols;
  } else {
    nodesDestroyList(cxt.pCols);
  }

  return TSDB_CODE_SUCCESS;
}

X
Xiaoyu Wang 已提交
1578
typedef struct SCollectFuncsCxt {
X
Xiaoyu Wang 已提交
1579
  int32_t         errCode;
X
Xiaoyu Wang 已提交
1580
  FFuncClassifier classifier;
X
Xiaoyu Wang 已提交
1581
  SNodeList*      pFuncs;
X
Xiaoyu Wang 已提交
1582
  SHashObj*       pFuncsSet;
X
Xiaoyu Wang 已提交
1583 1584 1585 1586
} SCollectFuncsCxt;

static EDealRes collectFuncs(SNode* pNode, void* pContext) {
  SCollectFuncsCxt* pCxt = (SCollectFuncsCxt*)pContext;
1587 1588
  if (QUERY_NODE_FUNCTION == nodeType(pNode) && pCxt->classifier(((SFunctionNode*)pNode)->funcId) &&
      !(((SExprNode*)pNode)->orderAlias)) {
X
Xiaoyu Wang 已提交
1589
    SExprNode* pExpr = (SExprNode*)pNode;
X
Xiaoyu Wang 已提交
1590
    if (NULL == taosHashGet(pCxt->pFuncsSet, &pExpr, POINTER_BYTES)) {
X
Xiaoyu Wang 已提交
1591
      pCxt->errCode = nodesListStrictAppend(pCxt->pFuncs, nodesCloneNode(pNode));
X
Xiaoyu Wang 已提交
1592
      taosHashPut(pCxt->pFuncsSet, &pExpr, POINTER_BYTES, &pExpr, POINTER_BYTES);
X
Xiaoyu Wang 已提交
1593
    }
X
Xiaoyu Wang 已提交
1594 1595 1596 1597 1598
    return (TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_IGNORE_CHILD : DEAL_RES_ERROR);
  }
  return DEAL_RES_CONTINUE;
}

X
Xiaoyu Wang 已提交
1599 1600 1601 1602 1603 1604
static uint32_t funcNodeHash(const char* pKey, uint32_t len) {
  SExprNode* pExpr = *(SExprNode**)pKey;
  return MurmurHash3_32(pExpr->aliasName, strlen(pExpr->aliasName));
}

static int32_t funcNodeEqual(const void* pLeft, const void* pRight, size_t len) {
X
Xiaoyu Wang 已提交
1605 1606 1607
  if (0 != strcmp((*(const SExprNode**)pLeft)->aliasName, (*(const SExprNode**)pRight)->aliasName)) {
    return 1;
  }
X
Xiaoyu Wang 已提交
1608 1609 1610
  return nodesEqualNode(*(const SNode**)pLeft, *(const SNode**)pRight) ? 0 : 1;
}

X
Xiaoyu Wang 已提交
1611
int32_t nodesCollectFuncs(SSelectStmt* pSelect, ESqlClause clause, FFuncClassifier classifier, SNodeList** pFuncs) {
X
Xiaoyu Wang 已提交
1612
  if (NULL == pSelect || NULL == pFuncs) {
1613
    return TSDB_CODE_FAILED;
X
Xiaoyu Wang 已提交
1614 1615
  }

X
Xiaoyu Wang 已提交
1616 1617 1618 1619 1620
  SCollectFuncsCxt cxt = {.errCode = TSDB_CODE_SUCCESS,
                          .classifier = classifier,
                          .pFuncs = (NULL == *pFuncs ? nodesMakeList() : *pFuncs),
                          .pFuncsSet = taosHashInit(4, funcNodeHash, false, false)};
  if (NULL == cxt.pFuncs || NULL == cxt.pFuncsSet) {
X
Xiaoyu Wang 已提交
1621 1622
    return TSDB_CODE_OUT_OF_MEMORY;
  }
X
Xiaoyu Wang 已提交
1623
  taosHashSetEqualFp(cxt.pFuncsSet, funcNodeEqual);
1624
  *pFuncs = NULL;
X
Xiaoyu Wang 已提交
1625
  nodesWalkSelectStmt(pSelect, clause, collectFuncs, &cxt);
X
Xiaoyu Wang 已提交
1626 1627 1628 1629 1630 1631
  if (TSDB_CODE_SUCCESS == cxt.errCode) {
    if (LIST_LENGTH(cxt.pFuncs) > 0) {
      *pFuncs = cxt.pFuncs;
    } else {
      nodesDestroyList(cxt.pFuncs);
    }
X
Xiaoyu Wang 已提交
1632 1633 1634
  } else {
    nodesDestroyList(cxt.pFuncs);
  }
X
Xiaoyu Wang 已提交
1635
  taosHashCleanup(cxt.pFuncsSet);
X
Xiaoyu Wang 已提交
1636

X
Xiaoyu Wang 已提交
1637
  return cxt.errCode;
1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676
}

typedef struct SCollectSpecialNodesCxt {
  int32_t    errCode;
  ENodeType  type;
  SNodeList* pNodes;
} SCollectSpecialNodesCxt;

static EDealRes collectSpecialNodes(SNode* pNode, void* pContext) {
  SCollectSpecialNodesCxt* pCxt = (SCollectSpecialNodesCxt*)pContext;
  if (pCxt->type == nodeType(pNode)) {
    pCxt->errCode = nodesListStrictAppend(pCxt->pNodes, nodesCloneNode(pNode));
    return (TSDB_CODE_SUCCESS == pCxt->errCode ? DEAL_RES_IGNORE_CHILD : DEAL_RES_ERROR);
  }
  return DEAL_RES_CONTINUE;
}

int32_t nodesCollectSpecialNodes(SSelectStmt* pSelect, ESqlClause clause, ENodeType type, SNodeList** pNodes) {
  if (NULL == pSelect || NULL == pNodes) {
    return TSDB_CODE_FAILED;
  }

  SCollectSpecialNodesCxt cxt = {
      .errCode = TSDB_CODE_SUCCESS, .type = type, .pNodes = (NULL == *pNodes ? nodesMakeList() : *pNodes)};
  if (NULL == cxt.pNodes) {
    return TSDB_CODE_OUT_OF_MEMORY;
  }
  *pNodes = NULL;
  nodesWalkSelectStmt(pSelect, SQL_CLAUSE_GROUP_BY, collectSpecialNodes, &cxt);
  if (TSDB_CODE_SUCCESS != cxt.errCode) {
    nodesDestroyList(cxt.pNodes);
    return cxt.errCode;
  }
  if (LIST_LENGTH(cxt.pNodes) > 0) {
    *pNodes = cxt.pNodes;
  } else {
    nodesDestroyList(cxt.pNodes);
  }

X
Xiaoyu Wang 已提交
1677 1678
  return TSDB_CODE_SUCCESS;
}
D
dapan1121 已提交
1679

1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699
static EDealRes hasColumn(SNode* pNode, void* pContext) {
  if (QUERY_NODE_COLUMN == nodeType(pNode)) {
    *(bool*)pContext = true;
    return DEAL_RES_END;
  }
  return DEAL_RES_CONTINUE;
}

bool nodesExprHasColumn(SNode* pNode) {
  bool hasCol = false;
  nodesWalkExprPostOrder(pNode, hasColumn, &hasCol);
  return hasCol;
}

bool nodesExprsHasColumn(SNodeList* pList) {
  bool hasCol = false;
  nodesWalkExprsPostOrder(pList, hasColumn, &hasCol);
  return hasCol;
}

X
Xiaoyu Wang 已提交
1700
char* nodesGetFillModeString(EFillMode mode) {
D
dapan1121 已提交
1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718
  switch (mode) {
    case FILL_MODE_NONE:
      return "none";
    case FILL_MODE_VALUE:
      return "value";
    case FILL_MODE_PREV:
      return "prev";
    case FILL_MODE_NULL:
      return "null";
    case FILL_MODE_LINEAR:
      return "linear";
    case FILL_MODE_NEXT:
      return "next";
    default:
      return "unknown";
  }
}

X
Xiaoyu Wang 已提交
1719
char* nodesGetNameFromColumnNode(SNode* pNode) {
D
dapan1121 已提交
1720 1721 1722
  if (NULL == pNode || QUERY_NODE_COLUMN != pNode->type) {
    return "NULL";
  }
X
Xiaoyu Wang 已提交
1723 1724

  return ((SColumnNode*)pNode)->colName;
D
dapan1121 已提交
1725 1726
}

D
dapan1121 已提交
1727 1728 1729 1730 1731
int32_t nodesGetOutputNumFromSlotList(SNodeList* pSlots) {
  if (NULL == pSlots || pSlots->length <= 0) {
    return 0;
  }

X
Xiaoyu Wang 已提交
1732
  SNode*  pNode = NULL;
D
dapan1121 已提交
1733 1734 1735 1736 1737 1738
  int32_t num = 0;
  FOREACH(pNode, pSlots) {
    if (QUERY_NODE_SLOT_DESC != pNode->type) {
      continue;
    }

X
Xiaoyu Wang 已提交
1739
    SSlotDescNode* descNode = (SSlotDescNode*)pNode;
D
dapan1121 已提交
1740 1741 1742 1743 1744 1745 1746 1747
    if (descNode->output) {
      ++num;
    }
  }

  return num;
}

X
Xiaoyu Wang 已提交
1748
void nodesValueNodeToVariant(const SValueNode* pNode, SVariant* pVal) {
1749 1750 1751 1752 1753
  if (pNode->isNull) {
    pVal->nType = TSDB_DATA_TYPE_NULL;
    pVal->nLen = tDataTypes[TSDB_DATA_TYPE_NULL].bytes;
    return;
  }
D
dapan1121 已提交
1754 1755 1756 1757
  pVal->nType = pNode->node.resType.type;
  pVal->nLen = pNode->node.resType.bytes;
  switch (pNode->node.resType.type) {
    case TSDB_DATA_TYPE_NULL:
X
Xiaoyu Wang 已提交
1758
      break;
D
dapan1121 已提交
1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781
    case TSDB_DATA_TYPE_BOOL:
      pVal->i = pNode->datum.b;
      break;
    case TSDB_DATA_TYPE_TINYINT:
    case TSDB_DATA_TYPE_SMALLINT:
    case TSDB_DATA_TYPE_INT:
    case TSDB_DATA_TYPE_BIGINT:
    case TSDB_DATA_TYPE_TIMESTAMP:
      pVal->i = pNode->datum.i;
      break;
    case TSDB_DATA_TYPE_UTINYINT:
    case TSDB_DATA_TYPE_USMALLINT:
    case TSDB_DATA_TYPE_UINT:
    case TSDB_DATA_TYPE_UBIGINT:
      pVal->u = pNode->datum.u;
      break;
    case TSDB_DATA_TYPE_FLOAT:
    case TSDB_DATA_TYPE_DOUBLE:
      pVal->d = pNode->datum.d;
      break;
    case TSDB_DATA_TYPE_NCHAR:
    case TSDB_DATA_TYPE_VARCHAR:
    case TSDB_DATA_TYPE_VARBINARY:
D
dapan1121 已提交
1782 1783 1784
      pVal->pz = taosMemoryMalloc(pVal->nLen + VARSTR_HEADER_SIZE + 1);
      memcpy(pVal->pz, pNode->datum.p, pVal->nLen + VARSTR_HEADER_SIZE);
      pVal->pz[pVal->nLen + VARSTR_HEADER_SIZE] = 0;
D
dapan1121 已提交
1785 1786
      break;
    case TSDB_DATA_TYPE_JSON:
wmmhello's avatar
wmmhello 已提交
1787 1788 1789 1790
      pVal->nLen = getJsonValueLen(pNode->datum.p);
      pVal->pz = taosMemoryMalloc(pVal->nLen);
      memcpy(pVal->pz, pNode->datum.p, pVal->nLen);
      break;
D
dapan1121 已提交
1791 1792 1793 1794 1795 1796 1797
    case TSDB_DATA_TYPE_DECIMAL:
    case TSDB_DATA_TYPE_BLOB:
      // todo
    default:
      break;
  }
}
X
Xiaoyu Wang 已提交
1798 1799 1800 1801 1802 1803 1804 1805 1806 1807

int32_t nodesMergeConds(SNode** pDst, SNodeList** pSrc) {
  if (NULL == *pSrc) {
    return TSDB_CODE_SUCCESS;
  }

  if (1 == LIST_LENGTH(*pSrc)) {
    *pDst = nodesListGetNode(*pSrc, 0);
    nodesClearList(*pSrc);
  } else {
1808
    SLogicConditionNode* pLogicCond = (SLogicConditionNode*)nodesMakeNode(QUERY_NODE_LOGIC_CONDITION);
X
Xiaoyu Wang 已提交
1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821
    if (NULL == pLogicCond) {
      return TSDB_CODE_OUT_OF_MEMORY;
    }
    pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL;
    pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes;
    pLogicCond->condType = LOGIC_COND_TYPE_AND;
    pLogicCond->pParameterList = *pSrc;
    *pDst = (SNode*)pLogicCond;
  }
  *pSrc = NULL;

  return TSDB_CODE_SUCCESS;
}
X
Xiaoyu Wang 已提交
1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837

const char* dataOrderStr(EDataOrderLevel order) {
  switch (order) {
    case DATA_ORDER_LEVEL_NONE:
      return "no order required";
    case DATA_ORDER_LEVEL_IN_BLOCK:
      return "in-datablock order";
    case DATA_ORDER_LEVEL_IN_GROUP:
      return "in-group order";
    case DATA_ORDER_LEVEL_GLOBAL:
      return "global order";
    default:
      break;
  }
  return "unknown";
}