nodes.h 9.1 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 26 27 28 29 30 31 32
#define nodeType(nodeptr) (((const SNode*)(nodeptr))->type)
#define setNodeType(nodeptr, type) (((SNode*)(nodeptr))->type = (type))

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

#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
#define REPLACE_NODE(newNode) cell->pNode = (SNode*)(newNode)

X
Xiaoyu Wang 已提交
35 36 37 38 39 40 41 42 43 44 45
#define INSERT_LIST(target, src) nodesListInsertList((target), cell, src)

#define WHERE_EACH(node, list) \
  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)

46 47 48 49 50
#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)

51 52 53
#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)

54
typedef enum ENodeType {
55
  // 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.
56 57 58 59 60 61 62 63 64 65
  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,
66
  QUERY_NODE_LIMIT,
67 68 69
  QUERY_NODE_STATE_WINDOW,
  QUERY_NODE_SESSION_WINDOW,
  QUERY_NODE_INTERVAL_WINDOW,
70 71
  QUERY_NODE_NODE_LIST,
  QUERY_NODE_FILL,
X
Xiaoyu Wang 已提交
72
  QUERY_NODE_RAW_EXPR, // Only be used in parser module.
X
Xiaoyu Wang 已提交
73
  QUERY_NODE_TARGET,
X
Xiaoyu Wang 已提交
74
  QUERY_NODE_DATABLOCK_DESC,
X
Xiaoyu Wang 已提交
75
  QUERY_NODE_SLOT_DESC,
X
Xiaoyu Wang 已提交
76
  QUERY_NODE_COLUMN_DEF,
X
Xiaoyu Wang 已提交
77
  QUERY_NODE_DOWNSTREAM_SOURCE,
X
Xiaoyu Wang 已提交
78 79 80
  QUERY_NODE_DATABASE_OPTIONS,
  QUERY_NODE_TABLE_OPTIONS,
  QUERY_NODE_INDEX_OPTIONS,
81
  QUERY_NODE_EXPLAIN_OPTIONS,
82

83
  // Statement nodes are used in parser and planner module.
84
  QUERY_NODE_SET_OPERATOR,
85
  QUERY_NODE_SELECT_STMT,
X
Xiaoyu Wang 已提交
86
  QUERY_NODE_VNODE_MODIF_STMT,
87
  QUERY_NODE_CREATE_DATABASE_STMT,
88
  QUERY_NODE_DROP_DATABASE_STMT,
89
  QUERY_NODE_ALTER_DATABASE_STMT,
X
Xiaoyu Wang 已提交
90
  QUERY_NODE_CREATE_TABLE_STMT,
91
  QUERY_NODE_CREATE_SUBTABLE_CLAUSE,
92
  QUERY_NODE_CREATE_MULTI_TABLE_STMT,
93 94
  QUERY_NODE_DROP_TABLE_CLAUSE,
  QUERY_NODE_DROP_TABLE_STMT,
95
  QUERY_NODE_DROP_SUPER_TABLE_STMT,
96
  QUERY_NODE_ALTER_TABLE_STMT,
97 98 99 100 101 102
  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,
103
  QUERY_NODE_ALTER_DNODE_STMT,
X
Xiaoyu Wang 已提交
104
  QUERY_NODE_CREATE_INDEX_STMT,
105
  QUERY_NODE_DROP_INDEX_STMT,
X
Xiaoyu Wang 已提交
106
  QUERY_NODE_CREATE_QNODE_STMT,
107
  QUERY_NODE_DROP_QNODE_STMT,
108 109 110 111 112 113
  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,
114 115
  QUERY_NODE_CREATE_TOPIC_STMT,
  QUERY_NODE_DROP_TOPIC_STMT,
116
  QUERY_NODE_ALTER_LOCAL_STMT,
117
  QUERY_NODE_EXPLAIN_STMT,
118 119
  QUERY_NODE_DESCRIBE_STMT,
  QUERY_NODE_RESET_QUERY_CACHE_STMT,
120 121 122 123 124 125 126 127 128
  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,
X
Xiaoyu Wang 已提交
129 130 131 132
  QUERY_NODE_SHOW_DATABASES_STMT,
  QUERY_NODE_SHOW_TABLES_STMT,
  QUERY_NODE_SHOW_STABLES_STMT,
  QUERY_NODE_SHOW_USERS_STMT,
133 134
  QUERY_NODE_SHOW_DNODES_STMT,
  QUERY_NODE_SHOW_VGROUPS_STMT,
X
Xiaoyu Wang 已提交
135
  QUERY_NODE_SHOW_MNODES_STMT,
X
Xiaoyu Wang 已提交
136 137 138 139 140
  QUERY_NODE_SHOW_MODULES_STMT,
  QUERY_NODE_SHOW_QNODES_STMT,
  QUERY_NODE_SHOW_FUNCTIONS_STMT,
  QUERY_NODE_SHOW_INDEXES_STMT,
  QUERY_NODE_SHOW_STREAMS_STMT,
141 142 143 144 145 146 147 148 149 150
  QUERY_NODE_SHOW_APPS_STMT,
  QUERY_NODE_SHOW_CONNECTIONS_STMT,
  QUERY_NODE_SHOW_LICENCE_STMT,
  QUERY_NODE_SHOW_CREATE_DATABASE_STMT,
  QUERY_NODE_SHOW_CREATE_TABLE_STMT,
  QUERY_NODE_SHOW_CREATE_STABLE_STMT, 
  QUERY_NODE_SHOW_QUERIES_STMT,
  QUERY_NODE_SHOW_SCORES_STMT,
  QUERY_NODE_SHOW_TOPICS_STMT,
  QUERY_NODE_SHOW_VARIABLE_STMT,
151 152
  QUERY_NODE_SHOW_BNODES_STMT,
  QUERY_NODE_SHOW_SNODES_STMT,
153 154
  QUERY_NODE_KILL_CONNECTION_STMT,
  QUERY_NODE_KILL_QUERY_STMT,
X
Xiaoyu Wang 已提交
155

X
Xiaoyu Wang 已提交
156
  // logic plan node
X
Xiaoyu Wang 已提交
157
  QUERY_NODE_LOGIC_PLAN_SCAN,
X
Xiaoyu Wang 已提交
158 159
  QUERY_NODE_LOGIC_PLAN_JOIN,
  QUERY_NODE_LOGIC_PLAN_AGG,
X
Xiaoyu Wang 已提交
160
  QUERY_NODE_LOGIC_PLAN_PROJECT,
161
  QUERY_NODE_LOGIC_PLAN_VNODE_MODIF,
X
Xiaoyu Wang 已提交
162
  QUERY_NODE_LOGIC_PLAN_EXCHANGE,
X
Xiaoyu Wang 已提交
163
  QUERY_NODE_LOGIC_PLAN_WINDOW,
X
Xiaoyu Wang 已提交
164
  QUERY_NODE_LOGIC_PLAN_SORT,
165
  QUERY_NODE_LOGIC_PLAN_PARTITION,
X
Xiaoyu Wang 已提交
166 167
  QUERY_NODE_LOGIC_SUBPLAN,
  QUERY_NODE_LOGIC_PLAN,
X
Xiaoyu Wang 已提交
168 169 170 171

  // physical plan node
  QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN,
  QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN,
X
Xiaoyu Wang 已提交
172 173
  QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN,
  QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN,
174
  QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN,
X
Xiaoyu Wang 已提交
175 176
  QUERY_NODE_PHYSICAL_PLAN_PROJECT,
  QUERY_NODE_PHYSICAL_PLAN_JOIN,
X
Xiaoyu Wang 已提交
177 178 179
  QUERY_NODE_PHYSICAL_PLAN_AGG,
  QUERY_NODE_PHYSICAL_PLAN_EXCHANGE,
  QUERY_NODE_PHYSICAL_PLAN_SORT,
X
Xiaoyu Wang 已提交
180
  QUERY_NODE_PHYSICAL_PLAN_INTERVAL,
X
Xiaoyu Wang 已提交
181
  QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW,
182 183
  QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW,
  QUERY_NODE_PHYSICAL_PLAN_PARTITION,
X
Xiaoyu Wang 已提交
184
  QUERY_NODE_PHYSICAL_PLAN_DISPATCH,
185
  QUERY_NODE_PHYSICAL_PLAN_INSERT,
X
Xiaoyu Wang 已提交
186 187
  QUERY_NODE_PHYSICAL_SUBPLAN,
  QUERY_NODE_PHYSICAL_PLAN
188 189 190 191 192 193 194 195 196 197
} ENodeType;

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

198
typedef struct SListCell {
199
  struct SListCell* pPrev;
200
  struct SListCell* pNext;
201
  SNode* pNode;
202 203 204
} SListCell;

typedef struct SNodeList {
X
Xiaoyu Wang 已提交
205
  int32_t length;
206 207
  SListCell* pHead;
  SListCell* pTail;
208 209
} SNodeList;

X
Xiaoyu Wang 已提交
210 211 212 213
#define SNodeptr void*  

SNodeptr nodesMakeNode(ENodeType type);
void nodesDestroyNode(SNodeptr pNode);
214 215

SNodeList* nodesMakeList();
X
Xiaoyu Wang 已提交
216
int32_t nodesListAppend(SNodeList* pList, SNodeptr pNode);
217
int32_t nodesListStrictAppend(SNodeList* pList, SNodeptr pNode);
X
Xiaoyu Wang 已提交
218
int32_t nodesListMakeAppend(SNodeList** pList, SNodeptr pNode);
X
Xiaoyu Wang 已提交
219
int32_t nodesListAppendList(SNodeList* pTarget, SNodeList* pSrc);
220
int32_t nodesListStrictAppendList(SNodeList* pTarget, SNodeList* pSrc);
X
Xiaoyu Wang 已提交
221
int32_t nodesListPushFront(SNodeList* pList, SNodeptr pNode);
222
SListCell* nodesListErase(SNodeList* pList, SListCell* pCell);
X
Xiaoyu Wang 已提交
223
void nodesListInsertList(SNodeList* pTarget, SListCell* pPos, SNodeList* pSrc);
X
Xiaoyu Wang 已提交
224
SNodeptr nodesListGetNode(SNodeList* pList, int32_t index);
225
void nodesDestroyList(SNodeList* pList);
X
Xiaoyu Wang 已提交
226 227
// Only clear the linked list structure, without releasing the elements inside
void nodesClearList(SNodeList* pList);
228

229 230 231 232 233
typedef enum EDealRes {
  DEAL_RES_CONTINUE = 1,
  DEAL_RES_IGNORE_CHILD,
  DEAL_RES_ERROR,
} EDealRes;
234

235
typedef EDealRes (*FNodeWalker)(SNode* pNode, void* pContext);
X
Xiaoyu Wang 已提交
236 237 238 239
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);
240 241

typedef EDealRes (*FNodeRewriter)(SNode** pNode, void* pContext);
X
Xiaoyu Wang 已提交
242 243 244 245
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);
246

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

X
Xiaoyu Wang 已提交
249
SNodeptr nodesCloneNode(const SNodeptr pNode);
X
Xiaoyu Wang 已提交
250
SNodeList* nodesCloneList(const SNodeList* pList);
251

252
const char* nodesNodeName(ENodeType type);
X
Xiaoyu Wang 已提交
253
int32_t nodesNodeToString(const SNodeptr pNode, bool format, char** pStr, int32_t* pLen);
254
int32_t nodesStringToNode(const char* pStr, SNode** pNode);
255

X
Xiaoyu Wang 已提交
256 257 258
int32_t nodesListToString(const SNodeList* pList, bool format, char** pStr, int32_t* pLen);
int32_t nodesStringToList(const char* pStr, SNodeList** pList);

D
dapan1121 已提交
259
int32_t nodesNodeToSQL(SNode *pNode, char *buf, int32_t bufSize, int32_t *len);
D
dapan1121 已提交
260
char *nodesGetNameFromColumnNode(SNode *pNode);
D
dapan1121 已提交
261
int32_t nodesGetOutputNumFromSlotList(SNodeList* pSlots);
D
dapan1121 已提交
262

263 264 265 266 267
#ifdef __cplusplus
}
#endif

#endif /*_TD_NODES_H_*/