querynodes.h 13.7 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
  char      aliasName[TSDB_COL_NAME_LEN];
51
  char      userAlias[TSDB_COL_NAME_LEN];
X
Xiaoyu Wang 已提交
52
  SArray*   pAssociation;
53
  bool      orderAlias;
54 55
} SExprNode;

56 57 58 59
typedef enum EColumnType {
  COLUMN_TYPE_COLUMN = 1,
  COLUMN_TYPE_TAG,
  COLUMN_TYPE_TBNAME,
60 61 62
  COLUMN_TYPE_WINDOW_START,
  COLUMN_TYPE_WINDOW_END,
  COLUMN_TYPE_WINDOW_DURATION,
63 64
  COLUMN_TYPE_GROUP_KEY
} EColumnType;
65 66

typedef struct SColumnNode {
X
Xiaoyu Wang 已提交
67 68 69 70 71
  SExprNode   node;  // QUERY_NODE_COLUMN
  uint64_t    tableId;
  int8_t      tableType;
  col_id_t    colId;
  EColumnType colType;  // column or tag
X
Xiaoyu Wang 已提交
72
  bool        hasIndex;
X
Xiaoyu Wang 已提交
73 74 75 76
  char        dbName[TSDB_DB_NAME_LEN];
  char        tableName[TSDB_TABLE_NAME_LEN];
  char        tableAlias[TSDB_TABLE_NAME_LEN];
  char        colName[TSDB_COL_NAME_LEN];
77 78 79
  // SNode*      pProjectRef;
  int16_t dataBlockId;
  int16_t slotId;
X
Xiaoyu Wang 已提交
80 81
} SColumnNode;

82 83 84 85 86
typedef struct SColumnRefNode {
  ENodeType type;
  char      colName[TSDB_COL_NAME_LEN];
} SColumnRefNode;

X
Xiaoyu Wang 已提交
87 88
typedef struct STargetNode {
  ENodeType type;
X
Xiaoyu Wang 已提交
89 90 91
  int16_t   dataBlockId;
  int16_t   slotId;
  SNode*    pExpr;
X
Xiaoyu Wang 已提交
92 93
} STargetNode;

94
typedef struct SValueNode {
X
Xiaoyu Wang 已提交
95 96 97 98
  SExprNode node;  // QUERY_NODE_VALUE
  char*     literal;
  bool      isDuration;
  bool      translate;
99
  bool      notReserved;
100
  bool      isNull;
X
Xiaoyu Wang 已提交
101
  int16_t   placeholderNo;
102
  union {
X
Xiaoyu Wang 已提交
103 104
    bool     b;
    int64_t  i;
105
    uint64_t u;
X
Xiaoyu Wang 已提交
106 107
    double   d;
    char*    p;
108
  } datum;
D
dapan1121 已提交
109
  int64_t typeData;
X
Xiaoyu Wang 已提交
110
  char    unit;
111 112
} SValueNode;

113 114 115 116
typedef struct SLeftValueNode {
  ENodeType type;
} SLeftValueNode;

117
typedef struct SOperatorNode {
X
Xiaoyu Wang 已提交
118
  SExprNode     node;  // QUERY_NODE_OPERATOR
119
  EOperatorType opType;
X
Xiaoyu Wang 已提交
120 121
  SNode*        pLeft;
  SNode*        pRight;
122 123 124
} SOperatorNode;

typedef struct SLogicConditionNode {
X
Xiaoyu Wang 已提交
125
  SExprNode           node;  // QUERY_NODE_LOGIC_CONDITION
126
  ELogicConditionType condType;
X
Xiaoyu Wang 已提交
127
  SNodeList*          pParameterList;
128 129 130
} SLogicConditionNode;

typedef struct SNodeListNode {
X
Xiaoyu Wang 已提交
131 132
  ENodeType  type;  // QUERY_NODE_NODE_LIST
  SDataType  dataType;
133 134 135 136
  SNodeList* pNodeList;
} SNodeListNode;

typedef struct SFunctionNode {
X
Xiaoyu Wang 已提交
137 138 139 140
  SExprNode  node;  // QUERY_NODE_FUNCTION
  char       functionName[TSDB_FUNC_NAME_LEN];
  int32_t    funcId;
  int32_t    funcType;
141
  SNodeList* pParameterList;
X
Xiaoyu Wang 已提交
142
  int32_t    udfBufSize;
143 144 145
} SFunctionNode;

typedef struct STableNode {
X
Xiaoyu Wang 已提交
146
  SExprNode node;
X
Xiaoyu Wang 已提交
147 148 149 150
  char      dbName[TSDB_DB_NAME_LEN];
  char      tableName[TSDB_TABLE_NAME_LEN];
  char      tableAlias[TSDB_TABLE_NAME_LEN];
  uint8_t   precision;
X
Xiaoyu Wang 已提交
151
  bool      singleTable;
152 153 154 155 156
} STableNode;

struct STableMeta;

typedef struct SRealTableNode {
X
Xiaoyu Wang 已提交
157
  STableNode         table;  // QUERY_NODE_REAL_TABLE
158
  struct STableMeta* pMeta;
X
Xiaoyu Wang 已提交
159 160 161
  SVgroupsInfo*      pVgroupList;
  char               qualDbName[TSDB_DB_NAME_LEN];  // SHOW qualDbName.TABLES
  double             ratio;
X
Xiaoyu Wang 已提交
162
  SArray*            pSmaIndexes;
163
  int8_t             cacheLastMode;
164 165 166
} SRealTableNode;

typedef struct STempTableNode {
X
Xiaoyu Wang 已提交
167 168
  STableNode table;  // QUERY_NODE_TEMP_TABLE
  SNode*     pSubquery;
169 170
} STempTableNode;

X
Xiaoyu Wang 已提交
171
typedef enum EJoinType { JOIN_TYPE_INNER = 1 } EJoinType;
172 173

typedef struct SJoinTableNode {
X
Xiaoyu Wang 已提交
174 175 176 177 178
  STableNode table;  // QUERY_NODE_JOIN_TABLE
  EJoinType  joinType;
  SNode*     pLeft;
  SNode*     pRight;
  SNode*     pOnCond;
179 180
} SJoinTableNode;

X
Xiaoyu Wang 已提交
181
typedef enum EGroupingSetType { GP_TYPE_NORMAL = 1 } EGroupingSetType;
182 183

typedef struct SGroupingSetNode {
X
Xiaoyu Wang 已提交
184
  ENodeType        type;  // QUERY_NODE_GROUPING_SET
185
  EGroupingSetType groupingSetType;
X
Xiaoyu Wang 已提交
186
  SNodeList*       pParameterList;
187 188
} SGroupingSetNode;

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

X
Xiaoyu Wang 已提交
191
typedef enum ENullOrder { NULL_ORDER_DEFAULT = 1, NULL_ORDER_FIRST, NULL_ORDER_LAST } ENullOrder;
192 193

typedef struct SOrderByExprNode {
X
Xiaoyu Wang 已提交
194 195 196
  ENodeType  type;  // QUERY_NODE_ORDER_BY_EXPR
  SNode*     pExpr;
  EOrder     order;
197 198 199 200
  ENullOrder nullOrder;
} SOrderByExprNode;

typedef struct SLimitNode {
X
Xiaoyu Wang 已提交
201 202 203
  ENodeType type;  // QUERY_NODE_LIMIT
  int64_t   limit;
  int64_t   offset;
204 205 206
} SLimitNode;

typedef struct SStateWindowNode {
X
Xiaoyu Wang 已提交
207 208 209
  ENodeType type;  // QUERY_NODE_STATE_WINDOW
  SNode*    pCol;  // timestamp primary key
  SNode*    pExpr;
210 211 212
} SStateWindowNode;

typedef struct SSessionWindowNode {
X
Xiaoyu Wang 已提交
213 214 215
  ENodeType    type;  // QUERY_NODE_SESSION_WINDOW
  SColumnNode* pCol;  // timestamp primary key
  SValueNode*  pGap;  // gap between two session window(in microseconds)
216 217 218
} SSessionWindowNode;

typedef struct SIntervalWindowNode {
X
Xiaoyu Wang 已提交
219 220 221 222 223 224
  ENodeType type;       // QUERY_NODE_INTERVAL_WINDOW
  SNode*    pCol;       // timestamp primary key
  SNode*    pInterval;  // SValueNode
  SNode*    pOffset;    // SValueNode
  SNode*    pSliding;   // SValueNode
  SNode*    pFill;
225 226 227 228 229 230 231 232 233 234 235 236
} 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 已提交
237 238 239
  ENodeType   type;  // QUERY_NODE_FILL
  EFillMode   mode;
  SNode*      pValues;    // SNodeListNode
240
  SNode*      pWStartTs;  // _wstart pseudo column
X
Xiaoyu Wang 已提交
241
  STimeWindow timeRange;
242 243
} SFillNode;

X
Xiaoyu Wang 已提交
244 245 246 247 248 249 250 251 252 253 254 255 256
typedef struct SWhenThenNode {
  SExprNode node;  // QUERY_NODE_WHEN_THEN
  SNode*    pWhen;
  SNode*    pThen;
} SWhenThenNode;

typedef struct SCaseWhenNode {
  SExprNode  node;  // QUERY_NODE_CASE_WHEN
  SNode*     pCase;
  SNode*     pElse;
  SNodeList* pWhenThenList;
} SCaseWhenNode;

257
typedef struct SSelectStmt {
X
Xiaoyu Wang 已提交
258 259 260 261 262 263
  ENodeType   type;  // QUERY_NODE_SELECT_STMT
  bool        isDistinct;
  SNodeList*  pProjectionList;
  SNode*      pFromTable;
  SNode*      pWhere;
  SNodeList*  pPartitionByList;
264 265
  SNodeList*  pTags;      // for create stream
  SNode*      pSubtable;  // for create stream
X
Xiaoyu Wang 已提交
266 267 268
  SNode*      pWindow;
  SNodeList*  pGroupByList;  // SGroupingSetNode
  SNode*      pHaving;
X
Xiaoyu Wang 已提交
269 270 271
  SNode*      pRange;
  SNode*      pEvery;
  SNode*      pFill;
X
Xiaoyu Wang 已提交
272
  SNodeList*  pOrderByList;  // SOrderByExprNode
X
Xiaoyu Wang 已提交
273 274
  SLimitNode* pLimit;
  SLimitNode* pSlimit;
275
  STimeWindow timeRange;
X
Xiaoyu Wang 已提交
276 277
  char        stmtName[TSDB_TABLE_NAME_LEN];
  uint8_t     precision;
278
  int32_t     selectFuncNum;
279
  int32_t     returnRows;  // EFuncReturnRows
X
Xiaoyu Wang 已提交
280
  bool        isEmptyResult;
281
  bool        isTimeLineResult;
282
  bool        isSubquery;
X
Xiaoyu Wang 已提交
283
  bool        hasAggFuncs;
X
Xiaoyu Wang 已提交
284
  bool        hasRepeatScanFuncs;
X
Xiaoyu Wang 已提交
285
  bool        hasIndefiniteRowsFunc;
286
  bool        hasMultiRowsFunc;
X
Xiaoyu Wang 已提交
287
  bool        hasSelectFunc;
288
  bool        hasSelectValFunc;
289
  bool        hasOtherVectorFunc;
290 291
  bool        hasUniqueFunc;
  bool        hasTailFunc;
X
Xiaoyu Wang 已提交
292
  bool        hasInterpFunc;
X
Xiaoyu Wang 已提交
293
  bool        hasLastRowFunc;
X
Xiaoyu Wang 已提交
294
  bool        hasLastFunc;
295
  bool        hasTimeLineFunc;
X
Xiaoyu Wang 已提交
296
  bool        hasUdaf;
297
  bool        hasStateKey;
H
Haojun Liao 已提交
298
  bool        onlyHasKeepOrderFunc;
299
  bool        groupSort;
300
  bool        tagScan;
301 302
} SSelectStmt;

X
Xiaoyu Wang 已提交
303
typedef enum ESetOperatorType { SET_OP_TYPE_UNION_ALL = 1, SET_OP_TYPE_UNION } ESetOperatorType;
304 305

typedef struct SSetOperator {
X
Xiaoyu Wang 已提交
306
  ENodeType        type;  // QUERY_NODE_SET_OPERATOR
307
  ESetOperatorType opType;
X
Xiaoyu Wang 已提交
308 309 310 311 312
  SNodeList*       pProjectionList;
  SNode*           pLeft;
  SNode*           pRight;
  SNodeList*       pOrderByList;  // SOrderByExprNode
  SNode*           pLimit;
313
  char             stmtName[TSDB_TABLE_NAME_LEN];
X
Xiaoyu Wang 已提交
314
  uint8_t          precision;
315 316
} SSetOperator;

X
Xiaoyu Wang 已提交
317 318 319 320 321
typedef enum ESqlClause {
  SQL_CLAUSE_FROM = 1,
  SQL_CLAUSE_WHERE,
  SQL_CLAUSE_PARTITION_BY,
  SQL_CLAUSE_WINDOW,
322
  SQL_CLAUSE_FILL,
X
Xiaoyu Wang 已提交
323 324
  SQL_CLAUSE_GROUP_BY,
  SQL_CLAUSE_HAVING,
X
Xiaoyu Wang 已提交
325
  SQL_CLAUSE_DISTINCT,
X
Xiaoyu Wang 已提交
326 327 328 329
  SQL_CLAUSE_SELECT,
  SQL_CLAUSE_ORDER_BY
} ESqlClause;

X
Xiaoyu Wang 已提交
330
typedef struct SDeleteStmt {
X
Xiaoyu Wang 已提交
331 332 333 334
  ENodeType   type;        // QUERY_NODE_DELETE_STMT
  SNode*      pFromTable;  // FROM clause
  SNode*      pWhere;      // WHERE clause
  SNode*      pCountFunc;  // count the number of rows affected
335 336
  SNode*      pFirstFunc;  // the start timestamp when the data was actually deleted
  SNode*      pLastFunc;   // the end timestamp when the data was actually deleted
X
Xiaoyu Wang 已提交
337
  SNode*      pTagCond;    // pWhere divided into pTagCond and timeRange
X
Xiaoyu Wang 已提交
338 339 340 341 342
  STimeWindow timeRange;
  uint8_t     precision;
  bool        deleteZeroRows;
} SDeleteStmt;

343 344 345 346 347 348 349 350
typedef struct SInsertStmt {
  ENodeType  type;  // QUERY_NODE_INSERT_STMT
  SNode*     pTable;
  SNodeList* pCols;
  SNode*     pQuery;
  uint8_t    precision;
} SInsertStmt;

X
Xiaoyu Wang 已提交
351 352 353 354
typedef struct SVgDataBlocks {
  SVgroupInfo vg;
  int32_t     numOfTables;  // number of tables in current submit block
  uint32_t    size;
X
Xiaoyu Wang 已提交
355
  void*       pData;  // SMsgDesc + SSubmitReq + SSubmitBlk + ...
X
Xiaoyu Wang 已提交
356 357
} SVgDataBlocks;

X
Xiaoyu Wang 已提交
358 359 360
typedef void (*FFreeDataBlockHash)(SHashObj*);
typedef void (*FFreeDataBlockArray)(SArray*);

X
Xiaoyu Wang 已提交
361
typedef struct SVnodeModifOpStmt {
X
Xiaoyu Wang 已提交
362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
  ENodeType           nodeType;
  ENodeType           sqlNodeType;
  SArray*             pDataBlocks;  // data block for each vgroup, SArray<SVgDataBlocks*>.
  uint32_t            insertType;   // insert data from [file|sql statement| bound statement]
  const char*         pSql;         // current sql statement position
  int32_t             totalRowsNum;
  int32_t             totalTbNum;
  SName               targetTableName;
  SName               usingTableName;
  const char*         pBoundCols;
  struct STableMeta*  pTableMeta;
  SHashObj*           pVgroupsHashObj;
  SHashObj*           pTableBlockHashObj;
  SHashObj*           pSubTableHashObj;
  SHashObj*           pTableNameHashObj;
  SHashObj*           pDbFNameHashObj;
  SArray*             pVgDataBlocks;
  SVCreateTbReq       createTblReq;
  TdFilePtr           fp;
  FFreeDataBlockHash  freeHashFunc;
  FFreeDataBlockArray freeArrayFunc;
  bool                usingTableProcessing;
  bool                fileProcessing;
X
Xiaoyu Wang 已提交
385 386
} SVnodeModifOpStmt;

387 388
typedef struct SExplainOptions {
  ENodeType type;
X
Xiaoyu Wang 已提交
389 390
  bool      verbose;
  double    ratio;
391 392 393
} SExplainOptions;

typedef struct SExplainStmt {
X
Xiaoyu Wang 已提交
394 395
  ENodeType        type;
  bool             analyze;
396
  SExplainOptions* pOptions;
X
Xiaoyu Wang 已提交
397
  SNode*           pQuery;
398 399
} SExplainStmt;

X
Xiaoyu Wang 已提交
400 401 402 403 404 405 406 407 408 409 410 411 412 413
typedef struct SCmdMsgInfo {
  int16_t msgType;
  SEpSet  epSet;
  void*   pMsg;
  int32_t msgLen;
} SCmdMsgInfo;

typedef enum EQueryExecMode {
  QUERY_EXEC_MODE_LOCAL = 1,
  QUERY_EXEC_MODE_RPC,
  QUERY_EXEC_MODE_SCHEDULE,
  QUERY_EXEC_MODE_EMPTY_RESULT
} EQueryExecMode;

X
Xiaoyu Wang 已提交
414 415 416 417 418 419 420
typedef enum EQueryExecStage {
  QUERY_EXEC_STAGE_PARSE = 1,
  QUERY_EXEC_STAGE_ANALYSE,
  QUERY_EXEC_STAGE_SCHEDULE,
  QUERY_EXEC_STAGE_END
} EQueryExecStage;

X
Xiaoyu Wang 已提交
421
typedef struct SQuery {
X
Xiaoyu Wang 已提交
422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439
  ENodeType       type;
  EQueryExecStage execStage;
  EQueryExecMode  execMode;
  bool            haveResultSet;
  SNode*          pRoot;
  int32_t         numOfResCols;
  SSchema*        pResSchema;
  int8_t          precision;
  SCmdMsgInfo*    pCmdMsg;
  int32_t         msgType;
  SArray*         pTargetTableList;
  SArray*         pTableList;
  SArray*         pDbList;
  bool            showRewrite;
  int32_t         placeholderNum;
  SArray*         pPlaceholderValues;
  SNode*          pPrepareRoot;
  bool            stableQuery;
X
Xiaoyu Wang 已提交
440 441
} SQuery;

X
Xiaoyu Wang 已提交
442 443 444
void nodesWalkSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeWalker walker, void* pContext);
void nodesRewriteSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeRewriter rewriter, void* pContext);

445 446 447
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);
448
int32_t nodesCollectColumnsFromNode(SNode* node, const char* pTableAlias, ECollectColType type, SNodeList** pCols);
X
Xiaoyu Wang 已提交
449 450

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

453 454
int32_t nodesCollectSpecialNodes(SSelectStmt* pSelect, ESqlClause clause, ENodeType type, SNodeList** pNodes);

455 456
bool nodesIsExprNode(const SNode* pNode);

X
Xiaoyu Wang 已提交
457
bool nodesIsUnaryOp(const SOperatorNode* pOp);
458 459 460
bool nodesIsArithmeticOp(const SOperatorNode* pOp);
bool nodesIsComparisonOp(const SOperatorNode* pOp);
bool nodesIsJsonOp(const SOperatorNode* pOp);
X
Xiaoyu Wang 已提交
461
bool nodesIsRegularOp(const SOperatorNode* pOp);
X
Xiaoyu Wang 已提交
462
bool nodesIsBitwiseOp(const SOperatorNode* pOp);
463

464 465 466
bool nodesExprHasColumn(SNode* pNode);
bool nodesExprsHasColumn(SNodeList* pList);

X
Xiaoyu Wang 已提交
467 468 469
void*   nodesGetValueFromNode(SValueNode* pNode);
int32_t nodesSetValueNodeValue(SValueNode* pNode, void* value);
char*   nodesGetStrValueFromNode(SValueNode* pNode);
X
Xiaoyu Wang 已提交
470 471 472 473
void    nodesValueNodeToVariant(const SValueNode* pNode, SVariant* pVal);

char*   nodesGetFillModeString(EFillMode mode);
int32_t nodesMergeConds(SNode** pDst, SNodeList** pSrc);
474

475 476 477
const char* operatorTypeStr(EOperatorType type);
const char* logicConditionTypeStr(ELogicConditionType type);

478 479 480 481
#ifdef __cplusplus
}
#endif

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