nodes.h 10.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 * 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/>.
 */

#ifndef _TD_NODES_H_
#define _TD_NODES_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "tdef.h"

25
#define nodeType(nodeptr)          (((const SNode*)(nodeptr))->type)
26 27 28 29
#define setNodeType(nodeptr, type) (((SNode*)(nodeptr))->type = (type))

#define LIST_LENGTH(l) (NULL != (l) ? (l)->length : 0)

30 31 32
#define FOREACH(node, list)                                       \
  for (SListCell* cell = (NULL != (list) ? (list)->pHead : NULL); \
       (NULL != cell ? (node = cell->pNode, true) : (node = NULL, false)); cell = cell->pNext)
33

34 35
#define REPLACE_NODE(newNode) cell->pNode = (SNode*)(newNode)

X
Xiaoyu Wang 已提交
36 37
#define INSERT_LIST(target, src) nodesListInsertList((target), cell, src)

38
#define WHERE_EACH(node, list)                               \
X
Xiaoyu Wang 已提交
39 40 41 42 43 44 45 46
  SListCell* cell = (NULL != (list) ? (list)->pHead : NULL); \
  while (NULL != cell ? (node = cell->pNode, true) : (node = NULL, false))

#define WHERE_NEXT cell = cell->pNext

// only be use in WHERE_EACH
#define ERASE_NODE(list) cell = nodesListErase((list), cell)

47 48 49 50 51 52 53
#define FORBOTH(node1, list1, node2, list2)                                               \
  for (SListCell* cell1 = (NULL != (list1) ? (list1)->pHead : NULL),                      \
                  *cell2 = (NULL != (list2) ? (list2)->pHead : NULL);                     \
       (NULL == cell1 ? (node1 = NULL, false) : (node1 = cell1->pNode, true)),            \
                  (NULL == cell2 ? (node2 = NULL, false) : (node2 = cell2->pNode, true)), \
                  (node1 != NULL && node2 != NULL);                                       \
       cell1 = cell1->pNext, cell2 = cell2->pNext)
54

X
Xiaoyu Wang 已提交
55 56 57
#define REPLACE_LIST1_NODE(newNode) cell1->pNode = (SNode*)(newNode)
#define REPLACE_LIST2_NODE(newNode) cell2->pNode = (SNode*)(newNode)

58 59 60 61 62 63 64 65 66
#define FOREACH_FOR_REWRITE(node, list)                           \
  for (SListCell* cell = (NULL != (list) ? (list)->pHead : NULL); \
       (NULL != cell ? (node = &(cell->pNode), true) : (node = NULL, false)); cell = cell->pNext)

#define DESTORY_LIST(list)  \
  do {                      \
    nodesDestroyList(list); \
    list = NULL;            \
  } while (0)
67

68
typedef enum ENodeType {
69 70
  // Syntax nodes are used in parser and planner module, and some are also used in executor module, such as COLUMN,
  // VALUE, OPERATOR, FUNCTION and so on.
71 72 73 74 75 76 77 78 79 80
  QUERY_NODE_COLUMN = 1,
  QUERY_NODE_VALUE,
  QUERY_NODE_OPERATOR,
  QUERY_NODE_LOGIC_CONDITION,
  QUERY_NODE_FUNCTION,
  QUERY_NODE_REAL_TABLE,
  QUERY_NODE_TEMP_TABLE,
  QUERY_NODE_JOIN_TABLE,
  QUERY_NODE_GROUPING_SET,
  QUERY_NODE_ORDER_BY_EXPR,
81
  QUERY_NODE_LIMIT,
82 83 84
  QUERY_NODE_STATE_WINDOW,
  QUERY_NODE_SESSION_WINDOW,
  QUERY_NODE_INTERVAL_WINDOW,
85 86
  QUERY_NODE_NODE_LIST,
  QUERY_NODE_FILL,
87
  QUERY_NODE_RAW_EXPR,  // Only be used in parser module.
X
Xiaoyu Wang 已提交
88
  QUERY_NODE_TARGET,
X
Xiaoyu Wang 已提交
89
  QUERY_NODE_DATABLOCK_DESC,
X
Xiaoyu Wang 已提交
90
  QUERY_NODE_SLOT_DESC,
X
Xiaoyu Wang 已提交
91
  QUERY_NODE_COLUMN_DEF,
X
Xiaoyu Wang 已提交
92
  QUERY_NODE_DOWNSTREAM_SOURCE,
X
Xiaoyu Wang 已提交
93 94 95
  QUERY_NODE_DATABASE_OPTIONS,
  QUERY_NODE_TABLE_OPTIONS,
  QUERY_NODE_INDEX_OPTIONS,
96
  QUERY_NODE_EXPLAIN_OPTIONS,
97
  QUERY_NODE_STREAM_OPTIONS,
X
Xiaoyu Wang 已提交
98
  QUERY_NODE_TOPIC_OPTIONS,
99

100
  // Statement nodes are used in parser and planner module.
101
  QUERY_NODE_SET_OPERATOR,
102
  QUERY_NODE_SELECT_STMT,
X
Xiaoyu Wang 已提交
103
  QUERY_NODE_VNODE_MODIF_STMT,
104
  QUERY_NODE_CREATE_DATABASE_STMT,
105
  QUERY_NODE_DROP_DATABASE_STMT,
106
  QUERY_NODE_ALTER_DATABASE_STMT,
X
Xiaoyu Wang 已提交
107
  QUERY_NODE_CREATE_TABLE_STMT,
108
  QUERY_NODE_CREATE_SUBTABLE_CLAUSE,
109
  QUERY_NODE_CREATE_MULTI_TABLE_STMT,
110 111
  QUERY_NODE_DROP_TABLE_CLAUSE,
  QUERY_NODE_DROP_TABLE_STMT,
112
  QUERY_NODE_DROP_SUPER_TABLE_STMT,
113
  QUERY_NODE_ALTER_TABLE_STMT,
114 115 116 117 118 119
  QUERY_NODE_CREATE_USER_STMT,
  QUERY_NODE_ALTER_USER_STMT,
  QUERY_NODE_DROP_USER_STMT,
  QUERY_NODE_USE_DATABASE_STMT,
  QUERY_NODE_CREATE_DNODE_STMT,
  QUERY_NODE_DROP_DNODE_STMT,
120
  QUERY_NODE_ALTER_DNODE_STMT,
X
Xiaoyu Wang 已提交
121
  QUERY_NODE_CREATE_INDEX_STMT,
122
  QUERY_NODE_DROP_INDEX_STMT,
X
Xiaoyu Wang 已提交
123
  QUERY_NODE_CREATE_QNODE_STMT,
124
  QUERY_NODE_DROP_QNODE_STMT,
125 126 127 128 129 130
  QUERY_NODE_CREATE_BNODE_STMT,
  QUERY_NODE_DROP_BNODE_STMT,
  QUERY_NODE_CREATE_SNODE_STMT,
  QUERY_NODE_DROP_SNODE_STMT,
  QUERY_NODE_CREATE_MNODE_STMT,
  QUERY_NODE_DROP_MNODE_STMT,
131 132
  QUERY_NODE_CREATE_TOPIC_STMT,
  QUERY_NODE_DROP_TOPIC_STMT,
133
  QUERY_NODE_ALTER_LOCAL_STMT,
134
  QUERY_NODE_EXPLAIN_STMT,
135 136
  QUERY_NODE_DESCRIBE_STMT,
  QUERY_NODE_RESET_QUERY_CACHE_STMT,
137 138 139 140 141 142 143 144 145
  QUERY_NODE_COMPACT_STMT,
  QUERY_NODE_CREATE_FUNCTION_STMT,
  QUERY_NODE_DROP_FUNCTION_STMT,
  QUERY_NODE_CREATE_STREAM_STMT,
  QUERY_NODE_DROP_STREAM_STMT,
  QUERY_NODE_MERGE_VGROUP_STMT,
  QUERY_NODE_REDISTRIBUTE_VGROUP_STMT,
  QUERY_NODE_SPLIT_VGROUP_STMT,
  QUERY_NODE_SYNCDB_STMT,
146 147
  QUERY_NODE_GRANT_STMT,
  QUERY_NODE_REVOKE_STMT,
148
  QUERY_NODE_SHOW_DNODES_STMT,
X
Xiaoyu Wang 已提交
149
  QUERY_NODE_SHOW_MNODES_STMT,
X
Xiaoyu Wang 已提交
150 151
  QUERY_NODE_SHOW_MODULES_STMT,
  QUERY_NODE_SHOW_QNODES_STMT,
152 153
  QUERY_NODE_SHOW_SNODES_STMT,
  QUERY_NODE_SHOW_BNODES_STMT,
154
  QUERY_NODE_SHOW_CLUSTER_STMT,
155
  QUERY_NODE_SHOW_DATABASES_STMT,
X
Xiaoyu Wang 已提交
156 157
  QUERY_NODE_SHOW_FUNCTIONS_STMT,
  QUERY_NODE_SHOW_INDEXES_STMT,
158
  QUERY_NODE_SHOW_STABLES_STMT,
X
Xiaoyu Wang 已提交
159
  QUERY_NODE_SHOW_STREAMS_STMT,
160 161
  QUERY_NODE_SHOW_TABLES_STMT,
  QUERY_NODE_SHOW_USERS_STMT,
162
  QUERY_NODE_SHOW_LICENCE_STMT,
163
  QUERY_NODE_SHOW_VGROUPS_STMT,
164
  QUERY_NODE_SHOW_TOPICS_STMT,
165 166 167 168 169 170 171
  QUERY_NODE_SHOW_CONSUMERS_STMT,
  QUERY_NODE_SHOW_SUBSCRIBES_STMT,
  QUERY_NODE_SHOW_SMAS_STMT,
  QUERY_NODE_SHOW_CONFIGS_STMT,
  QUERY_NODE_SHOW_CONNECTIONS_STMT,
  QUERY_NODE_SHOW_QUERIES_STMT,
  QUERY_NODE_SHOW_VNODES_STMT,
172 173 174 175 176 177
  QUERY_NODE_SHOW_APPS_STMT,
  QUERY_NODE_SHOW_SCORES_STMT,
  QUERY_NODE_SHOW_VARIABLE_STMT,
  QUERY_NODE_SHOW_CREATE_DATABASE_STMT,
  QUERY_NODE_SHOW_CREATE_TABLE_STMT,
  QUERY_NODE_SHOW_CREATE_STABLE_STMT,
178
  QUERY_NODE_SHOW_TRANSACTIONS_STMT,
179 180
  QUERY_NODE_KILL_CONNECTION_STMT,
  QUERY_NODE_KILL_QUERY_STMT,
181
  QUERY_NODE_KILL_TRANSACTION_STMT,
X
Xiaoyu Wang 已提交
182
  QUERY_NODE_QUERY,
X
Xiaoyu Wang 已提交
183

X
Xiaoyu Wang 已提交
184
  // logic plan node
X
Xiaoyu Wang 已提交
185
  QUERY_NODE_LOGIC_PLAN_SCAN,
X
Xiaoyu Wang 已提交
186 187
  QUERY_NODE_LOGIC_PLAN_JOIN,
  QUERY_NODE_LOGIC_PLAN_AGG,
X
Xiaoyu Wang 已提交
188
  QUERY_NODE_LOGIC_PLAN_PROJECT,
189
  QUERY_NODE_LOGIC_PLAN_VNODE_MODIF,
X
Xiaoyu Wang 已提交
190
  QUERY_NODE_LOGIC_PLAN_EXCHANGE,
X
Xiaoyu Wang 已提交
191
  QUERY_NODE_LOGIC_PLAN_WINDOW,
X
Xiaoyu Wang 已提交
192
  QUERY_NODE_LOGIC_PLAN_FILL,
X
Xiaoyu Wang 已提交
193
  QUERY_NODE_LOGIC_PLAN_SORT,
194
  QUERY_NODE_LOGIC_PLAN_PARTITION,
X
Xiaoyu Wang 已提交
195 196
  QUERY_NODE_LOGIC_SUBPLAN,
  QUERY_NODE_LOGIC_PLAN,
X
Xiaoyu Wang 已提交
197 198 199 200

  // physical plan node
  QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN,
  QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN,
X
Xiaoyu Wang 已提交
201 202
  QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN,
  QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN,
203
  QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN,
X
Xiaoyu Wang 已提交
204 205
  QUERY_NODE_PHYSICAL_PLAN_PROJECT,
  QUERY_NODE_PHYSICAL_PLAN_JOIN,
X
Xiaoyu Wang 已提交
206 207 208
  QUERY_NODE_PHYSICAL_PLAN_AGG,
  QUERY_NODE_PHYSICAL_PLAN_EXCHANGE,
  QUERY_NODE_PHYSICAL_PLAN_SORT,
X
Xiaoyu Wang 已提交
209
  QUERY_NODE_PHYSICAL_PLAN_INTERVAL,
X
Xiaoyu Wang 已提交
210
  QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL,
X
Xiaoyu Wang 已提交
211
  QUERY_NODE_PHYSICAL_PLAN_FILL,
X
Xiaoyu Wang 已提交
212
  QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW,
213 214
  QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW,
  QUERY_NODE_PHYSICAL_PLAN_PARTITION,
X
Xiaoyu Wang 已提交
215
  QUERY_NODE_PHYSICAL_PLAN_DISPATCH,
216
  QUERY_NODE_PHYSICAL_PLAN_INSERT,
X
Xiaoyu Wang 已提交
217 218
  QUERY_NODE_PHYSICAL_SUBPLAN,
  QUERY_NODE_PHYSICAL_PLAN
219 220 221 222
} ENodeType;

/**
 * The first field of a node of any type is guaranteed to be the ENodeType.
223
 * Hence the type of any node can be gotten by casting it to SNode.
224 225 226 227 228
 */
typedef struct SNode {
  ENodeType type;
} SNode;

229
typedef struct SListCell {
230
  struct SListCell* pPrev;
231
  struct SListCell* pNext;
232
  SNode*            pNode;
233 234 235
} SListCell;

typedef struct SNodeList {
236
  int32_t    length;
237 238
  SListCell* pHead;
  SListCell* pTail;
239 240
} SNodeList;

241
#define SNodeptr void*
X
Xiaoyu Wang 已提交
242 243

SNodeptr nodesMakeNode(ENodeType type);
244
void     nodesDestroyNode(SNodeptr pNode);
245 246

SNodeList* nodesMakeList();
247 248 249 250 251 252 253
int32_t    nodesListAppend(SNodeList* pList, SNodeptr pNode);
int32_t    nodesListStrictAppend(SNodeList* pList, SNodeptr pNode);
int32_t    nodesListMakeAppend(SNodeList** pList, SNodeptr pNode);
int32_t    nodesListMakeStrictAppend(SNodeList** pList, SNodeptr pNode);
int32_t    nodesListAppendList(SNodeList* pTarget, SNodeList* pSrc);
int32_t    nodesListStrictAppendList(SNodeList* pTarget, SNodeList* pSrc);
int32_t    nodesListPushFront(SNodeList* pList, SNodeptr pNode);
254
SListCell* nodesListErase(SNodeList* pList, SListCell* pCell);
255 256 257
void       nodesListInsertList(SNodeList* pTarget, SListCell* pPos, SNodeList* pSrc);
SNodeptr   nodesListGetNode(SNodeList* pList, int32_t index);
void       nodesDestroyList(SNodeList* pList);
X
Xiaoyu Wang 已提交
258 259
// Only clear the linked list structure, without releasing the elements inside
void nodesClearList(SNodeList* pList);
260

261
typedef enum EDealRes { DEAL_RES_CONTINUE = 1, DEAL_RES_IGNORE_CHILD, DEAL_RES_ERROR, DEAL_RES_END } EDealRes;
262

263
typedef EDealRes (*FNodeWalker)(SNode* pNode, void* pContext);
X
Xiaoyu Wang 已提交
264 265 266 267
void nodesWalkExpr(SNodeptr pNode, FNodeWalker walker, void* pContext);
void nodesWalkExprs(SNodeList* pList, FNodeWalker walker, void* pContext);
void nodesWalkExprPostOrder(SNodeptr pNode, FNodeWalker walker, void* pContext);
void nodesWalkExprsPostOrder(SNodeList* pList, FNodeWalker walker, void* pContext);
268 269

typedef EDealRes (*FNodeRewriter)(SNode** pNode, void* pContext);
X
Xiaoyu Wang 已提交
270 271 272 273
void nodesRewriteExpr(SNode** pNode, FNodeRewriter rewriter, void* pContext);
void nodesRewriteExprs(SNodeList* pList, FNodeRewriter rewriter, void* pContext);
void nodesRewriteExprPostOrder(SNode** pNode, FNodeRewriter rewriter, void* pContext);
void nodesRewriteExprsPostOrder(SNodeList* pList, FNodeRewriter rewriter, void* pContext);
274

X
Xiaoyu Wang 已提交
275
bool nodesEqualNode(const SNodeptr a, const SNodeptr b);
276

277
SNodeptr   nodesCloneNode(const SNodeptr pNode);
X
Xiaoyu Wang 已提交
278
SNodeList* nodesCloneList(const SNodeList* pList);
279

280
const char* nodesNodeName(ENodeType type);
281 282
int32_t     nodesNodeToString(const SNodeptr pNode, bool format, char** pStr, int32_t* pLen);
int32_t     nodesStringToNode(const char* pStr, SNode** pNode);
283

X
Xiaoyu Wang 已提交
284 285 286
int32_t nodesListToString(const SNodeList* pList, bool format, char** pStr, int32_t* pLen);
int32_t nodesStringToList(const char* pStr, SNodeList** pList);

287 288
int32_t nodesNodeToSQL(SNode* pNode, char* buf, int32_t bufSize, int32_t* len);
char*   nodesGetNameFromColumnNode(SNode* pNode);
D
dapan1121 已提交
289
int32_t nodesGetOutputNumFromSlotList(SNodeList* pSlots);
D
dapan1121 已提交
290

291 292 293 294 295
#ifdef __cplusplus
}
#endif

#endif /*_TD_NODES_H_*/