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

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

typedef struct SColumnNode {
X
Xiaoyu Wang 已提交
58 59 60 61 62 63 64 65 66 67 68 69
  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 已提交
70 71
} SColumnNode;

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

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

97 98 99 100
typedef struct SLeftValueNode {
  ENodeType type;
} SLeftValueNode;

101
typedef struct SOperatorNode {
X
Xiaoyu Wang 已提交
102
  SExprNode     node;  // QUERY_NODE_OPERATOR
103
  EOperatorType opType;
X
Xiaoyu Wang 已提交
104 105
  SNode*        pLeft;
  SNode*        pRight;
106 107 108
} SOperatorNode;

typedef struct SLogicConditionNode {
X
Xiaoyu Wang 已提交
109
  SExprNode           node;  // QUERY_NODE_LOGIC_CONDITION
110
  ELogicConditionType condType;
X
Xiaoyu Wang 已提交
111
  SNodeList*          pParameterList;
112 113 114
} SLogicConditionNode;

typedef struct SNodeListNode {
X
Xiaoyu Wang 已提交
115 116
  ENodeType  type;  // QUERY_NODE_NODE_LIST
  SDataType  dataType;
117 118 119 120
  SNodeList* pNodeList;
} SNodeListNode;

typedef struct SFunctionNode {
X
Xiaoyu Wang 已提交
121 122 123 124
  SExprNode  node;  // QUERY_NODE_FUNCTION
  char       functionName[TSDB_FUNC_NAME_LEN];
  int32_t    funcId;
  int32_t    funcType;
125
  SNodeList* pParameterList;
X
Xiaoyu Wang 已提交
126
  int32_t    udfBufSize;
127 128 129
} SFunctionNode;

typedef struct STableNode {
X
Xiaoyu Wang 已提交
130
  SExprNode node;
X
Xiaoyu Wang 已提交
131 132 133 134
  char      dbName[TSDB_DB_NAME_LEN];
  char      tableName[TSDB_TABLE_NAME_LEN];
  char      tableAlias[TSDB_TABLE_NAME_LEN];
  uint8_t   precision;
135 136 137 138 139
} STableNode;

struct STableMeta;

typedef struct SRealTableNode {
X
Xiaoyu Wang 已提交
140
  STableNode         table;  // QUERY_NODE_REAL_TABLE
141
  struct STableMeta* pMeta;
X
Xiaoyu Wang 已提交
142 143 144
  SVgroupsInfo*      pVgroupList;
  char               qualDbName[TSDB_DB_NAME_LEN];  // SHOW qualDbName.TABLES
  double             ratio;
145 146 147
} SRealTableNode;

typedef struct STempTableNode {
X
Xiaoyu Wang 已提交
148 149
  STableNode table;  // QUERY_NODE_TEMP_TABLE
  SNode*     pSubquery;
150 151
} STempTableNode;

X
Xiaoyu Wang 已提交
152
typedef enum EJoinType { JOIN_TYPE_INNER = 1 } EJoinType;
153 154

typedef struct SJoinTableNode {
X
Xiaoyu Wang 已提交
155 156 157 158 159
  STableNode table;  // QUERY_NODE_JOIN_TABLE
  EJoinType  joinType;
  SNode*     pLeft;
  SNode*     pRight;
  SNode*     pOnCond;
160 161
} SJoinTableNode;

X
Xiaoyu Wang 已提交
162
typedef enum EGroupingSetType { GP_TYPE_NORMAL = 1 } EGroupingSetType;
163 164

typedef struct SGroupingSetNode {
X
Xiaoyu Wang 已提交
165
  ENodeType        type;  // QUERY_NODE_GROUPING_SET
166
  EGroupingSetType groupingSetType;
X
Xiaoyu Wang 已提交
167
  SNodeList*       pParameterList;
168 169
} SGroupingSetNode;

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

X
Xiaoyu Wang 已提交
172
typedef enum ENullOrder { NULL_ORDER_DEFAULT = 1, NULL_ORDER_FIRST, NULL_ORDER_LAST } ENullOrder;
173 174

typedef struct SOrderByExprNode {
X
Xiaoyu Wang 已提交
175 176 177
  ENodeType  type;  // QUERY_NODE_ORDER_BY_EXPR
  SNode*     pExpr;
  EOrder     order;
178 179 180 181
  ENullOrder nullOrder;
} SOrderByExprNode;

typedef struct SLimitNode {
X
Xiaoyu Wang 已提交
182 183 184
  ENodeType type;  // QUERY_NODE_LIMIT
  int64_t   limit;
  int64_t   offset;
185 186 187
} SLimitNode;

typedef struct SStateWindowNode {
X
Xiaoyu Wang 已提交
188 189 190
  ENodeType type;  // QUERY_NODE_STATE_WINDOW
  SNode*    pCol;  // timestamp primary key
  SNode*    pExpr;
191 192 193
} SStateWindowNode;

typedef struct SSessionWindowNode {
X
Xiaoyu Wang 已提交
194 195 196
  ENodeType    type;  // QUERY_NODE_SESSION_WINDOW
  SColumnNode* pCol;  // timestamp primary key
  SValueNode*  pGap;  // gap between two session window(in microseconds)
197 198 199
} SSessionWindowNode;

typedef struct SIntervalWindowNode {
X
Xiaoyu Wang 已提交
200 201 202 203 204 205
  ENodeType type;       // QUERY_NODE_INTERVAL_WINDOW
  SNode*    pCol;       // timestamp primary key
  SNode*    pInterval;  // SValueNode
  SNode*    pOffset;    // SValueNode
  SNode*    pSliding;   // SValueNode
  SNode*    pFill;
206 207 208 209 210 211 212 213 214 215 216 217
} 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 已提交
218 219 220 221 222
  ENodeType   type;  // QUERY_NODE_FILL
  EFillMode   mode;
  SNode*      pValues;    // SNodeListNode
  SNode*      pWStartTs;  // _wstartts pseudo column
  STimeWindow timeRange;
223 224 225
} SFillNode;

typedef struct SSelectStmt {
X
Xiaoyu Wang 已提交
226 227 228 229 230 231 232 233 234 235
  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 已提交
236 237
  SLimitNode* pLimit;
  SLimitNode* pSlimit;
X
Xiaoyu Wang 已提交
238 239 240
  char        stmtName[TSDB_TABLE_NAME_LEN];
  uint8_t     precision;
  bool        isEmptyResult;
X
Xiaoyu Wang 已提交
241
  bool        isTimeOrderQuery;
X
Xiaoyu Wang 已提交
242
  bool        hasAggFuncs;
X
Xiaoyu Wang 已提交
243
  bool        hasRepeatScanFuncs;
X
Xiaoyu Wang 已提交
244
  bool        hasIndefiniteRowsFunc;
245
  bool        hasSelectValFunc;
246 247
} SSelectStmt;

X
Xiaoyu Wang 已提交
248
typedef enum ESetOperatorType { SET_OP_TYPE_UNION_ALL = 1, SET_OP_TYPE_UNION } ESetOperatorType;
249 250

typedef struct SSetOperator {
X
Xiaoyu Wang 已提交
251
  ENodeType        type;  // QUERY_NODE_SET_OPERATOR
252
  ESetOperatorType opType;
X
Xiaoyu Wang 已提交
253 254 255 256 257
  SNodeList*       pProjectionList;
  SNode*           pLeft;
  SNode*           pRight;
  SNodeList*       pOrderByList;  // SOrderByExprNode
  SNode*           pLimit;
258
  char             stmtName[TSDB_TABLE_NAME_LEN];
259 260
} SSetOperator;

X
Xiaoyu Wang 已提交
261 262 263 264 265 266 267
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 已提交
268
  SQL_CLAUSE_DISTINCT,
X
Xiaoyu Wang 已提交
269 270 271 272
  SQL_CLAUSE_SELECT,
  SQL_CLAUSE_ORDER_BY
} ESqlClause;

X
Xiaoyu Wang 已提交
273 274 275 276 277 278 279 280 281
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 已提交
282
  char*       pData;  // SMsgDesc + SSubmitReq + SSubmitBlk + ...
X
Xiaoyu Wang 已提交
283 284 285
} SVgDataBlocks;

typedef struct SVnodeModifOpStmt {
X
Xiaoyu Wang 已提交
286 287 288 289 290 291
  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 已提交
292 293
} SVnodeModifOpStmt;

294 295
typedef struct SExplainOptions {
  ENodeType type;
X
Xiaoyu Wang 已提交
296 297
  bool      verbose;
  double    ratio;
298 299 300
} SExplainOptions;

typedef struct SExplainStmt {
X
Xiaoyu Wang 已提交
301 302
  ENodeType        type;
  bool             analyze;
303
  SExplainOptions* pOptions;
X
Xiaoyu Wang 已提交
304
  SNode*           pQuery;
305 306
} SExplainStmt;

X
Xiaoyu Wang 已提交
307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
typedef struct SCmdMsgInfo {
  int16_t msgType;
  SEpSet  epSet;
  void*   pMsg;
  int32_t msgLen;
  void*   pExtension;  // todo remove it soon
} SCmdMsgInfo;

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

typedef struct SQuery {
  ENodeType      type;
  EQueryExecMode execMode;
  bool           haveResultSet;
  SNode*         pRoot;
  int32_t        numOfResCols;
  SSchema*       pResSchema;
  int8_t         precision;
  SCmdMsgInfo*   pCmdMsg;
  int32_t        msgType;
  SArray*        pDbList;
  SArray*        pTableList;
  bool           showRewrite;
  int32_t        placeholderNum;
X
Xiaoyu Wang 已提交
336
  SArray*        pPlaceholderValues;
337
  SNode*         pPrepareRoot;
X
Xiaoyu Wang 已提交
338 339
} SQuery;

X
Xiaoyu Wang 已提交
340 341 342
void nodesWalkSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeWalker walker, void* pContext);
void nodesRewriteSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeRewriter rewriter, void* pContext);

343 344 345
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 已提交
346 347

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

350 351
int32_t nodesCollectSpecialNodes(SSelectStmt* pSelect, ESqlClause clause, ENodeType type, SNodeList** pNodes);

352 353
bool nodesIsExprNode(const SNode* pNode);

X
Xiaoyu Wang 已提交
354
bool nodesIsUnaryOp(const SOperatorNode* pOp);
355 356 357
bool nodesIsArithmeticOp(const SOperatorNode* pOp);
bool nodesIsComparisonOp(const SOperatorNode* pOp);
bool nodesIsJsonOp(const SOperatorNode* pOp);
X
Xiaoyu Wang 已提交
358
bool nodesIsRegularOp(const SOperatorNode* pOp);
359

X
Xiaoyu Wang 已提交
360 361 362 363 364
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);
365 366 367 368 369

#ifdef __cplusplus
}
#endif

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