qSqlparser.h 12.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * 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/>.
 */

H
hjxilinx 已提交
16 17
#ifndef TDENGINE_QSQLPARSER_H
#define TDENGINE_QSQLPARSER_H
18 19 20 21 22 23 24 25

#ifdef __cplusplus
extern "C" {
#endif

#include "taos.h"
#include "taosmsg.h"
#include "tstoken.h"
H
Haojun Liao 已提交
26
#include "tstrbuild.h"
27 28
#include "tvariant.h"

H
Haojun Liao 已提交
29
#define ParseTOKENTYPE SStrToken
H
Haojun Liao 已提交
30 31 32 33 34 35 36 37 38 39 40 41

#define NON_ARITHMEIC_EXPR 0
#define NORMAL_ARITHMETIC  1
#define AGG_ARIGHTMEIC     2

enum SQL_NODE_TYPE {
  SQL_NODE_TABLE_COLUMN= 1,
  SQL_NODE_SQLFUNCTION = 2,
  SQL_NODE_VALUE       = 3,
  SQL_NODE_EXPR        = 4,
};

H
Haojun Liao 已提交
42 43 44 45 46
enum SQL_NODE_FROM_TYPE {
  SQL_NODE_FROM_SUBQUERY  = 1,
  SQL_NODE_FROM_NAMELIST  = 2,
};

D
fix bug  
dapan1121 已提交
47
enum SQL_EXPR_FLAG {
D
dapan1121 已提交
48 49 50
  EXPR_FLAG_TS_ERROR = 1,
  EXPR_FLAG_US_TIMESTAMP = 2,
  EXPR_FLAG_TIMESTAMP_VAR = 3,
D
fix bug  
dapan1121 已提交
51 52
};

53 54 55 56 57 58 59 60 61 62 63
extern char tTokenTypeSwitcher[13];

#define toTSDBType(x)                          \
  do {                                         \
    if ((x) >= tListLen(tTokenTypeSwitcher)) { \
      (x) = TSDB_DATA_TYPE_BINARY;             \
    } else {                                   \
      (x) = tTokenTypeSwitcher[(x)];           \
    }                                          \
  } while (0)

H
Haojun Liao 已提交
64 65
#define TPARSER_HAS_TOKEN(_t)      ((_t).n > 0)
#define TPARSER_SET_NONE_TOKEN(_t) ((_t).n = 0)
H
Haojun Liao 已提交
66

67
typedef struct SLimitVal {
H
Haojun Liao 已提交
68 69
  int64_t            limit;
  int64_t            offset;
70 71 72
} SLimitVal;

typedef struct SOrderVal {
H
Haojun Liao 已提交
73 74
  uint32_t           order;
  int32_t            orderColId;
75 76 77
} SOrderVal;

typedef struct tVariantListItem {
H
Haojun Liao 已提交
78 79
  tVariant           pVar;
  uint8_t            sortOrder;
80 81
} tVariantListItem;

82
typedef struct SIntervalVal {
H
Haojun Liao 已提交
83 84
  SStrToken          interval;
  SStrToken          offset;
85 86
} SIntervalVal;

87
typedef struct SSessionWindowVal {
H
Haojun Liao 已提交
88 89
  SStrToken          col;
  SStrToken          gap;
90 91
} SSessionWindowVal;

H
Haojun Liao 已提交
92 93
struct SFromInfo;

H
Haojun Liao 已提交
94 95
typedef struct SQuerySqlNode {
  struct SArray     *pSelectList;  // select clause
H
Haojun Liao 已提交
96
  struct SFromInfo  *from;         // from clause SArray<SQuerySqlNode>
H
Haojun Liao 已提交
97 98
  struct tSqlExpr   *pWhere;       // where clause [optional]
  SArray            *pGroupby;     // groupby clause, only for tags[optional], SArray<tVariantListItem>
H
Haojun Liao 已提交
99
  SArray            *pSortOrder;   // orderby [optional],  SArray<tVariantListItem>
H
Haojun Liao 已提交
100
  SArray            *fillType;     // fill type[optional], SArray<tVariantListItem>
H
Haojun Liao 已提交
101 102 103 104 105
  SIntervalVal       interval;     // (interval, interval_offset) [optional]
  SSessionWindowVal  sessionVal;   // session window [optional]
  SStrToken          sliding;      // sliding window [optional]
  SLimitVal          limit;        // limit offset [optional]
  SLimitVal          slimit;       // group limit offset [optional]
H
Haojun Liao 已提交
106
  SStrToken          sqlstr;       // sql string in select clause
D
dapan1121 已提交
107
  struct tSqlExpr   *pHaving;      // having clause [optional]
H
Haojun Liao 已提交
108
} SQuerySqlNode;
109

H
Haojun Liao 已提交
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
typedef struct STableNamePair {
  SStrToken name;
  SStrToken aliasName;
} STableNamePair;

typedef struct SSubclauseInfo {  // "UNION" multiple select sub-clause
  SQuerySqlNode    **pClause;
  int32_t            numOfClause;
} SSubclauseInfo;

typedef struct SFromInfo {
  int32_t            type;        // nested query|table name list
  union {
    SSubclauseInfo  *pNode;
    SArray          *tableList;   // SArray<STableNamePair>
  };
} SFromInfo;
127

128
typedef struct SCreatedTableInfo {
H
Haojun Liao 已提交
129 130 131 132 133 134 135
  SStrToken          name;        // table name token
  SStrToken          stableName;  // super table name token , for using clause
  SArray            *pTagNames;   // create by using super table, tag name
  SArray            *pTagVals;    // create by using super table, tag value
  char              *fullname;    // table full name
  STagData           tagdata;     // true tag data, super table full name is in STagData
  int8_t             igExist;     // ignore if exists
136 137
} SCreatedTableInfo;

H
Haojun Liao 已提交
138
typedef struct SCreateTableSql {
H
Haojun Liao 已提交
139 140 141
  SStrToken          name;  // table name, create table [name] xxx
  int8_t             type;  // create normal table/from super table/ stream
  bool               existCheck;
142

143
  struct {
H
Haojun Liao 已提交
144 145
    SArray          *pTagColumns; // SArray<TAOS_FIELD>
    SArray          *pColumns;    // SArray<TAOS_FIELD>
146
  } colInfo;
147

H
Haojun Liao 已提交
148 149
  SArray            *childTableInfo;        // SArray<SCreatedTableInfo>
  SQuerySqlNode     *pSelect;
H
Haojun Liao 已提交
150
} SCreateTableSql;
151

H
Haojun Liao 已提交
152
typedef struct SAlterTableInfo {
H
Haojun Liao 已提交
153 154 155 156 157 158
  SStrToken          name;
  int16_t            tableType;
  int16_t            type;
  STagData           tagData;
  SArray            *pAddColumns; // SArray<TAOS_FIELD>
  SArray            *varList;     // set t=val or: change src dst, SArray<tVariantListItem>
H
Haojun Liao 已提交
159
} SAlterTableInfo;
160

H
Haojun Liao 已提交
161
typedef struct SCreateDbInfo {
H
Haojun Liao 已提交
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
  SStrToken          dbname;
  int32_t            replica;
  int32_t            cacheBlockSize;
  int32_t            maxTablesPerVnode;
  int32_t            numOfBlocks;
  int32_t            daysPerFile;
  int32_t            minRowsPerBlock;
  int32_t            maxRowsPerBlock;
  int32_t            fsyncPeriod;
  int64_t            commitTime;
  int32_t            walLevel;
  int32_t            quorum;
  int32_t            compressionLevel;
  SStrToken          precision;
  bool               ignoreExists;
  int8_t             update;
  int8_t             cachelast;
  SArray            *keep;
  int8_t             dbType;
  int16_t            partitions;
H
Haojun Liao 已提交
182
} SCreateDbInfo;
183

H
Haojun Liao 已提交
184
typedef struct SCreateAcctInfo {
H
Haojun Liao 已提交
185 186 187 188 189 190 191 192 193
  int32_t            maxUsers;
  int32_t            maxDbs;
  int32_t            maxTimeSeries;
  int32_t            maxStreams;
  int32_t            maxPointsPerSecond;
  int64_t            maxStorage;
  int64_t            maxQueryTime;
  int32_t            maxConnections;
  SStrToken          stat;
H
Haojun Liao 已提交
194
} SCreateAcctInfo;
195 196

typedef struct SShowInfo {
H
Haojun Liao 已提交
197 198 199
  uint8_t            showType;
  SStrToken          prefix;
  SStrToken          pattern;
200 201 202
} SShowInfo;

typedef struct SUserInfo {
H
Haojun Liao 已提交
203 204 205 206
  SStrToken          user;
  SStrToken          passwd;
  SStrToken          privilege;
  int16_t            type;
207 208
} SUserInfo;

H
Haojun Liao 已提交
209
typedef struct SMiscInfo {
H
Haojun Liao 已提交
210 211 212 213 214
  SArray            *a;         // SArray<SStrToken>
  bool               existsCheck;
  int16_t            dbType;
  int16_t            tableType;
  SUserInfo          user;
215
  union {
H
Haojun Liao 已提交
216 217 218 219
    SCreateDbInfo    dbOpt;
    SCreateAcctInfo  acctOpt;
    SShowInfo        showOpt;
    SStrToken        id;
220
  };
H
Haojun Liao 已提交
221
} SMiscInfo;
222 223

typedef struct SSqlInfo {
H
Haojun Liao 已提交
224 225
  int32_t            type;
  bool               valid;
H
Haojun Liao 已提交
226 227
  SSubclauseInfo     subclauseInfo;
  char               msg[256];
228
  union {
H
Haojun Liao 已提交
229 230 231
    SCreateTableSql *pCreateTableInfo;
    SAlterTableInfo *pAlterInfo;
    SMiscInfo       *pMiscInfo;
232 233 234
  };
} SSqlInfo;

H
Haojun Liao 已提交
235
typedef struct tSqlExpr {
H
Haojun Liao 已提交
236 237
  uint16_t           type;       // sql node type
  uint32_t           tokenId;    // TK_LE: less than(binary expr)
238

H
Haojun Liao 已提交
239
  // the whole string of the function(col, param), while the function name is kept in token
H
Haojun Liao 已提交
240 241
  SStrToken          operand;
  uint32_t           functionId;  // function id
242

H
Haojun Liao 已提交
243 244 245
  SStrToken          colInfo;     // table column info
  tVariant           value;       // the use input value
  SStrToken          token;       // original sql expr string
D
fix bug  
dapan1121 已提交
246 247
  uint32_t           flags;
  
H
Haojun Liao 已提交
248 249 250
  struct tSqlExpr   *pLeft;       // left child
  struct tSqlExpr   *pRight;      // right child
  struct SArray     *pParam;      // function parameters list
H
Haojun Liao 已提交
251
} tSqlExpr;
252

H
Haojun Liao 已提交
253
// used in select clause. select <SArray> from xxx
H
Haojun Liao 已提交
254
typedef struct tSqlExprItem {
H
Haojun Liao 已提交
255 256 257
  tSqlExpr          *pNode;      // The list of expressions
  char              *aliasName;  // alias name, null-terminated string
  bool               distinct;
H
Haojun Liao 已提交
258
} tSqlExprItem;
259

H
Haojun Liao 已提交
260 261 262
SArray *tVariantListAppend(SArray *pList, tVariant *pVar, uint8_t sortOrder);
SArray *tVariantListInsert(SArray *pList, tVariant *pVar, uint8_t sortOrder, int32_t index);
SArray *tVariantListAppendToken(SArray *pList, SStrToken *pAliasToken, uint8_t sortOrder);
263

D
dapan1121 已提交
264
tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType);
265

D
dapan1121 已提交
266
int32_t tSqlExprCompare(tSqlExpr *left, tSqlExpr *right);
D
dapan1121 已提交
267

D
dapan1121 已提交
268
tSqlExpr *tSqlExprClone(tSqlExpr *pSrc);
H
Haojun Liao 已提交
269 270 271 272
SFromInfo *setTableNameList(SFromInfo* pFromInfo, SStrToken *pName, SStrToken* pAlias);
SFromInfo *setSubquery(SFromInfo* pFromInfo, SQuerySqlNode *pSqlNode);
void      *destroyFromInfo(SFromInfo* pFromInfo);

H
Haojun Liao 已提交
273 274 275
// sql expr leaf node
tSqlExpr *tSqlExprCreateIdValue(SStrToken *pToken, int32_t optrType);
tSqlExpr *tSqlExprCreateFunction(SArray *pParam, SStrToken *pFuncToken, SStrToken *endToken, int32_t optType);
276

H
Haojun Liao 已提交
277 278
tSqlExpr *tSqlExprCreate(tSqlExpr *pLeft, tSqlExpr *pRight, int32_t optrType);
tSqlExpr *tSqlExprClone(tSqlExpr *pSrc);
H
Haojun Liao 已提交
279 280 281
void      tSqlExprCompact(tSqlExpr** pExpr);
bool      tSqlExprIsLeaf(tSqlExpr* pExpr);
bool      tSqlExprIsParentOfLeaf(tSqlExpr* pExpr);
H
Haojun Liao 已提交
282 283 284
void      tSqlExprDestroy(tSqlExpr *pExpr);
SArray   *tSqlExprListAppend(SArray *pList, tSqlExpr *pNode, SStrToken *pDistinct, SStrToken *pToken);
void      tSqlExprListDestroy(SArray *pList);
D
dapan1121 已提交
285

H
Haojun Liao 已提交
286
SQuerySqlNode *tSetQuerySqlNode(SStrToken *pSelectToken, SArray *pSelectList, SFromInfo *pFrom, tSqlExpr *pWhere,
H
Haojun Liao 已提交
287
                                SArray *pGroupby, SArray *pSortOrder, SIntervalVal *pInterval, SSessionWindowVal *ps,
D
dapan1121 已提交
288
                                SStrToken *pSliding, SArray *pFill, SLimitVal *pLimit, SLimitVal *pgLimit, tSqlExpr *pHaving);
289

H
Haojun Liao 已提交
290
SCreateTableSql *tSetCreateTableInfo(SArray *pCols, SArray *pTags, SQuerySqlNode *pSelect, int32_t type);
291

H
Haojun Liao 已提交
292
SAlterTableInfo *tSetAlterTableInfo(SStrToken *pTableName, SArray *pCols, SArray *pVals, int32_t type, int16_t tableTable);
293
SCreatedTableInfo createNewChildTableInfo(SStrToken *pTableName, SArray *pTagNames, SArray *pTagVals, SStrToken *pToken, SStrToken* igExists);
294 295

void destroyAllSelectClause(SSubclauseInfo *pSql);
H
Haojun Liao 已提交
296
void destroyQuerySqlNode(SQuerySqlNode *pSql);
297
void freeCreateTableInfo(void* p);
298

H
Haojun Liao 已提交
299
SSqlInfo       *setSqlInfo(SSqlInfo *pInfo, void *pSqlExprInfo, SStrToken *pTableName, int32_t type);
300 301 302 303
SSubclauseInfo *setSubclause(SSubclauseInfo *pClause, void *pSqlExprInfo);

SSubclauseInfo *appendSelectClause(SSubclauseInfo *pInfo, void *pSubclause);

304
void setCreatedTableName(SSqlInfo *pInfo, SStrToken *pTableNameToken, SStrToken *pIfNotExists);
305

H
Haojun Liao 已提交
306
void SqlInfoDestroy(SSqlInfo *pInfo);
307

H
Haojun Liao 已提交
308
void setDCLSqlElems(SSqlInfo *pInfo, int32_t type, int32_t nParams, ...);
D
dapan1121 已提交
309
void setDropDbTableInfo(SSqlInfo *pInfo, int32_t type, SStrToken* pToken, SStrToken* existsCheck,int16_t dbType,int16_t tableType);
H
Haojun Liao 已提交
310
void setShowOptions(SSqlInfo *pInfo, int32_t type, SStrToken* prefix, SStrToken* pPatterns);
311

H
Haojun Liao 已提交
312
void setCreateDbInfo(SSqlInfo *pInfo, int32_t type, SStrToken *pToken, SCreateDbInfo *pDB, SStrToken *pIgExists);
313

H
Haojun Liao 已提交
314
void setCreateAcctSql(SSqlInfo *pInfo, int32_t type, SStrToken *pName, SStrToken *pPwd, SCreateAcctInfo *pAcctInfo);
H
Haojun Liao 已提交
315 316 317
void setCreateUserSql(SSqlInfo *pInfo, SStrToken *pName, SStrToken *pPasswd);
void setKillSql(SSqlInfo *pInfo, int32_t type, SStrToken *ip);
void setAlterUserSql(SSqlInfo *pInfo, int16_t type, SStrToken *pName, SStrToken* pPwd, SStrToken *pPrivilege);
318

H
Haojun Liao 已提交
319
void setDefaultCreateDbOption(SCreateDbInfo *pDBInfo);
D
dapan1121 已提交
320
void setDefaultCreateTopicOption(SCreateDbInfo *pDBInfo);
321 322

// prefix show db.tables;
H
Haojun Liao 已提交
323
void tSetDbName(SStrToken *pCpxName, SStrToken *pDb);
324

H
Haojun Liao 已提交
325 326
void tSetColumnInfo(TAOS_FIELD *pField, SStrToken *pName, TAOS_FIELD *pType);
void tSetColumnType(TAOS_FIELD *pField, SStrToken *type);
327

H
Haojun Liao 已提交
328 329 330 331 332 333 334
/**
 *
 * @param yyp      The parser
 * @param yymajor  The major token code number
 * @param yyminor  The value for the token
 */
void Parse(void *yyp, int yymajor, ParseTOKENTYPE yyminor, SSqlInfo *);
335

H
Haojun Liao 已提交
336 337 338 339 340 341
/**
 *
 * @param p         The parser to be deleted
 * @param freeProc  Function used to reclaim memory
 */
void ParseFree(void *p, void (*freeProc)(void *));
342

H
Haojun Liao 已提交
343 344 345 346 347
/**
 *
 * @param mallocProc  The parser allocator
 * @return
 */
348 349
void *ParseAlloc(void *(*mallocProc)(size_t));

H
Haojun Liao 已提交
350 351 352 353 354 355
/**
 *
 * @param str sql string
 * @return sql ast
 */
SSqlInfo qSqlParse(const char *str);
356

357 358 359 360
#ifdef __cplusplus
}
#endif

H
hjxilinx 已提交
361
#endif  // TDENGINE_QSQLPARSER_H