querynodes.h 14.4 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
  bool      asAlias;
55 56
} SExprNode;

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

typedef struct SColumnNode {
X
Xiaoyu Wang 已提交
68 69 70 71 72
  SExprNode   node;  // QUERY_NODE_COLUMN
  uint64_t    tableId;
  int8_t      tableType;
  col_id_t    colId;
  EColumnType colType;  // column or tag
X
Xiaoyu Wang 已提交
73
  bool        hasIndex;
X
Xiaoyu Wang 已提交
74 75 76 77
  char        dbName[TSDB_DB_NAME_LEN];
  char        tableName[TSDB_TABLE_NAME_LEN];
  char        tableAlias[TSDB_TABLE_NAME_LEN];
  char        colName[TSDB_COL_NAME_LEN];
X
Xiaoyu Wang 已提交
78 79
  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
  int8_t  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 {
131
  SExprNode  node;  // QUERY_NODE_NODE_LIST
132 133 134 135
  SNodeList* pNodeList;
} SNodeListNode;

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

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

struct STableMeta;

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

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

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

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

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

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

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

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

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

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

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

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

typedef struct SIntervalWindowNode {
X
Xiaoyu Wang 已提交
218 219 220 221 222 223
  ENodeType type;       // QUERY_NODE_INTERVAL_WINDOW
  SNode*    pCol;       // timestamp primary key
  SNode*    pInterval;  // SValueNode
  SNode*    pOffset;    // SValueNode
  SNode*    pSliding;   // SValueNode
  SNode*    pFill;
224 225
} SIntervalWindowNode;

X
Xiaoyu Wang 已提交
226 227 228 229 230 231 232
typedef struct SEventWindowNode {
  ENodeType type;  // QUERY_NODE_EVENT_WINDOW
  SNode*    pCol;  // timestamp primary key
  SNode*    pStartCond;
  SNode*    pEndCond;
} SEventWindowNode;

233 234 235
typedef enum EFillMode {
  FILL_MODE_NONE = 1,
  FILL_MODE_VALUE,
D
dapan1121 已提交
236
  FILL_MODE_VALUE_F,
237 238
  FILL_MODE_PREV,
  FILL_MODE_NULL,
D
dapan1121 已提交
239
  FILL_MODE_NULL_F,
240 241 242 243
  FILL_MODE_LINEAR,
  FILL_MODE_NEXT
} EFillMode;

244 245 246 247 248 249
typedef enum ETimeLineMode {
  TIME_LINE_NONE = 1,
  TIME_LINE_MULTI,
  TIME_LINE_GLOBAL,
} ETimeLineMode;

250
typedef struct SFillNode {
X
Xiaoyu Wang 已提交
251 252 253
  ENodeType   type;  // QUERY_NODE_FILL
  EFillMode   mode;
  SNode*      pValues;    // SNodeListNode
254
  SNode*      pWStartTs;  // _wstart pseudo column
X
Xiaoyu Wang 已提交
255
  STimeWindow timeRange;
256 257
} SFillNode;

X
Xiaoyu Wang 已提交
258 259 260 261 262 263 264 265 266 267 268 269 270
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;

271
typedef struct SSelectStmt {
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
  ENodeType     type;  // QUERY_NODE_SELECT_STMT
  bool          isDistinct;
  SNodeList*    pProjectionList;
  SNode*        pFromTable;
  SNode*        pWhere;
  SNodeList*    pPartitionByList;
  SNodeList*    pTags;      // for create stream
  SNode*        pSubtable;  // for create stream
  SNode*        pWindow;
  SNodeList*    pGroupByList;  // SGroupingSetNode
  SNode*        pHaving;
  SNode*        pRange;
  SNode*        pEvery;
  SNode*        pFill;
  SNodeList*    pOrderByList;  // SOrderByExprNode
  SLimitNode*   pLimit;
  SLimitNode*   pSlimit;
  STimeWindow   timeRange;
  char          stmtName[TSDB_TABLE_NAME_LEN];
  uint8_t       precision;
  int32_t       selectFuncNum;
  int32_t       returnRows;  // EFuncReturnRows
  ETimeLineMode timeLineResMode;
  bool          isEmptyResult;
  bool          isSubquery;
  bool          hasAggFuncs;
  bool          hasRepeatScanFuncs;
  bool          hasIndefiniteRowsFunc;
  bool          hasMultiRowsFunc;
  bool          hasSelectFunc;
  bool          hasSelectValFunc;
  bool          hasOtherVectorFunc;
  bool          hasUniqueFunc;
  bool          hasTailFunc;
  bool          hasInterpFunc;
  bool          hasInterpPseudoColFunc;
  bool          hasLastRowFunc;
  bool          hasLastFunc;
  bool          hasTimeLineFunc;
  bool          hasUdaf;
  bool          hasStateKey;
  bool          onlyHasKeepOrderFunc;
  bool          groupSort;
  bool          tagScan;
316 317
} SSelectStmt;

X
Xiaoyu Wang 已提交
318
typedef enum ESetOperatorType { SET_OP_TYPE_UNION_ALL = 1, SET_OP_TYPE_UNION } ESetOperatorType;
319 320

typedef struct SSetOperator {
X
Xiaoyu Wang 已提交
321
  ENodeType        type;  // QUERY_NODE_SET_OPERATOR
322
  ESetOperatorType opType;
X
Xiaoyu Wang 已提交
323 324 325 326 327
  SNodeList*       pProjectionList;
  SNode*           pLeft;
  SNode*           pRight;
  SNodeList*       pOrderByList;  // SOrderByExprNode
  SNode*           pLimit;
328
  char             stmtName[TSDB_TABLE_NAME_LEN];
X
Xiaoyu Wang 已提交
329
  uint8_t          precision;
330
  ETimeLineMode    timeLineResMode;  
331 332
} SSetOperator;

X
Xiaoyu Wang 已提交
333 334 335 336 337
typedef enum ESqlClause {
  SQL_CLAUSE_FROM = 1,
  SQL_CLAUSE_WHERE,
  SQL_CLAUSE_PARTITION_BY,
  SQL_CLAUSE_WINDOW,
338
  SQL_CLAUSE_FILL,
X
Xiaoyu Wang 已提交
339 340
  SQL_CLAUSE_GROUP_BY,
  SQL_CLAUSE_HAVING,
X
Xiaoyu Wang 已提交
341
  SQL_CLAUSE_DISTINCT,
X
Xiaoyu Wang 已提交
342 343 344 345
  SQL_CLAUSE_SELECT,
  SQL_CLAUSE_ORDER_BY
} ESqlClause;

X
Xiaoyu Wang 已提交
346
typedef struct SDeleteStmt {
X
Xiaoyu Wang 已提交
347 348 349 350
  ENodeType   type;        // QUERY_NODE_DELETE_STMT
  SNode*      pFromTable;  // FROM clause
  SNode*      pWhere;      // WHERE clause
  SNode*      pCountFunc;  // count the number of rows affected
351 352
  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 已提交
353
  SNode*      pTagCond;    // pWhere divided into pTagCond and timeRange
X
Xiaoyu Wang 已提交
354 355 356 357 358
  STimeWindow timeRange;
  uint8_t     precision;
  bool        deleteZeroRows;
} SDeleteStmt;

359 360 361 362 363 364 365 366
typedef struct SInsertStmt {
  ENodeType  type;  // QUERY_NODE_INSERT_STMT
  SNode*     pTable;
  SNodeList* pCols;
  SNode*     pQuery;
  uint8_t    precision;
} SInsertStmt;

X
Xiaoyu Wang 已提交
367 368 369 370
typedef struct SVgDataBlocks {
  SVgroupInfo vg;
  int32_t     numOfTables;  // number of tables in current submit block
  uint32_t    size;
D
dapan1121 已提交
371
  void*       pData;  // SSubmitReq + SSubmitBlk + ...
X
Xiaoyu Wang 已提交
372 373
} SVgDataBlocks;

X
Xiaoyu Wang 已提交
374 375
typedef void (*FFreeTableBlockHash)(SHashObj*);
typedef void (*FFreeVgourpBlockArray)(SArray*);
X
Xiaoyu Wang 已提交
376

X
Xiaoyu Wang 已提交
377
typedef struct SVnodeModifyOpStmt {
X
Xiaoyu Wang 已提交
378 379 380 381 382 383 384 385 386 387 388
  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;
X
Xiaoyu Wang 已提交
389 390
  SNode*                pTagCond;
  SArray*               pTableTag;
X
Xiaoyu Wang 已提交
391 392 393 394 395 396 397 398 399 400 401 402
  SHashObj*             pVgroupsHashObj;
  SHashObj*             pTableBlockHashObj;  // SHashObj<tuid, STableDataCxt*>
  SHashObj*             pSubTableHashObj;
  SHashObj*             pTableNameHashObj;
  SHashObj*             pDbFNameHashObj;
  SArray*               pVgDataBlocks;  // SArray<SVgroupDataCxt*>
  SVCreateTbReq*        pCreateTblReq;
  TdFilePtr             fp;
  FFreeTableBlockHash   freeHashFunc;
  FFreeVgourpBlockArray freeArrayFunc;
  bool                  usingTableProcessing;
  bool                  fileProcessing;
X
Xiaoyu Wang 已提交
403
} SVnodeModifyOpStmt;
X
Xiaoyu Wang 已提交
404

405 406
typedef struct SExplainOptions {
  ENodeType type;
X
Xiaoyu Wang 已提交
407 408
  bool      verbose;
  double    ratio;
409 410 411
} SExplainOptions;

typedef struct SExplainStmt {
X
Xiaoyu Wang 已提交
412 413
  ENodeType        type;
  bool             analyze;
414
  SExplainOptions* pOptions;
X
Xiaoyu Wang 已提交
415
  SNode*           pQuery;
416 417
} SExplainStmt;

X
Xiaoyu Wang 已提交
418 419 420 421 422 423 424 425 426 427 428 429 430 431
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 已提交
432 433 434 435 436 437 438
typedef enum EQueryExecStage {
  QUERY_EXEC_STAGE_PARSE = 1,
  QUERY_EXEC_STAGE_ANALYSE,
  QUERY_EXEC_STAGE_SCHEDULE,
  QUERY_EXEC_STAGE_END
} EQueryExecStage;

X
Xiaoyu Wang 已提交
439
typedef struct SQuery {
X
Xiaoyu Wang 已提交
440 441 442 443
  ENodeType       type;
  EQueryExecStage execStage;
  EQueryExecMode  execMode;
  bool            haveResultSet;
444
  SNode*          pPrevRoot;
X
Xiaoyu Wang 已提交
445
  SNode*          pRoot;
446
  SNode*          pPostRoot;
X
Xiaoyu Wang 已提交
447 448 449 450 451 452 453 454 455 456 457 458 459
  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 已提交
460 461
} SQuery;

X
Xiaoyu Wang 已提交
462 463 464
void nodesWalkSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeWalker walker, void* pContext);
void nodesRewriteSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeRewriter rewriter, void* pContext);

465 466 467
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);
468
int32_t nodesCollectColumnsFromNode(SNode* node, const char* pTableAlias, ECollectColType type, SNodeList** pCols);
X
Xiaoyu Wang 已提交
469 470

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

473 474
int32_t nodesCollectSpecialNodes(SSelectStmt* pSelect, ESqlClause clause, ENodeType type, SNodeList** pNodes);

475 476
bool nodesIsExprNode(const SNode* pNode);

X
Xiaoyu Wang 已提交
477
bool nodesIsUnaryOp(const SOperatorNode* pOp);
478 479 480
bool nodesIsArithmeticOp(const SOperatorNode* pOp);
bool nodesIsComparisonOp(const SOperatorNode* pOp);
bool nodesIsJsonOp(const SOperatorNode* pOp);
X
Xiaoyu Wang 已提交
481
bool nodesIsRegularOp(const SOperatorNode* pOp);
X
Xiaoyu Wang 已提交
482
bool nodesIsBitwiseOp(const SOperatorNode* pOp);
483

484 485 486
bool nodesExprHasColumn(SNode* pNode);
bool nodesExprsHasColumn(SNodeList* pList);

X
Xiaoyu Wang 已提交
487 488 489
void*   nodesGetValueFromNode(SValueNode* pNode);
int32_t nodesSetValueNodeValue(SValueNode* pNode, void* value);
char*   nodesGetStrValueFromNode(SValueNode* pNode);
X
Xiaoyu Wang 已提交
490 491 492 493
void    nodesValueNodeToVariant(const SValueNode* pNode, SVariant* pVal);

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

495 496 497
const char* operatorTypeStr(EOperatorType type);
const char* logicConditionTypeStr(ELogicConditionType type);

498 499 500 501
#ifdef __cplusplus
}
#endif

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