nodes.h 8.3 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
// only be use in FOREACH
34
#define ERASE_NODE(list) cell = nodesListErase(list, cell);
35 36 37

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

38 39 40 41 42
#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)

43 44 45
#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)

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

75
  // Statement nodes are used in parser and planner module.
76
  QUERY_NODE_SET_OPERATOR,
77
  QUERY_NODE_SELECT_STMT,
X
Xiaoyu Wang 已提交
78
  QUERY_NODE_VNODE_MODIF_STMT,
79
  QUERY_NODE_CREATE_DATABASE_STMT,
80
  QUERY_NODE_DROP_DATABASE_STMT,
81
  QUERY_NODE_ALTER_DATABASE_STMT,
X
Xiaoyu Wang 已提交
82
  QUERY_NODE_CREATE_TABLE_STMT,
83
  QUERY_NODE_CREATE_SUBTABLE_CLAUSE,
84
  QUERY_NODE_CREATE_MULTI_TABLE_STMT,
85 86
  QUERY_NODE_DROP_TABLE_CLAUSE,
  QUERY_NODE_DROP_TABLE_STMT,
87
  QUERY_NODE_DROP_SUPER_TABLE_STMT,
88
  QUERY_NODE_ALTER_TABLE_STMT,
89 90 91 92 93 94
  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,
95
  QUERY_NODE_ALTER_DNODE_STMT,
X
Xiaoyu Wang 已提交
96
  QUERY_NODE_CREATE_INDEX_STMT,
97
  QUERY_NODE_DROP_INDEX_STMT,
X
Xiaoyu Wang 已提交
98
  QUERY_NODE_CREATE_QNODE_STMT,
99 100 101
  QUERY_NODE_DROP_QNODE_STMT,
  QUERY_NODE_CREATE_TOPIC_STMT,
  QUERY_NODE_DROP_TOPIC_STMT,
102
  QUERY_NODE_ALTER_LOCAL_STMT,
103
  QUERY_NODE_EXPLAIN_STMT,
104 105
  QUERY_NODE_DESCRIBE_STMT,
  QUERY_NODE_RESET_QUERY_CACHE_STMT,
106 107 108 109 110 111 112 113 114
  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 已提交
115 116 117 118
  QUERY_NODE_SHOW_DATABASES_STMT,
  QUERY_NODE_SHOW_TABLES_STMT,
  QUERY_NODE_SHOW_STABLES_STMT,
  QUERY_NODE_SHOW_USERS_STMT,
119 120
  QUERY_NODE_SHOW_DNODES_STMT,
  QUERY_NODE_SHOW_VGROUPS_STMT,
X
Xiaoyu Wang 已提交
121
  QUERY_NODE_SHOW_MNODES_STMT,
X
Xiaoyu Wang 已提交
122 123 124 125 126
  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,
127 128 129 130 131 132 133 134 135 136 137 138
  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,
  QUERY_NODE_KILL_CONNECTION_STMT,
  QUERY_NODE_KILL_QUERY_STMT,
X
Xiaoyu Wang 已提交
139

X
Xiaoyu Wang 已提交
140
  // logic plan node
X
Xiaoyu Wang 已提交
141
  QUERY_NODE_LOGIC_PLAN_SCAN,
X
Xiaoyu Wang 已提交
142 143
  QUERY_NODE_LOGIC_PLAN_JOIN,
  QUERY_NODE_LOGIC_PLAN_AGG,
X
Xiaoyu Wang 已提交
144
  QUERY_NODE_LOGIC_PLAN_PROJECT,
145
  QUERY_NODE_LOGIC_PLAN_VNODE_MODIF,
X
Xiaoyu Wang 已提交
146
  QUERY_NODE_LOGIC_PLAN_EXCHANGE,
X
Xiaoyu Wang 已提交
147
  QUERY_NODE_LOGIC_PLAN_WINDOW,
X
Xiaoyu Wang 已提交
148
  QUERY_NODE_LOGIC_PLAN_SORT,
149
  QUERY_NODE_LOGIC_PLAN_PARTITION,
X
Xiaoyu Wang 已提交
150 151
  QUERY_NODE_LOGIC_SUBPLAN,
  QUERY_NODE_LOGIC_PLAN,
X
Xiaoyu Wang 已提交
152 153 154 155

  // physical plan node
  QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN,
  QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN,
X
Xiaoyu Wang 已提交
156 157
  QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN,
  QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN,
158
  QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN,
X
Xiaoyu Wang 已提交
159 160
  QUERY_NODE_PHYSICAL_PLAN_PROJECT,
  QUERY_NODE_PHYSICAL_PLAN_JOIN,
X
Xiaoyu Wang 已提交
161 162 163
  QUERY_NODE_PHYSICAL_PLAN_AGG,
  QUERY_NODE_PHYSICAL_PLAN_EXCHANGE,
  QUERY_NODE_PHYSICAL_PLAN_SORT,
X
Xiaoyu Wang 已提交
164
  QUERY_NODE_PHYSICAL_PLAN_INTERVAL,
X
Xiaoyu Wang 已提交
165
  QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW,
X
Xiaoyu Wang 已提交
166
  QUERY_NODE_PHYSICAL_PLAN_DISPATCH,
167
  QUERY_NODE_PHYSICAL_PLAN_INSERT,
X
Xiaoyu Wang 已提交
168 169
  QUERY_NODE_PHYSICAL_SUBPLAN,
  QUERY_NODE_PHYSICAL_PLAN
170 171 172 173 174 175 176 177 178 179
} 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;

180
typedef struct SListCell {
181
  struct SListCell* pPrev;
182
  struct SListCell* pNext;
183
  SNode* pNode;
184 185 186
} SListCell;

typedef struct SNodeList {
X
Xiaoyu Wang 已提交
187
  int32_t length;
188 189
  SListCell* pHead;
  SListCell* pTail;
190 191
} SNodeList;

X
Xiaoyu Wang 已提交
192 193 194 195
#define SNodeptr void*  

SNodeptr nodesMakeNode(ENodeType type);
void nodesDestroyNode(SNodeptr pNode);
196 197

SNodeList* nodesMakeList();
X
Xiaoyu Wang 已提交
198
int32_t nodesListAppend(SNodeList* pList, SNodeptr pNode);
199
int32_t nodesListStrictAppend(SNodeList* pList, SNodeptr pNode);
X
Xiaoyu Wang 已提交
200
int32_t nodesListMakeAppend(SNodeList** pList, SNodeptr pNode);
X
Xiaoyu Wang 已提交
201
int32_t nodesListAppendList(SNodeList* pTarget, SNodeList* pSrc);
202
int32_t nodesListStrictAppendList(SNodeList* pTarget, SNodeList* pSrc);
203
SListCell* nodesListErase(SNodeList* pList, SListCell* pCell);
X
Xiaoyu Wang 已提交
204
SNodeptr nodesListGetNode(SNodeList* pList, int32_t index);
205
void nodesDestroyList(SNodeList* pList);
X
Xiaoyu Wang 已提交
206 207
// Only clear the linked list structure, without releasing the elements inside
void nodesClearList(SNodeList* pList);
208

209 210 211 212 213
typedef enum EDealRes {
  DEAL_RES_CONTINUE = 1,
  DEAL_RES_IGNORE_CHILD,
  DEAL_RES_ERROR,
} EDealRes;
214

215
typedef EDealRes (*FNodeWalker)(SNode* pNode, void* pContext);
X
Xiaoyu Wang 已提交
216 217 218 219
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);
220 221

typedef EDealRes (*FNodeRewriter)(SNode** pNode, void* pContext);
X
Xiaoyu Wang 已提交
222 223 224 225
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);
226

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

X
Xiaoyu Wang 已提交
229
SNodeptr nodesCloneNode(const SNodeptr pNode);
X
Xiaoyu Wang 已提交
230
SNodeList* nodesCloneList(const SNodeList* pList);
231

232
const char* nodesNodeName(ENodeType type);
X
Xiaoyu Wang 已提交
233
int32_t nodesNodeToString(const SNodeptr pNode, bool format, char** pStr, int32_t* pLen);
234
int32_t nodesStringToNode(const char* pStr, SNode** pNode);
235

X
Xiaoyu Wang 已提交
236 237 238
int32_t nodesListToString(const SNodeList* pList, bool format, char** pStr, int32_t* pLen);
int32_t nodesStringToList(const char* pStr, SNodeList** pList);

D
dapan1121 已提交
239 240
int32_t nodesNodeToSQL(SNode *pNode, char *buf, int32_t bufSize, int32_t *len);

241 242 243 244 245
#ifdef __cplusplus
}
#endif

#endif /*_TD_NODES_H_*/