sql.y 29.2 KB
Newer Older
H
hzcheng 已提交
1 2 3 4
//lemon parser file to generate sql parse by using finite-state-machine code used to parse sql
//usage: lemon sql.y
%token_prefix TK_

H
Haojun Liao 已提交
5 6
%token_type {SStrToken}
%default_type {SStrToken}
H
hzcheng 已提交
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
%extra_argument {SSqlInfo* pInfo}

%fallback ID BOOL TINYINT SMALLINT INTEGER BIGINT FLOAT DOUBLE STRING TIMESTAMP BINARY NCHAR.

%left OR.
%left AND.
%right NOT.
%left EQ NE ISNULL NOTNULL IS LIKE GLOB BETWEEN IN.
%left GT GE LT LE.
%left BITAND BITOR LSHIFT RSHIFT.
%left PLUS MINUS.
%left DIVIDE TIMES.
%left STAR SLASH REM.
%left CONCAT.
%right UMINUS UPLUS BITNOT.

%include {
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdbool.h>
H
Haojun Liao 已提交
29 30 31 32
#include "qSqlparser.h"
#include "tcmdtype.h"
#include "tstoken.h"
#include "ttokendef.h"
H
hzcheng 已提交
33
#include "tutil.h"
H
Haojun Liao 已提交
34
#include "tvariant.h"
H
hzcheng 已提交
35 36 37
}

%syntax_error {
38
  pInfo->valid = false;
H
hzcheng 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
  int32_t outputBufLen = tListLen(pInfo->pzErrMsg);
  int32_t len = 0;

  if(TOKEN.z) {
    char msg[] = "syntax error near \"%s\"";
    int32_t sqlLen = strlen(&TOKEN.z[0]);

    if (sqlLen + sizeof(msg)/sizeof(msg[0]) + 1 > outputBufLen) {
        char tmpstr[128] = {0};
        memcpy(tmpstr, &TOKEN.z[0], sizeof(tmpstr)/sizeof(tmpstr[0]) - 1);
        len = sprintf(pInfo->pzErrMsg, msg, tmpstr);
    } else {
        len = sprintf(pInfo->pzErrMsg, msg, &TOKEN.z[0]);
    }

  } else {
    len = sprintf(pInfo->pzErrMsg, "Incomplete SQL statement");
  }

  assert(len <= outputBufLen);
}

%parse_accept       {}

program ::= cmd.    {}

//////////////////////////////////THE SHOW STATEMENT///////////////////////////////////////////
66 67 68 69 70 71 72 73 74 75
cmd ::= SHOW DATABASES.  { setShowOptions(pInfo, TSDB_MGMT_TABLE_DB, 0, 0);}
cmd ::= SHOW MNODES.     { setShowOptions(pInfo, TSDB_MGMT_TABLE_MNODE, 0, 0);}
cmd ::= SHOW DNODES.     { setShowOptions(pInfo, TSDB_MGMT_TABLE_DNODE, 0, 0);}
cmd ::= SHOW ACCOUNTS.   { setShowOptions(pInfo, TSDB_MGMT_TABLE_ACCT, 0, 0);}
cmd ::= SHOW USERS.      { setShowOptions(pInfo, TSDB_MGMT_TABLE_USER, 0, 0);}

cmd ::= SHOW MODULES.    { setShowOptions(pInfo, TSDB_MGMT_TABLE_MODULE, 0, 0);  }
cmd ::= SHOW QUERIES.    { setShowOptions(pInfo, TSDB_MGMT_TABLE_QUERIES, 0, 0);  }
cmd ::= SHOW CONNECTIONS.{ setShowOptions(pInfo, TSDB_MGMT_TABLE_CONNS, 0, 0);}
cmd ::= SHOW STREAMS.    { setShowOptions(pInfo, TSDB_MGMT_TABLE_STREAMS, 0, 0);  }
H
Haojun Liao 已提交
76
cmd ::= SHOW VARIABLES.  { setShowOptions(pInfo, TSDB_MGMT_TABLE_VARIABLES, 0, 0);  }
77 78 79 80 81
cmd ::= SHOW SCORES.     { setShowOptions(pInfo, TSDB_MGMT_TABLE_SCORES, 0, 0);   }
cmd ::= SHOW GRANTS.     { setShowOptions(pInfo, TSDB_MGMT_TABLE_GRANTS, 0, 0);   }

cmd ::= SHOW VNODES.                { setShowOptions(pInfo, TSDB_MGMT_TABLE_VNODES, 0, 0); }
cmd ::= SHOW VNODES IPTOKEN(X).     { setShowOptions(pInfo, TSDB_MGMT_TABLE_VNODES, &X, 0); }
L
lihui 已提交
82

83

H
Haojun Liao 已提交
84
%type dbPrefix {SStrToken}
85
dbPrefix(A) ::=.                   {A.n = 0; A.type = 0;}
H
hzcheng 已提交
86 87
dbPrefix(A) ::= ids(X) DOT.        {A = X;  }

H
Haojun Liao 已提交
88
%type cpxName {SStrToken}
H
hzcheng 已提交
89 90 91
cpxName(A) ::= .             {A.n = 0;  }
cpxName(A) ::= DOT ids(Y).   {A = Y; A.n += 1;    }

92 93 94 95 96 97 98 99 100
cmd ::= SHOW CREATE TABLE ids(X) cpxName(Y).    {
   X.n += Y.n;
   setDCLSQLElems(pInfo, TSDB_SQL_SHOW_CREATE_TABLE, 1, &X);
}    

cmd ::= SHOW CREATE DATABASE ids(X). {
  setDCLSQLElems(pInfo, TSDB_SQL_SHOW_CREATE_DATABASE, 1, &X);
} 

H
hzcheng 已提交
101
cmd ::= SHOW dbPrefix(X) TABLES.         {
102
    setShowOptions(pInfo, TSDB_MGMT_TABLE_TABLE, &X, 0);
H
hzcheng 已提交
103 104 105
}

cmd ::= SHOW dbPrefix(X) TABLES LIKE ids(Y).         {
106
    setShowOptions(pInfo, TSDB_MGMT_TABLE_TABLE, &X, &Y);
H
hzcheng 已提交
107 108 109
}

cmd ::= SHOW dbPrefix(X) STABLES.      {
110
    setShowOptions(pInfo, TSDB_MGMT_TABLE_METRIC, &X, 0);
H
hzcheng 已提交
111 112 113
}

cmd ::= SHOW dbPrefix(X) STABLES LIKE ids(Y).      {
H
Haojun Liao 已提交
114
    SStrToken token;
H
hzcheng 已提交
115
    setDBName(&token, &X);
116
    setShowOptions(pInfo, TSDB_MGMT_TABLE_METRIC, &token, &Y);
H
hzcheng 已提交
117 118 119
}

cmd ::= SHOW dbPrefix(X) VGROUPS.    {
H
Haojun Liao 已提交
120
    SStrToken token;
H
hzcheng 已提交
121
    setDBName(&token, &X);
122
    setShowOptions(pInfo, TSDB_MGMT_TABLE_VGROUP, &token, 0);
H
hzcheng 已提交
123 124
}

L
[1361]  
lihui 已提交
125
cmd ::= SHOW dbPrefix(X) VGROUPS ids(Y).    {
H
Haojun Liao 已提交
126
    SStrToken token;
L
[1361]  
lihui 已提交
127
    setDBName(&token, &X);    
H
hjxilinx 已提交
128
    setShowOptions(pInfo, TSDB_MGMT_TABLE_VGROUP, &token, &Y);
L
[1361]  
lihui 已提交
129 130
}

H
hzcheng 已提交
131 132 133
//drop configure for tables
cmd ::= DROP TABLE ifexists(Y) ids(X) cpxName(Z).   {
    X.n += Z.n;
134
    setDropDBTableInfo(pInfo, TSDB_SQL_DROP_TABLE, &X, &Y);
H
hzcheng 已提交
135 136
}

137
cmd ::= DROP DATABASE ifexists(Y) ids(X).    { setDropDBTableInfo(pInfo, TSDB_SQL_DROP_DB, &X, &Y); }
H
hjxilinx 已提交
138
cmd ::= DROP DNODE ids(X).       { setDCLSQLElems(pInfo, TSDB_SQL_DROP_DNODE, 1, &X);    }
139 140
cmd ::= DROP USER ids(X).        { setDCLSQLElems(pInfo, TSDB_SQL_DROP_USER, 1, &X);     }
cmd ::= DROP ACCOUNT ids(X).     { setDCLSQLElems(pInfo, TSDB_SQL_DROP_ACCT, 1, &X);  }
H
hzcheng 已提交
141 142

/////////////////////////////////THE USE STATEMENT//////////////////////////////////////////
143
cmd ::= USE ids(X).              { setDCLSQLElems(pInfo, TSDB_SQL_USE_DB, 1, &X);}
H
hzcheng 已提交
144 145 146 147

/////////////////////////////////THE DESCRIBE STATEMENT/////////////////////////////////////
cmd ::= DESCRIBE ids(X) cpxName(Y). {
    X.n += Y.n;
148
    setDCLSQLElems(pInfo, TSDB_SQL_DESCRIBE_TABLE, 1, &X);
H
hzcheng 已提交
149 150 151
}

/////////////////////////////////THE ALTER STATEMENT////////////////////////////////////////
152 153
cmd ::= ALTER USER ids(X) PASS ids(Y).          { setAlterUserSQL(pInfo, TSDB_ALTER_USER_PASSWD, &X, &Y, NULL);    }
cmd ::= ALTER USER ids(X) PRIVILEGE ids(Y).     { setAlterUserSQL(pInfo, TSDB_ALTER_USER_PRIVILEGES, &X, NULL, &Y);}
H
hjxilinx 已提交
154 155
cmd ::= ALTER DNODE ids(X) ids(Y).              { setDCLSQLElems(pInfo, TSDB_SQL_CFG_DNODE, 2, &X, &Y);          }
cmd ::= ALTER DNODE ids(X) ids(Y) ids(Z).       { setDCLSQLElems(pInfo, TSDB_SQL_CFG_DNODE, 3, &X, &Y, &Z);      }
156 157
cmd ::= ALTER LOCAL ids(X).                     { setDCLSQLElems(pInfo, TSDB_SQL_CFG_LOCAL, 1, &X);              }
cmd ::= ALTER LOCAL ids(X) ids(Y).              { setDCLSQLElems(pInfo, TSDB_SQL_CFG_LOCAL, 2, &X, &Y);          }
H
Haojun Liao 已提交
158
cmd ::= ALTER DATABASE ids(X) alter_db_optr(Y). { SStrToken t = {0};  setCreateDBSQL(pInfo, TSDB_SQL_ALTER_DB, &X, &Y, &t);}
H
hzcheng 已提交
159

160 161
cmd ::= ALTER ACCOUNT ids(X) acct_optr(Z).      { setCreateAcctSQL(pInfo, TSDB_SQL_ALTER_ACCT, &X, NULL, &Z);}
cmd ::= ALTER ACCOUNT ids(X) PASS ids(Y) acct_optr(Z).      { setCreateAcctSQL(pInfo, TSDB_SQL_ALTER_ACCT, &X, &Y, &Z);}
S
slguan 已提交
162

H
hzcheng 已提交
163 164 165
// An IDENTIFIER can be a generic identifier, or one of several keywords.
// Any non-standard keyword can also be an identifier.
// And "ids" is an identifer-or-string.
H
Haojun Liao 已提交
166
%type ids {SStrToken}
H
hzcheng 已提交
167 168 169
ids(A) ::= ID(X).        {A = X; }
ids(A) ::= STRING(X).    {A = X; }

H
Haojun Liao 已提交
170
%type ifexists {SStrToken}
171 172
ifexists(X) ::= IF EXISTS.          { X.n = 1;}
ifexists(X) ::= .                   { X.n = 0;}
H
hzcheng 已提交
173

H
Haojun Liao 已提交
174
%type ifnotexists {SStrToken}
175 176
ifnotexists(X) ::= IF NOT EXISTS.   { X.n = 1;}
ifnotexists(X) ::= .                { X.n = 0;}
H
hzcheng 已提交
177 178

/////////////////////////////////THE CREATE STATEMENT///////////////////////////////////////
S
slguan 已提交
179
//create option for dnode/db/user/account
180
cmd ::= CREATE DNODE   ids(X).     { setDCLSQLElems(pInfo, TSDB_SQL_CREATE_DNODE, 1, &X);}
S
slguan 已提交
181
cmd ::= CREATE ACCOUNT ids(X) PASS ids(Y) acct_optr(Z).
182 183 184
                                { setCreateAcctSQL(pInfo, TSDB_SQL_CREATE_ACCT, &X, &Y, &Z);}
cmd ::= CREATE DATABASE ifnotexists(Z) ids(X) db_optr(Y).  { setCreateDBSQL(pInfo, TSDB_SQL_CREATE_DB, &X, &Y, &Z);}
cmd ::= CREATE USER ids(X) PASS ids(Y).     { setCreateUserSQL(pInfo, &X, &Y);}
H
hzcheng 已提交
185

186 187
pps(Y) ::= .                                { Y.n = 0;   }
pps(Y) ::= PPS INTEGER(X).                  { Y = X;     }
S
slguan 已提交
188

189 190
tseries(Y) ::= .                            { Y.n = 0;   }
tseries(Y) ::= TSERIES INTEGER(X).          { Y = X;     }
S
slguan 已提交
191

192 193
dbs(Y) ::= .                                { Y.n = 0;   }
dbs(Y) ::= DBS INTEGER(X).                  { Y = X;     }
S
slguan 已提交
194

195 196
streams(Y) ::= .                            { Y.n = 0;   }
streams(Y) ::= STREAMS INTEGER(X).          { Y = X;     }
S
slguan 已提交
197

198 199
storage(Y) ::= .                            { Y.n = 0;   }
storage(Y) ::= STORAGE INTEGER(X).          { Y = X;     }
S
slguan 已提交
200

201 202
qtime(Y) ::= .                              { Y.n = 0;   }
qtime(Y) ::= QTIME INTEGER(X).              { Y = X;     }
S
slguan 已提交
203

204 205
users(Y) ::= .                              { Y.n = 0;   }
users(Y) ::= USERS INTEGER(X).              { Y = X;     }
S
slguan 已提交
206

207 208
conns(Y) ::= .                              { Y.n = 0;   }
conns(Y) ::= CONNS INTEGER(X).              { Y = X;     }
S
slguan 已提交
209

210 211
state(Y) ::= .                              { Y.n = 0;   }
state(Y) ::= STATE ids(X).                  { Y = X;     }
S
slguan 已提交
212 213 214

%type acct_optr {SCreateAcctSQL}
acct_optr(Y) ::= pps(C) tseries(D) storage(P) streams(F) qtime(Q) dbs(E) users(K) conns(L) state(M). {
215 216 217 218 219 220 221 222
    Y.maxUsers   = (K.n>0)?atoi(K.z):-1;
    Y.maxDbs     = (E.n>0)?atoi(E.z):-1;
    Y.maxTimeSeries = (D.n>0)?atoi(D.z):-1;
    Y.maxStreams = (F.n>0)?atoi(F.z):-1;
    Y.maxPointsPerSecond     = (C.n>0)?atoi(C.z):-1;
    Y.maxStorage = (P.n>0)?strtoll(P.z, NULL, 10):-1;
    Y.maxQueryTime   = (Q.n>0)?strtoll(Q.z, NULL, 10):-1;
    Y.maxConnections   = (L.n>0)?atoi(L.z):-1;
S
slguan 已提交
223 224 225
    Y.stat    = M;
}

H
Haojun Liao 已提交
226 227
%type keep {SArray*}
%destructor keep {taosArrayDestroy($$);}
228 229 230 231
keep(Y)    ::= KEEP tagitemlist(X).           { Y = X; }

cache(Y)   ::= CACHE INTEGER(X).              { Y = X; }
replica(Y) ::= REPLICA INTEGER(X).            { Y = X; }
232
quorum(Y)  ::= QUORUM INTEGER(X).             { Y = X; }
233
days(Y)    ::= DAYS INTEGER(X).               { Y = X; }
H
hjxilinx 已提交
234 235 236
minrows(Y) ::= MINROWS INTEGER(X).            { Y = X; }
maxrows(Y) ::= MAXROWS INTEGER(X).            { Y = X; }
blocks(Y)  ::= BLOCKS INTEGER(X).             { Y = X; }
237
ctime(Y)   ::= CTIME INTEGER(X).              { Y = X; }
H
hjxilinx 已提交
238
wal(Y)     ::= WAL INTEGER(X).                { Y = X; }
陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
239
fsync(Y)   ::= FSYNC INTEGER(X).              { Y = X; }
240 241
comp(Y)    ::= COMP INTEGER(X).               { Y = X; }
prec(Y)    ::= PRECISION STRING(X).           { Y = X; }
Y
yihaoDeng 已提交
242
update(Y)  ::= UPDATE INTEGER(X).             { Y = X; }     
243 244

%type db_optr {SCreateDBInfo}
H
hjxilinx 已提交
245 246
db_optr(Y) ::= . {setDefaultCreateDbOption(&Y);}

247 248
db_optr(Y) ::= db_optr(Z) cache(X).          { Y = Z; Y.cacheBlockSize = strtol(X.z, NULL, 10); }
db_optr(Y) ::= db_optr(Z) replica(X).        { Y = Z; Y.replica = strtol(X.z, NULL, 10); }
249
db_optr(Y) ::= db_optr(Z) quorum(X).         { Y = Z; Y.quorum = strtol(X.z, NULL, 10); }
250
db_optr(Y) ::= db_optr(Z) days(X).           { Y = Z; Y.daysPerFile = strtol(X.z, NULL, 10); }
H
hjxilinx 已提交
251 252 253
db_optr(Y) ::= db_optr(Z) minrows(X).        { Y = Z; Y.minRowsPerBlock = strtod(X.z, NULL); }
db_optr(Y) ::= db_optr(Z) maxrows(X).        { Y = Z; Y.maxRowsPerBlock = strtod(X.z, NULL); }
db_optr(Y) ::= db_optr(Z) blocks(X).         { Y = Z; Y.numOfBlocks = strtol(X.z, NULL, 10); }
254
db_optr(Y) ::= db_optr(Z) ctime(X).          { Y = Z; Y.commitTime = strtol(X.z, NULL, 10); }
H
hjxilinx 已提交
255
db_optr(Y) ::= db_optr(Z) wal(X).            { Y = Z; Y.walLevel = strtol(X.z, NULL, 10); }
陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
256
db_optr(Y) ::= db_optr(Z) fsync(X).          { Y = Z; Y.fsyncPeriod = strtol(X.z, NULL, 10); }
257 258 259
db_optr(Y) ::= db_optr(Z) comp(X).           { Y = Z; Y.compressionLevel = strtol(X.z, NULL, 10); }
db_optr(Y) ::= db_optr(Z) prec(X).           { Y = Z; Y.precision = X; }
db_optr(Y) ::= db_optr(Z) keep(X).           { Y = Z; Y.keep = X; }
Y
yihaoDeng 已提交
260
db_optr(Y) ::= db_optr(Z) update(X).         { Y = Z; Y.update = strtol(X.z, NULL, 10); }
261 262

%type alter_db_optr {SCreateDBInfo}
H
hjxilinx 已提交
263
alter_db_optr(Y) ::= . { setDefaultCreateDbOption(&Y);}
S
slguan 已提交
264 265

alter_db_optr(Y) ::= alter_db_optr(Z) replica(X).     { Y = Z; Y.replica = strtol(X.z, NULL, 10); }
266
alter_db_optr(Y) ::= alter_db_optr(Z) quorum(X).      { Y = Z; Y.quorum = strtol(X.z, NULL, 10); }
H
hjxilinx 已提交
267 268 269 270
alter_db_optr(Y) ::= alter_db_optr(Z) keep(X).        { Y = Z; Y.keep = X; }
alter_db_optr(Y) ::= alter_db_optr(Z) blocks(X).      { Y = Z; Y.numOfBlocks = strtol(X.z, NULL, 10); }
alter_db_optr(Y) ::= alter_db_optr(Z) comp(X).        { Y = Z; Y.compressionLevel = strtol(X.z, NULL, 10); }
alter_db_optr(Y) ::= alter_db_optr(Z) wal(X).         { Y = Z; Y.walLevel = strtol(X.z, NULL, 10); }
H
Haojun Liao 已提交
271
alter_db_optr(Y) ::= alter_db_optr(Z) fsync(X).       { Y = Z; Y.fsyncPeriod = strtol(X.z, NULL, 10); }
272
alter_db_optr(Y) ::= alter_db_optr(Z) update(X).      { Y = Z; Y.update = strtol(X.z, NULL, 10); }
H
hzcheng 已提交
273 274

%type typename {TAOS_FIELD}
dengyihao's avatar
dengyihao 已提交
275 276 277 278
typename(A) ::= ids(X). { 
  X.type = 0;
  tSQLSetColumnType (&A, &X); 
}
H
hzcheng 已提交
279 280 281

//define binary type, e.g., binary(10), nchar(10)
typename(A) ::= ids(X) LP signed(Y) RP.    {
282 283 284 285 286 287 288
  if (Y <= 0) {
    X.type = 0;
    tSQLSetColumnType(&A, &X);
  } else {
    X.type = -Y;  // negative value of name length
    tSQLSetColumnType(&A, &X);
  }
H
hzcheng 已提交
289 290
}

291 292
%type signed {int64_t}
signed(A) ::= INTEGER(X).         { A = strtol(X.z, NULL, 10); }
H
hzcheng 已提交
293 294 295 296
signed(A) ::= PLUS INTEGER(X).    { A = strtol(X.z, NULL, 10); }
signed(A) ::= MINUS INTEGER(X).   { A = -strtol(X.z, NULL, 10);}

////////////////////////////////// The CREATE TABLE statement ///////////////////////////////
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
cmd ::= CREATE TABLE create_table_args. {}
cmd ::= CREATE TABLE create_table_list(Z). { pInfo->type = TSDB_SQL_CREATE_TABLE; pInfo->pCreateTableInfo = Z;}

%type create_table_list{SCreateTableSQL*}
%destructor create_table_list{destroyCreateTableSQL($$);}
create_table_list(A) ::= create_from_stable(Z). {
  SCreateTableSQL* pCreateTable = calloc(1, sizeof(SCreateTableSQL));
  pCreateTable->childTableInfo = taosArrayInit(4, sizeof(SCreatedTableInfo));

  taosArrayPush(pCreateTable->childTableInfo, &Z);
  pCreateTable->type = TSQL_CREATE_TABLE_FROM_STABLE;
  A = pCreateTable;
}

create_table_list(A) ::= create_table_list(X) create_from_stable(Z). {
  taosArrayPush(X->childTableInfo, &Z);
  A = X;
H
hzcheng 已提交
314 315 316
}

%type create_table_args{SCreateTableSQL*}
317 318 319 320 321 322
create_table_args(A) ::= ifnotexists(U) ids(V) cpxName(Z) LP columnlist(X) RP. {
  A = tSetCreateSQLElems(X, NULL, NULL, TSQL_CREATE_TABLE);
  setSQLInfo(pInfo, A, NULL, TSDB_SQL_CREATE_TABLE);

  V.n += Z.n;
  setCreatedTableName(pInfo, &V, &U);
H
hzcheng 已提交
323 324
}

325
// create super table
326 327 328 329 330 331
create_table_args(A) ::= ifnotexists(U) ids(V) cpxName(Z) LP columnlist(X) RP TAGS LP columnlist(Y) RP. {
  A = tSetCreateSQLElems(X, Y, NULL, TSQL_CREATE_STABLE);
  setSQLInfo(pInfo, A, NULL, TSDB_SQL_CREATE_TABLE);

  V.n += Z.n;
  setCreatedTableName(pInfo, &V, &U);
H
hzcheng 已提交
332 333
}

334 335
// create table by using super table
// create table table_name using super_table_name tags(tag_values1, tag_values2)
336 337 338 339 340
%type create_from_stable{SCreatedTableInfo}
create_from_stable(A) ::= ifnotexists(U) ids(V) cpxName(Z) USING ids(X) cpxName(F) TAGS LP tagitemlist(Y) RP.  {
  X.n += F.n;
  V.n += Z.n;
  A = createNewChildTableInfo(&X, Y, &V, &U);
H
hzcheng 已提交
341 342 343
}

// create stream
344
// create table table_name as select count(*) from super_table_name interval(time)
345 346 347 348 349 350
create_table_args(A) ::= ifnotexists(U) ids(V) cpxName(Z) AS select(S). {
  A = tSetCreateSQLElems(NULL, NULL, S, TSQL_CREATE_STREAM);
  setSQLInfo(pInfo, A, NULL, TSDB_SQL_CREATE_TABLE);

  U.n += Z.n;
  setCreatedTableName(pInfo, &U, &V);
H
hzcheng 已提交
351 352 353
}

%type column{TAOS_FIELD}
H
Haojun Liao 已提交
354 355
%type columnlist{SArray*}
%destructor columnlist {taosArrayDestroy($$);}
H
Haojun Liao 已提交
356
columnlist(A) ::= columnlist(X) COMMA column(Y).  {taosArrayPush(X, &Y); A = X;  }
H
Haojun Liao 已提交
357
columnlist(A) ::= column(X).                      {A = taosArrayInit(4, sizeof(TAOS_FIELD)); taosArrayPush(A, &X);}
H
hzcheng 已提交
358 359 360 361

// The information used for a column is the name and type of column:
// tinyint smallint int bigint float double bool timestamp binary(x) nchar(x)
column(A) ::= ids(X) typename(Y).          {
362
  tSQLSetColumnInfo(&A, &X, &Y);
H
hzcheng 已提交
363 364
}

H
Haojun Liao 已提交
365 366
%type tagitemlist {SArray*}
%destructor tagitemlist {taosArrayDestroy($$);}
H
hzcheng 已提交
367 368 369 370 371

%type tagitem {tVariant}
tagitemlist(A) ::= tagitemlist(X) COMMA tagitem(Y). { A = tVariantListAppend(X, &Y, -1);    }
tagitemlist(A) ::= tagitem(X).                      { A = tVariantListAppend(NULL, &X, -1); }

372 373 374 375
tagitem(A) ::= INTEGER(X).      { toTSDBType(X.type); tVariantCreate(&A, &X); }
tagitem(A) ::= FLOAT(X).        { toTSDBType(X.type); tVariantCreate(&A, &X); }
tagitem(A) ::= STRING(X).       { toTSDBType(X.type); tVariantCreate(&A, &X); }
tagitem(A) ::= BOOL(X).         { toTSDBType(X.type); tVariantCreate(&A, &X); }
S
slguan 已提交
376
tagitem(A) ::= NULL(X).         { X.type = 0; tVariantCreate(&A, &X); }
H
hzcheng 已提交
377 378 379 380 381 382 383 384 385 386 387 388 389 390 391

tagitem(A) ::= MINUS(X) INTEGER(Y).{
    X.n += Y.n;
    X.type = Y.type;
    toTSDBType(X.type);
    tVariantCreate(&A, &X);
}

tagitem(A) ::= MINUS(X) FLOAT(Y).  {
    X.n += Y.n;
    X.type = Y.type;
    toTSDBType(X.type);
    tVariantCreate(&A, &X);
}

S
slguan 已提交
392 393 394 395 396 397 398 399 400 401 402 403 404
tagitem(A) ::= PLUS(X) INTEGER(Y). {
    X.n += Y.n;
    X.type = Y.type;
    toTSDBType(X.type);
    tVariantCreate(&A, &X);
}

tagitem(A) ::= PLUS(X) FLOAT(Y).  {
    X.n += Y.n;
    X.type = Y.type;
    toTSDBType(X.type);
    tVariantCreate(&A, &X);
}
H
hzcheng 已提交
405 406 407

//////////////////////// The SELECT statement /////////////////////////////////
%type select {SQuerySQL*}
408
%destructor select {doDestroyQuerySql($$);}
H
hzcheng 已提交
409
select(A) ::= SELECT(T) selcollist(W) from(X) where_opt(Y) interval_opt(K) fill_opt(F) sliding_opt(S) groupby_opt(P) orderby_opt(Z) having_opt(N) slimit_opt(G) limit_opt(L). {
S
slguan 已提交
410
  A = tSetQuerySQLElems(&T, W, X, Y, P, Z, &K, &S, F, &L, &G);
H
hzcheng 已提交
411 412
}

413 414 415 416 417
%type union {SSubclauseInfo*}
%destructor union {destroyAllSelectClause($$);}

union(Y) ::= select(X). { Y = setSubclause(NULL, X); }
union(Y) ::= LP union(X) RP. { Y = X; }
418 419
union(Y) ::= union(Z) UNION ALL select(X). { Y = appendSelectClause(Z, X); }
union(Y) ::= union(Z) UNION ALL LP select(X) RP. { Y = appendSelectClause(Z, X); }
420 421 422

cmd ::= union(X). { setSQLInfo(pInfo, X, NULL, TSDB_SQL_SELECT); }

H
hjxilinx 已提交
423 424 425 426 427 428 429 430
// Support for the SQL exprssion without from & where subclauses, e.g.,
// select current_database(),
// select server_version(), select client_version(),
// select server_state();
select(A) ::= SELECT(T) selcollist(W). {
  A = tSetQuerySQLElems(&T, W, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
}

H
hzcheng 已提交
431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
// selcollist is a list of expressions that are to become the return
// values of the SELECT statement.  The "*" in statements like
// "SELECT * FROM ..." is encoded as a special expression with an opcode of TK_ALL.
%type selcollist {tSQLExprList*}
%destructor selcollist {tSQLExprListDestroy($$);}

%type sclp {tSQLExprList*}
%destructor sclp {tSQLExprListDestroy($$);}
sclp(A) ::= selcollist(X) COMMA.             {A = X;}
sclp(A) ::= .                                {A = 0;}
selcollist(A) ::= sclp(P) expr(X) as(Y).     {
   A = tSQLExprListAppend(P, X, Y.n?&Y:0);
}

selcollist(A) ::= sclp(P) STAR. {
   tSQLExpr *pNode = tSQLExprIdValueCreate(NULL, TK_ALL);
   A = tSQLExprListAppend(P, pNode, 0);
}

// An option "AS <id>" phrase that can follow one of the expressions that
// define the result set, or one of the tables in the FROM clause.
//
H
Haojun Liao 已提交
453
%type as {SStrToken}
H
hzcheng 已提交
454 455 456 457 458
as(X) ::= AS ids(Y).    { X = Y;    }
as(X) ::= ids(Y).       { X = Y;    }
as(X) ::= .             { X.n = 0;  }

// A complete FROM clause.
H
Haojun Liao 已提交
459
%type from {SArray*}
H
hzcheng 已提交
460
// current not support query from no-table
S
slguan 已提交
461 462
from(A) ::= FROM tablelist(X).                 {A = X;}

H
Haojun Liao 已提交
463
%type tablelist {SArray*}
H
Haojun Liao 已提交
464 465 466 467 468 469 470 471
tablelist(A) ::= ids(X) cpxName(Y).                     {
  toTSDBType(X.type);
  X.n += Y.n;
  A = tVariantListAppendToken(NULL, &X, -1);
  A = tVariantListAppendToken(A, &X, -1);  // table alias name
}

tablelist(A) ::= ids(X) cpxName(Y) ids(Z).             {
472 473 474 475 476
  toTSDBType(X.type);
  toTSDBType(Z.type);
  X.n += Y.n;
  A = tVariantListAppendToken(NULL, &X, -1);
  A = tVariantListAppendToken(A, &Z, -1);
H
Haojun Liao 已提交
477 478 479 480 481 482 483 484 485 486
}

tablelist(A) ::= tablelist(Y) COMMA ids(X) cpxName(Z).  {
  toTSDBType(X.type);
  X.n += Z.n;
  A = tVariantListAppendToken(Y, &X, -1);
  A = tVariantListAppendToken(A, &X, -1);
}

tablelist(A) ::= tablelist(Y) COMMA ids(X) cpxName(Z) ids(F). {
487 488 489 490 491
  toTSDBType(X.type);
  toTSDBType(F.type);
  X.n += Z.n;
  A = tVariantListAppendToken(Y, &X, -1);
  A = tVariantListAppendToken(A, &F, -1);
H
Haojun Liao 已提交
492
}
H
hzcheng 已提交
493 494

// The value of interval should be the form of "number+[a,s,m,h,d,n,y]" or "now"
H
Haojun Liao 已提交
495
%type tmvar {SStrToken}
H
hzcheng 已提交
496 497
tmvar(A) ::= VARIABLE(X).   {A = X;}

498 499 500 501
%type interval_opt {SIntervalVal}
interval_opt(N) ::= INTERVAL LP tmvar(E) RP.    {N.interval = E; N.offset.n = 0; N.offset.z = NULL; N.offset.type = 0;}
interval_opt(N) ::= INTERVAL LP tmvar(E) COMMA tmvar(O) RP.    {N.interval = E; N.offset = O;}
interval_opt(N) ::= .                           {memset(&N, 0, sizeof(N));}
H
hzcheng 已提交
502

H
Haojun Liao 已提交
503 504
%type fill_opt {SArray*}
%destructor fill_opt {taosArrayDestroy($$);}
H
hzcheng 已提交
505 506 507 508 509 510
fill_opt(N) ::= .                               {N = 0;     }
fill_opt(N) ::= FILL LP ID(Y) COMMA tagitemlist(X) RP.      {
    tVariant A = {0};
    toTSDBType(Y.type);
    tVariantCreate(&A, &Y);

H
Haojun Liao 已提交
511
    tVariantListInsert(X, &A, -1, 0);
H
hzcheng 已提交
512 513 514 515 516
    N = X;
}

fill_opt(N) ::= FILL LP ID(Y) RP.               {
    toTSDBType(Y.type);
517
    N = tVariantListAppendToken(NULL, &Y, -1);
H
hzcheng 已提交
518 519
}

H
Haojun Liao 已提交
520
%type sliding_opt {SStrToken}
H
hzcheng 已提交
521
sliding_opt(K) ::= SLIDING LP tmvar(E) RP.      {K = E;     }
H
hjxilinx 已提交
522
sliding_opt(K) ::= .                            {K.n = 0; K.z = NULL; K.type = 0;   }
H
hzcheng 已提交
523

H
Haojun Liao 已提交
524 525
%type orderby_opt {SArray*}
%destructor orderby_opt {taosArrayDestroy($$);}
H
hzcheng 已提交
526

H
Haojun Liao 已提交
527 528
%type sortlist {SArray*}
%destructor sortlist {taosArrayDestroy($$);}
H
hzcheng 已提交
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543

%type sortitem {tVariant}
%destructor sortitem {tVariantDestroy(&$$);}

orderby_opt(A) ::= .                          {A = 0;}
orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}

sortlist(A) ::= sortlist(X) COMMA item(Y) sortorder(Z). {
    A = tVariantListAppend(X, &Y, Z);
}

sortlist(A) ::= item(Y) sortorder(Z). {
  A = tVariantListAppend(NULL, &Y, Z);
}

544 545
%type item {tVariant}
item(A) ::= ids(X) cpxName(Y).   {
H
hzcheng 已提交
546
  toTSDBType(X.type);
547 548
  X.n += Y.n;

H
hzcheng 已提交
549 550 551 552
  tVariantCreate(&A, &X);
}

%type sortorder {int}
553 554 555
sortorder(A) ::= ASC.           { A = TSDB_ORDER_ASC; }
sortorder(A) ::= DESC.          { A = TSDB_ORDER_DESC;}
sortorder(A) ::= .              { A = TSDB_ORDER_ASC; }  // Ascending order by default
H
hzcheng 已提交
556 557

//group by clause
H
Haojun Liao 已提交
558 559 560 561
%type groupby_opt {SArray*}
%destructor groupby_opt {taosArrayDestroy($$);}
%type grouplist {SArray*}
%destructor grouplist {taosArrayDestroy($$);}
H
hzcheng 已提交
562

563 564
groupby_opt(A) ::= .                       { A = 0;}
groupby_opt(A) ::= GROUP BY grouplist(X).  { A = X;}
H
hzcheng 已提交
565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582

grouplist(A) ::= grouplist(X) COMMA item(Y).    {
  A = tVariantListAppend(X, &Y, -1);
}

grouplist(A) ::= item(X).                       {
  A = tVariantListAppend(NULL, &X, -1);
}

//having clause, ignore the input condition in having
%type having_opt {tSQLExpr*}
%destructor having_opt {tSQLExprDestroy($$);}
having_opt(A) ::=.                  {A = 0;}
having_opt(A) ::= HAVING expr(X).   {A = X;}

//limit-offset subclause
%type limit_opt {SLimitVal}
limit_opt(A) ::= .                     {A.limit = -1; A.offset = 0;}
583
limit_opt(A) ::= LIMIT signed(X).      {A.limit = X;  A.offset = 0;}
H
hzcheng 已提交
584
limit_opt(A) ::= LIMIT signed(X) OFFSET signed(Y).
585
                                       { A.limit = X;  A.offset = Y;}
H
hzcheng 已提交
586
limit_opt(A) ::= LIMIT signed(X) COMMA signed(Y).
587
                                       { A.limit = Y;  A.offset = X;}
H
hzcheng 已提交
588 589 590 591 592 593 594

%type slimit_opt {SLimitVal}
slimit_opt(A) ::= .                    {A.limit = -1; A.offset = 0;}
slimit_opt(A) ::= SLIMIT signed(X).    {A.limit = X;  A.offset = 0;}
slimit_opt(A) ::= SLIMIT signed(X) SOFFSET signed(Y).
                                       {A.limit = X;  A.offset = Y;}
slimit_opt(A) ::= SLIMIT signed(X) COMMA  signed(Y).
S
slguan 已提交
595
                                       {A.limit = Y;  A.offset = X;}
H
hzcheng 已提交
596 597 598 599 600 601 602 603 604 605 606 607

%type where_opt {tSQLExpr*}
%destructor where_opt {tSQLExprDestroy($$);}

where_opt(A) ::= .                    {A = 0;}
where_opt(A) ::= WHERE expr(X).       {A = X;}

/////////////////////////// Expression Processing /////////////////////////////
//
%type expr {tSQLExpr*}
%destructor expr {tSQLExprDestroy($$);}

608
expr(A) ::= LP(X) expr(Y) RP(Z).       {A = Y; A->token.z = X.z; A->token.n = (Z.z - X.z + 1);}
H
hzcheng 已提交
609

610 611 612 613 614 615 616 617 618 619 620 621 622 623
expr(A) ::= ID(X).               { A = tSQLExprIdValueCreate(&X, TK_ID);}
expr(A) ::= ID(X) DOT ID(Y).     { X.n += (1+Y.n); A = tSQLExprIdValueCreate(&X, TK_ID);}
expr(A) ::= ID(X) DOT STAR(Y).   { X.n += (1+Y.n); A = tSQLExprIdValueCreate(&X, TK_ALL);}

expr(A) ::= INTEGER(X).          { A = tSQLExprIdValueCreate(&X, TK_INTEGER);}
expr(A) ::= MINUS(X) INTEGER(Y). { X.n += Y.n; X.type = TK_INTEGER; A = tSQLExprIdValueCreate(&X, TK_INTEGER);}
expr(A) ::= PLUS(X)  INTEGER(Y). { X.n += Y.n; X.type = TK_INTEGER; A = tSQLExprIdValueCreate(&X, TK_INTEGER);}
expr(A) ::= FLOAT(X).            { A = tSQLExprIdValueCreate(&X, TK_FLOAT);}
expr(A) ::= MINUS(X) FLOAT(Y).   { X.n += Y.n; X.type = TK_FLOAT; A = tSQLExprIdValueCreate(&X, TK_FLOAT);}
expr(A) ::= PLUS(X) FLOAT(Y).    { X.n += Y.n; X.type = TK_FLOAT; A = tSQLExprIdValueCreate(&X, TK_FLOAT);}
expr(A) ::= STRING(X).           { A = tSQLExprIdValueCreate(&X, TK_STRING);}
expr(A) ::= NOW(X).              { A = tSQLExprIdValueCreate(&X, TK_NOW); }
expr(A) ::= VARIABLE(X).         { A = tSQLExprIdValueCreate(&X, TK_VARIABLE);}
expr(A) ::= BOOL(X).             { A = tSQLExprIdValueCreate(&X, TK_BOOL);}
H
Haojun Liao 已提交
624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646

// ordinary functions: min(x), max(x), top(k, 20)
expr(A) ::= ID(X) LP exprlist(Y) RP(E). { A = tSQLExprCreateFunction(Y, &X, &E, X.type); }

// for parsing sql functions with wildcard for parameters. e.g., count(*)/first(*)/last(*) operation
expr(A) ::= ID(X) LP STAR RP(Y).     { A = tSQLExprCreateFunction(NULL, &X, &Y, X.type); }

// is (not) null expression
expr(A) ::= expr(X) IS NULL.           {A = tSQLExprCreate(X, NULL, TK_ISNULL);}
expr(A) ::= expr(X) IS NOT NULL.       {A = tSQLExprCreate(X, NULL, TK_NOTNULL);}

// relational expression
expr(A) ::= expr(X) LT expr(Y).      {A = tSQLExprCreate(X, Y, TK_LT);}
expr(A) ::= expr(X) GT expr(Y).      {A = tSQLExprCreate(X, Y, TK_GT);}
expr(A) ::= expr(X) LE expr(Y).      {A = tSQLExprCreate(X, Y, TK_LE);}
expr(A) ::= expr(X) GE expr(Y).      {A = tSQLExprCreate(X, Y, TK_GE);}
expr(A) ::= expr(X) NE expr(Y).      {A = tSQLExprCreate(X, Y, TK_NE);}
expr(A) ::= expr(X) EQ expr(Y).      {A = tSQLExprCreate(X, Y, TK_EQ);}

expr(A) ::= expr(X) AND expr(Y).     {A = tSQLExprCreate(X, Y, TK_AND);}
expr(A) ::= expr(X) OR  expr(Y).     {A = tSQLExprCreate(X, Y, TK_OR); }

// binary arithmetic expression
H
hzcheng 已提交
647 648 649 650 651 652
expr(A) ::= expr(X) PLUS  expr(Y).   {A = tSQLExprCreate(X, Y, TK_PLUS);  }
expr(A) ::= expr(X) MINUS expr(Y).   {A = tSQLExprCreate(X, Y, TK_MINUS); }
expr(A) ::= expr(X) STAR  expr(Y).   {A = tSQLExprCreate(X, Y, TK_STAR);  }
expr(A) ::= expr(X) SLASH expr(Y).   {A = tSQLExprCreate(X, Y, TK_DIVIDE);}
expr(A) ::= expr(X) REM   expr(Y).   {A = tSQLExprCreate(X, Y, TK_REM);   }

H
Haojun Liao 已提交
653 654
// like expression
expr(A) ::= expr(X) LIKE expr(Y).    {A = tSQLExprCreate(X, Y, TK_LIKE);  }
H
hzcheng 已提交
655 656 657 658 659 660 661 662 663 664 665

//in expression
expr(A) ::= expr(X) IN LP exprlist(Y) RP.   {A = tSQLExprCreate(X, (tSQLExpr*)Y, TK_IN); }

%type exprlist {tSQLExprList*}
%destructor exprlist {tSQLExprListDestroy($$);}

%type expritem {tSQLExpr*}
%destructor expritem {tSQLExprDestroy($$);}

exprlist(A) ::= exprlist(X) COMMA expritem(Y). {A = tSQLExprListAppend(X,Y,0);}
H
Haojun Liao 已提交
666 667 668
exprlist(A) ::= expritem(X).                   {A = tSQLExprListAppend(0,X,0);}
expritem(A) ::= expr(X).                       {A = X;}
expritem(A) ::= .                              {A = 0;}
H
hzcheng 已提交
669 670

///////////////////////////////////reset query cache//////////////////////////////////////
671
cmd ::= RESET QUERY CACHE.  { setDCLSQLElems(pInfo, TSDB_SQL_RESET_CACHE, 0);}
H
hzcheng 已提交
672 673 674 675

///////////////////////////////////ALTER TABLE statement//////////////////////////////////
cmd ::= ALTER TABLE ids(X) cpxName(F) ADD COLUMN columnlist(A).     {
    X.n += F.n;
676 677
    SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, A, NULL, TSDB_ALTER_TABLE_ADD_COLUMN);
    setSQLInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
H
hzcheng 已提交
678 679 680 681 682 683
}

cmd ::= ALTER TABLE ids(X) cpxName(F) DROP COLUMN ids(A).     {
    X.n += F.n;

    toTSDBType(A.type);
H
Haojun Liao 已提交
684
    SArray* K = tVariantListAppendToken(NULL, &A, -1);
H
hzcheng 已提交
685

686 687
    SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, NULL, K, TSDB_ALTER_TABLE_DROP_COLUMN);
    setSQLInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
H
hzcheng 已提交
688 689 690 691 692
}

//////////////////////////////////ALTER TAGS statement/////////////////////////////////////
cmd ::= ALTER TABLE ids(X) cpxName(Y) ADD TAG columnlist(A).        {
    X.n += Y.n;
693 694
    SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, A, NULL, TSDB_ALTER_TABLE_ADD_TAG_COLUMN);
    setSQLInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
H
hzcheng 已提交
695 696 697 698 699
}
cmd ::= ALTER TABLE ids(X) cpxName(Z) DROP TAG ids(Y).          {
    X.n += Z.n;

    toTSDBType(Y.type);
H
Haojun Liao 已提交
700
    SArray* A = tVariantListAppendToken(NULL, &Y, -1);
H
hzcheng 已提交
701

702 703
    SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, NULL, A, TSDB_ALTER_TABLE_DROP_TAG_COLUMN);
    setSQLInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
H
hzcheng 已提交
704 705 706 707 708 709
}

cmd ::= ALTER TABLE ids(X) cpxName(F) CHANGE TAG ids(Y) ids(Z). {
    X.n += F.n;

    toTSDBType(Y.type);
H
Haojun Liao 已提交
710
    SArray* A = tVariantListAppendToken(NULL, &Y, -1);
H
hzcheng 已提交
711 712

    toTSDBType(Z.type);
713
    A = tVariantListAppendToken(A, &Z, -1);
H
hzcheng 已提交
714

715 716
    SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, NULL, A, TSDB_ALTER_TABLE_CHANGE_TAG_COLUMN);
    setSQLInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
H
hzcheng 已提交
717 718
}

719
cmd ::= ALTER TABLE ids(X) cpxName(F) SET TAG ids(Y) EQ tagitem(Z).     {
H
hzcheng 已提交
720 721 722
    X.n += F.n;

    toTSDBType(Y.type);
H
Haojun Liao 已提交
723
    SArray* A = tVariantListAppendToken(NULL, &Y, -1);
H
hzcheng 已提交
724 725
    A = tVariantListAppend(A, &Z, -1);

726 727
    SAlterTableSQL* pAlterTable = tAlterTableSQLElems(&X, NULL, A, TSDB_ALTER_TABLE_UPDATE_TAG_VAL);
    setSQLInfo(pInfo, pAlterTable, NULL, TSDB_SQL_ALTER_TABLE);
H
hzcheng 已提交
728 729 730
}

////////////////////////////////////////kill statement///////////////////////////////////////
H
Haojun Liao 已提交
731 732 733
cmd ::= KILL CONNECTION INTEGER(Y).   {setKillSQL(pInfo, TSDB_SQL_KILL_CONNECTION, &Y);}
cmd ::= KILL STREAM INTEGER(X) COLON(Z) INTEGER(Y).       {X.n += (Z.n + Y.n); setKillSQL(pInfo, TSDB_SQL_KILL_STREAM, &X);}
cmd ::= KILL QUERY INTEGER(X) COLON(Z) INTEGER(Y).        {X.n += (Z.n + Y.n); setKillSQL(pInfo, TSDB_SQL_KILL_QUERY, &X);}
H
hzcheng 已提交
734 735 736 737 738

%fallback ID ABORT AFTER ASC ATTACH BEFORE BEGIN CASCADE CLUSTER CONFLICT COPY DATABASE DEFERRED
  DELIMITERS DESC DETACH EACH END EXPLAIN FAIL FOR GLOB IGNORE IMMEDIATE INITIALLY INSTEAD
  LIKE MATCH KEY OF OFFSET RAISE REPLACE RESTRICT ROW STATEMENT TRIGGER VIEW ALL
  COUNT SUM AVG MIN MAX FIRST LAST TOP BOTTOM STDDEV PERCENTILE APERCENTILE LEASTSQUARES HISTOGRAM DIFF
739
  SPREAD TWA INTERP LAST_ROW RATE IRATE SUM_RATE SUM_IRATE AVG_RATE AVG_IRATE TBID NOW IPTOKEN SEMI NONE PREV LINEAR IMPORT
H
hjxilinx 已提交
740
  METRIC TBNAME JOIN METRICS STABLE NULL INSERT INTO VALUES.