querynodes.h 9.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
/*
 * 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_QUERY_NODES_H_
#define _TD_QUERY_NODES_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "nodes.h"
X
Xiaoyu Wang 已提交
24
#include "tmsg.h"
D
dapan1121 已提交
25
#include "tvariant.h"
26

X
Xiaoyu Wang 已提交
27
#define TABLE_TOTAL_COL_NUM(pMeta) ((pMeta)->tableInfo.numOfColumns + (pMeta)->tableInfo.numOfTags)
X
Xiaoyu Wang 已提交
28 29 30 31
#define TABLE_META_SIZE(pMeta) \
  (NULL == (pMeta) ? 0 : (sizeof(STableMeta) + TABLE_TOTAL_COL_NUM((pMeta)) * sizeof(SSchema)))
#define VGROUPS_INFO_SIZE(pInfo) \
  (NULL == (pInfo) ? 0 : (sizeof(SVgroupsInfo) + (pInfo)->numOfVgroups * sizeof(SVgroupInfo)))
X
Xiaoyu Wang 已提交
32

33 34
typedef struct SRawExprNode {
  ENodeType nodeType;
X
Xiaoyu Wang 已提交
35 36 37
  char*     p;
  uint32_t  n;
  SNode*    pNode;
38 39 40 41 42 43 44 45 46 47
} SRawExprNode;

typedef struct SDataType {
  uint8_t type;
  uint8_t precision;
  uint8_t scale;
  int32_t bytes;
} SDataType;

typedef struct SExprNode {
X
Xiaoyu Wang 已提交
48
  ENodeType type;
49
  SDataType resType;
X
Xiaoyu Wang 已提交
50 51
  char      aliasName[TSDB_COL_NAME_LEN];
  SArray*   pAssociation;
52 53
} SExprNode;

X
Xiaoyu Wang 已提交
54
typedef enum EColumnType { COLUMN_TYPE_COLUMN = 1, COLUMN_TYPE_TAG } EColumnType;
55 56

typedef struct SColumnNode {
X
Xiaoyu Wang 已提交
57 58 59 60 61 62 63 64 65 66 67 68
  SExprNode   node;  // QUERY_NODE_COLUMN
  uint64_t    tableId;
  int8_t      tableType;
  col_id_t    colId;
  EColumnType colType;  // column or tag
  char        dbName[TSDB_DB_NAME_LEN];
  char        tableName[TSDB_TABLE_NAME_LEN];
  char        tableAlias[TSDB_TABLE_NAME_LEN];
  char        colName[TSDB_COL_NAME_LEN];
  SNode*      pProjectRef;
  int16_t     dataBlockId;
  int16_t     slotId;
X
Xiaoyu Wang 已提交
69 70
} SColumnNode;

X
Xiaoyu Wang 已提交
71 72
typedef struct STargetNode {
  ENodeType type;
X
Xiaoyu Wang 已提交
73 74 75
  int16_t   dataBlockId;
  int16_t   slotId;
  SNode*    pExpr;
X
Xiaoyu Wang 已提交
76 77
} STargetNode;

78
typedef struct SValueNode {
X
Xiaoyu Wang 已提交
79 80 81 82 83
  SExprNode node;  // QUERY_NODE_VALUE
  char*     literal;
  bool      isDuration;
  bool      translate;
  int16_t   placeholderNo;
84
  union {
X
Xiaoyu Wang 已提交
85 86
    bool     b;
    int64_t  i;
87
    uint64_t u;
X
Xiaoyu Wang 已提交
88 89
    double   d;
    char*    p;
90
  } datum;
D
dapan1121 已提交
91
  int64_t typeData;
X
Xiaoyu Wang 已提交
92
  char    unit;
93 94 95
} SValueNode;

typedef struct SOperatorNode {
X
Xiaoyu Wang 已提交
96
  SExprNode     node;  // QUERY_NODE_OPERATOR
97
  EOperatorType opType;
X
Xiaoyu Wang 已提交
98 99
  SNode*        pLeft;
  SNode*        pRight;
100 101 102
} SOperatorNode;

typedef struct SLogicConditionNode {
X
Xiaoyu Wang 已提交
103
  SExprNode           node;  // QUERY_NODE_LOGIC_CONDITION
104
  ELogicConditionType condType;
X
Xiaoyu Wang 已提交
105
  SNodeList*          pParameterList;
106 107 108
} SLogicConditionNode;

typedef struct SNodeListNode {
X
Xiaoyu Wang 已提交
109 110
  ENodeType  type;  // QUERY_NODE_NODE_LIST
  SDataType  dataType;
111 112 113 114
  SNodeList* pNodeList;
} SNodeListNode;

typedef struct SFunctionNode {
X
Xiaoyu Wang 已提交
115 116 117 118
  SExprNode  node;  // QUERY_NODE_FUNCTION
  char       functionName[TSDB_FUNC_NAME_LEN];
  int32_t    funcId;
  int32_t    funcType;
119
  SNodeList* pParameterList;
X
Xiaoyu Wang 已提交
120
  int32_t    udfBufSize;
121 122 123
} SFunctionNode;

typedef struct STableNode {
X
Xiaoyu Wang 已提交
124
  SExprNode node;
X
Xiaoyu Wang 已提交
125 126 127 128
  char      dbName[TSDB_DB_NAME_LEN];
  char      tableName[TSDB_TABLE_NAME_LEN];
  char      tableAlias[TSDB_TABLE_NAME_LEN];
  uint8_t   precision;
129 130 131 132 133
} STableNode;

struct STableMeta;

typedef struct SRealTableNode {
X
Xiaoyu Wang 已提交
134
  STableNode         table;  // QUERY_NODE_REAL_TABLE
135
  struct STableMeta* pMeta;
X
Xiaoyu Wang 已提交
136 137 138
  SVgroupsInfo*      pVgroupList;
  char               qualDbName[TSDB_DB_NAME_LEN];  // SHOW qualDbName.TABLES
  double             ratio;
139 140 141
} SRealTableNode;

typedef struct STempTableNode {
X
Xiaoyu Wang 已提交
142 143
  STableNode table;  // QUERY_NODE_TEMP_TABLE
  SNode*     pSubquery;
144 145
} STempTableNode;

X
Xiaoyu Wang 已提交
146
typedef enum EJoinType { JOIN_TYPE_INNER = 1 } EJoinType;
147 148

typedef struct SJoinTableNode {
X
Xiaoyu Wang 已提交
149 150 151 152 153
  STableNode table;  // QUERY_NODE_JOIN_TABLE
  EJoinType  joinType;
  SNode*     pLeft;
  SNode*     pRight;
  SNode*     pOnCond;
154 155
} SJoinTableNode;

X
Xiaoyu Wang 已提交
156
typedef enum EGroupingSetType { GP_TYPE_NORMAL = 1 } EGroupingSetType;
157 158

typedef struct SGroupingSetNode {
X
Xiaoyu Wang 已提交
159
  ENodeType        type;  // QUERY_NODE_GROUPING_SET
160
  EGroupingSetType groupingSetType;
X
Xiaoyu Wang 已提交
161
  SNodeList*       pParameterList;
162 163
} SGroupingSetNode;

X
Xiaoyu Wang 已提交
164
typedef enum EOrder { ORDER_ASC = 1, ORDER_DESC } EOrder;
165

X
Xiaoyu Wang 已提交
166
typedef enum ENullOrder { NULL_ORDER_DEFAULT = 1, NULL_ORDER_FIRST, NULL_ORDER_LAST } ENullOrder;
167 168

typedef struct SOrderByExprNode {
X
Xiaoyu Wang 已提交
169 170 171
  ENodeType  type;  // QUERY_NODE_ORDER_BY_EXPR
  SNode*     pExpr;
  EOrder     order;
172 173 174 175
  ENullOrder nullOrder;
} SOrderByExprNode;

typedef struct SLimitNode {
X
Xiaoyu Wang 已提交
176 177 178
  ENodeType type;  // QUERY_NODE_LIMIT
  int64_t   limit;
  int64_t   offset;
179 180 181
} SLimitNode;

typedef struct SStateWindowNode {
X
Xiaoyu Wang 已提交
182 183 184
  ENodeType type;  // QUERY_NODE_STATE_WINDOW
  SNode*    pCol;  // timestamp primary key
  SNode*    pExpr;
185 186 187
} SStateWindowNode;

typedef struct SSessionWindowNode {
X
Xiaoyu Wang 已提交
188 189 190
  ENodeType    type;  // QUERY_NODE_SESSION_WINDOW
  SColumnNode* pCol;  // timestamp primary key
  SValueNode*  pGap;  // gap between two session window(in microseconds)
191 192 193
} SSessionWindowNode;

typedef struct SIntervalWindowNode {
X
Xiaoyu Wang 已提交
194 195 196 197 198 199
  ENodeType type;       // QUERY_NODE_INTERVAL_WINDOW
  SNode*    pCol;       // timestamp primary key
  SNode*    pInterval;  // SValueNode
  SNode*    pOffset;    // SValueNode
  SNode*    pSliding;   // SValueNode
  SNode*    pFill;
200 201 202 203 204 205 206 207 208 209 210 211
} SIntervalWindowNode;

typedef enum EFillMode {
  FILL_MODE_NONE = 1,
  FILL_MODE_VALUE,
  FILL_MODE_PREV,
  FILL_MODE_NULL,
  FILL_MODE_LINEAR,
  FILL_MODE_NEXT
} EFillMode;

typedef struct SFillNode {
X
Xiaoyu Wang 已提交
212
  ENodeType type;  // QUERY_NODE_FILL
213
  EFillMode mode;
X
Xiaoyu Wang 已提交
214 215
  SNode*    pValues;    // SNodeListNode
  SNode*    pWStartTs;  // _wstartts pseudo column
216 217 218
} SFillNode;

typedef struct SSelectStmt {
X
Xiaoyu Wang 已提交
219 220 221 222 223 224 225 226 227 228
  ENodeType   type;  // QUERY_NODE_SELECT_STMT
  bool        isDistinct;
  SNodeList*  pProjectionList;
  SNode*      pFromTable;
  SNode*      pWhere;
  SNodeList*  pPartitionByList;
  SNode*      pWindow;
  SNodeList*  pGroupByList;  // SGroupingSetNode
  SNode*      pHaving;
  SNodeList*  pOrderByList;  // SOrderByExprNode
X
Xiaoyu Wang 已提交
229 230
  SLimitNode* pLimit;
  SLimitNode* pSlimit;
X
Xiaoyu Wang 已提交
231 232 233 234
  char        stmtName[TSDB_TABLE_NAME_LEN];
  uint8_t     precision;
  bool        isEmptyResult;
  bool        hasAggFuncs;
X
Xiaoyu Wang 已提交
235
  bool        isTimeOrderQuery;
236 237
} SSelectStmt;

X
Xiaoyu Wang 已提交
238
typedef enum ESetOperatorType { SET_OP_TYPE_UNION_ALL = 1, SET_OP_TYPE_UNION } ESetOperatorType;
239 240

typedef struct SSetOperator {
X
Xiaoyu Wang 已提交
241
  ENodeType        type;  // QUERY_NODE_SET_OPERATOR
242
  ESetOperatorType opType;
X
Xiaoyu Wang 已提交
243 244 245 246 247
  SNodeList*       pProjectionList;
  SNode*           pLeft;
  SNode*           pRight;
  SNodeList*       pOrderByList;  // SOrderByExprNode
  SNode*           pLimit;
248 249
} SSetOperator;

X
Xiaoyu Wang 已提交
250 251 252 253 254 255 256
typedef enum ESqlClause {
  SQL_CLAUSE_FROM = 1,
  SQL_CLAUSE_WHERE,
  SQL_CLAUSE_PARTITION_BY,
  SQL_CLAUSE_WINDOW,
  SQL_CLAUSE_GROUP_BY,
  SQL_CLAUSE_HAVING,
X
Xiaoyu Wang 已提交
257
  SQL_CLAUSE_DISTINCT,
X
Xiaoyu Wang 已提交
258 259 260 261
  SQL_CLAUSE_SELECT,
  SQL_CLAUSE_ORDER_BY
} ESqlClause;

X
Xiaoyu Wang 已提交
262 263 264 265 266 267 268 269 270
typedef enum {
  PAYLOAD_TYPE_KV = 0,
  PAYLOAD_TYPE_RAW = 1,
} EPayloadType;

typedef struct SVgDataBlocks {
  SVgroupInfo vg;
  int32_t     numOfTables;  // number of tables in current submit block
  uint32_t    size;
X
Xiaoyu Wang 已提交
271
  char*       pData;  // SMsgDesc + SSubmitReq + SSubmitBlk + ...
X
Xiaoyu Wang 已提交
272 273 274
} SVgDataBlocks;

typedef struct SVnodeModifOpStmt {
X
Xiaoyu Wang 已提交
275 276 277 278 279 280
  ENodeType   nodeType;
  ENodeType   sqlNodeType;
  SArray*     pDataBlocks;  // data block for each vgroup, SArray<SVgDataBlocks*>.
  uint8_t     payloadType;  // EPayloadType. 0: K-V payload for non-prepare insert, 1: rawPayload for prepare insert
  uint32_t    insertType;   // insert data from [file|sql statement| bound statement]
  const char* sql;          // current sql statement position
X
Xiaoyu Wang 已提交
281 282
} SVnodeModifOpStmt;

283 284
typedef struct SExplainOptions {
  ENodeType type;
X
Xiaoyu Wang 已提交
285 286
  bool      verbose;
  double    ratio;
287 288 289
} SExplainOptions;

typedef struct SExplainStmt {
X
Xiaoyu Wang 已提交
290 291
  ENodeType        type;
  bool             analyze;
292
  SExplainOptions* pOptions;
X
Xiaoyu Wang 已提交
293
  SNode*           pQuery;
294 295
} SExplainStmt;

X
Xiaoyu Wang 已提交
296 297 298
void nodesWalkSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeWalker walker, void* pContext);
void nodesRewriteSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeRewriter rewriter, void* pContext);

299 300 301
typedef enum ECollectColType { COLLECT_COL_TYPE_COL = 1, COLLECT_COL_TYPE_TAG, COLLECT_COL_TYPE_ALL } ECollectColType;
int32_t nodesCollectColumns(SSelectStmt* pSelect, ESqlClause clause, const char* pTableAlias, ECollectColType type,
                            SNodeList** pCols);
X
Xiaoyu Wang 已提交
302 303

typedef bool (*FFuncClassifier)(int32_t funcId);
X
Xiaoyu Wang 已提交
304
int32_t nodesCollectFuncs(SSelectStmt* pSelect, ESqlClause clause, FFuncClassifier classifier, SNodeList** pFuncs);
X
Xiaoyu Wang 已提交
305

306 307
int32_t nodesCollectSpecialNodes(SSelectStmt* pSelect, ESqlClause clause, ENodeType type, SNodeList** pNodes);

308 309
bool nodesIsExprNode(const SNode* pNode);

X
Xiaoyu Wang 已提交
310
bool nodesIsUnaryOp(const SOperatorNode* pOp);
311 312 313 314 315 316
bool nodesIsArithmeticOp(const SOperatorNode* pOp);
bool nodesIsComparisonOp(const SOperatorNode* pOp);
bool nodesIsJsonOp(const SOperatorNode* pOp);

bool nodesIsTimeorderQuery(const SNode* pQuery);
bool nodesIsTimelineQuery(const SNode* pQuery);
X
Xiaoyu Wang 已提交
317

X
Xiaoyu Wang 已提交
318 319 320 321 322
void*   nodesGetValueFromNode(SValueNode* pNode);
int32_t nodesSetValueNodeValue(SValueNode* pNode, void* value);
char*   nodesGetStrValueFromNode(SValueNode* pNode);
char*   getFillModeString(EFillMode mode);
void    valueNodeToVariant(const SValueNode* pNode, SVariant* pVal);
323 324 325 326 327

#ifdef __cplusplus
}
#endif

D
dapan1121 已提交
328
#endif /*_TD_QUERY_NODES_H_*/