• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #4916

06 Jan 2026 01:30AM UTC coverage: 65.402% (-0.3%) from 65.711%
#4916

push

travis-ci

web-flow
merge: from main to 3.0 branch #34167

185 of 324 new or added lines in 15 files covered. (57.1%)

3165 existing lines in 17 files now uncovered.

202517 of 309650 relevant lines covered (65.4%)

114862302.71 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

90.36
/source/libs/parser/src/parTokenizer.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14
 */
15

16
#include "os.h"
17
#include "parToken.h"
18
#include "taosdef.h"
19
#include "thash.h"
20
#include "ttokendef.h"
21

22
// All the keywords of the SQL language are stored in a hash table
23
typedef struct SKeyword {
24
  const char* name;  // The keyword name
25
  uint16_t    type;  // type
26
  uint8_t     len;   // length
27
} SKeyword;
28

29
// clang-format off
30
// keywords in sql string
31
static SKeyword keywordTable[] = {
32
    {"ACCOUNT",              TK_ACCOUNT},
33
    {"ACCOUNTS",             TK_ACCOUNTS},
34
    {"ADD",                  TK_ADD},
35
    {"AGGREGATE",            TK_AGGREGATE},
36
    {"ALL",                  TK_ALL},
37
    {"ALTER",                TK_ALTER},
38
    {"ANALYZE",              TK_ANALYZE},
39
    {"AND",                  TK_AND},
40
    {"ANTI",                 TK_ANTI},
41
    {"ANODE",                TK_ANODE},
42
    {"ANODES",               TK_ANODES},
43
    {"ANOMALY_WINDOW",       TK_ANOMALY_WINDOW},
44
//    {"ANY",                  TK_ANY},
45
    {"APPS",                 TK_APPS},
46
    {"AS",                   TK_AS},
47
    {"ASC",                  TK_ASC},
48
    {"ASOF",                 TK_ASOF},
49
    {"BALANCE",              TK_BALANCE},
50
    {"BATCH_SCAN",           TK_BATCH_SCAN},
51
    {"BETWEEN",              TK_BETWEEN},
52
    {"BIGINT",               TK_BIGINT},
53
    {"BINARY",               TK_BINARY},
54
    {"BNODE",                TK_BNODE},
55
    {"BNODES",               TK_BNODES},
56
    {"BOOL",                 TK_BOOL},
57
    {"BOTH",                 TK_BOTH},
58
    {"BUFFER",               TK_BUFFER},
59
    {"BUFSIZE",              TK_BUFSIZE},
60
    {"BY",                   TK_BY},
61
    {"CACHE",                TK_CACHE},
62
    {"CACHEMODEL",           TK_CACHEMODEL},
63
    {"CACHESIZE",            TK_CACHESIZE},
64
    {"CALC_NOTIFY_ONLY",     TK_CALC_NOTIFY_ONLY},
65
    {"CASE",                 TK_CASE},
66
    {"CAST",                 TK_CAST},
67
    {"CHILD",                TK_CHILD},
68
    {"CLIENT_VERSION",       TK_CLIENT_VERSION},
69
    {"CLUSTER",              TK_CLUSTER},
70
    {"COALESCE",             TK_COALESCE},
71
    {"COLUMN",               TK_COLUMN},
72
    {"COMMENT",              TK_COMMENT},
73
    {"COMP",                 TK_COMP},
74
    {"COMPACT",              TK_COMPACT},
75
    {"COMPACTS",             TK_COMPACTS},
76
    {"COMPACT_INTERVAL",     TK_COMPACT_INTERVAL},
77
    {"COMPACT_TIME_OFFSET",  TK_COMPACT_TIME_OFFSET},
78
    {"COMPACT_TIME_RANGE",   TK_COMPACT_TIME_RANGE},
79
    {"CONNECTION",           TK_CONNECTION},
80
    {"CONNECTIONS",          TK_CONNECTIONS},
81
    {"CONNS",                TK_CONNS},
82
    {"CONSUMER",             TK_CONSUMER},
83
    {"CONSUMERS",            TK_CONSUMERS},
84
    {"CONTAINS",             TK_CONTAINS},
85
    {"COUNT",                TK_COUNT},
86
    {"COUNT_WINDOW",         TK_COUNT_WINDOW},
87
    {"CREATE",               TK_CREATE},
88
    {"CREATEDB",             TK_CREATEDB},
89
    {"CURRENT_USER",         TK_CURRENT_USER},
90
    {"DATABASE",             TK_DATABASE},
91
    {"DATABASES",            TK_DATABASES},
92
    {"DBS",                  TK_DBS},
93
    {"DECIMAL",              TK_DECIMAL},
94
    {"DEFAULT",              TK_DEFAULT},
95
    {"DELETE",               TK_DELETE},
96
    {"DELETE_MARK",          TK_DELETE_MARK},
97
    {"DELETE_OUTPUT_TABLE",  TK_DELETE_OUTPUT_TABLE},
98
    {"DELETE_RECALC",        TK_DELETE_RECALC},
99
    {"DESC",                 TK_DESC},
100
    {"DESCRIBE",             TK_DESCRIBE},
101
    {"DISTINCT",             TK_DISTINCT},
102
    {"DISTRIBUTED",          TK_DISTRIBUTED},
103
    {"DNODE",                TK_DNODE},
104
    {"DNODES",               TK_DNODES},
105
    {"DOUBLE",               TK_DOUBLE},
106
    {"DROP",                 TK_DROP},
107
    {"DURATION",             TK_DURATION},
108
    {"ELSE",                 TK_ELSE},
109
    {"ENABLE",               TK_ENABLE},
110
    {"ENCRYPTIONS",          TK_ENCRYPTIONS},
111
    {"ENCRYPT_ALGORITHM",    TK_ENCRYPT_ALGORITHM},
112
    {"ENCRYPT_KEY",          TK_ENCRYPT_KEY},
113
    {"END",                  TK_END},
114
    {"EXISTS",               TK_EXISTS},
115
    {"EXPIRED_TIME",         TK_EXPIRED_TIME},
116
    {"EXPLAIN",              TK_EXPLAIN},
117
    {"EVENT_TYPE",           TK_EVENT_TYPE},
118
    {"EVENT_WINDOW",         TK_EVENT_WINDOW},
119
    {"EVERY",                TK_EVERY},
120
    {"FILE",                 TK_FILE},
121
    {"FILL",                 TK_FILL},
122
    {"FILL_HISTORY",         TK_FILL_HISTORY},
123
    {"FILL_HISTORY_FIRST",   TK_FILL_HISTORY_FIRST},
124
    {"FIRST",                TK_FIRST},
125
    {"FLOAT",                TK_FLOAT},
126
    {"FLUSH",                TK_FLUSH},
127
    {"FROM",                 TK_FROM},
128
    {"FOR",                  TK_FOR},
129
    {"FORCE",                TK_FORCE},
130
    {"FORCE_OUTPUT",         TK_FORCE_OUTPUT},
131
    {"FULL",                 TK_FULL},
132
    {"FUNCTION",             TK_FUNCTION},
133
    {"FUNCTIONS",            TK_FUNCTIONS},
134
    {"GEOMETRY",             TK_GEOMETRY},
135
    {"GRANT",                TK_GRANT},
136
    {"GRANTS",               TK_GRANTS},
137
    {"FULL",                 TK_FULL},
138
    {"LOGS",                 TK_LOGS},
139
    {"MACHINES",             TK_MACHINES},
140
    {"GROUP",                TK_GROUP},
141
    {"HASH_JOIN",            TK_HASH_JOIN},
142
    {"HAVING",               TK_HAVING},
143
    {"HOST",                 TK_HOST},
144
    {"IF",                   TK_IF},
145
    {"IFNULL",               TK_IFNULL},
146
    {"IGNORE",               TK_IGNORE},
147
    {"IGNORE_DISORDER",      TK_IGNORE_DISORDER},
148
    {"IGNORE_NODATA_TRIGGER", TK_IGNORE_NODATA_TRIGGER},
149
    {"IMPORT",               TK_IMPORT},
150
    {"IN",                   TK_IN},
151
    {"INDEX",                TK_INDEX},
152
    {"INDEXES",              TK_INDEXES},
153
    {"INNER",                TK_INNER},
154
    {"INSERT",               TK_INSERT},
155
    {"INSTANCES",            TK_INSTANCES},
156
    {"INT",                  TK_INT},
157
    {"INTEGER",              TK_INTEGER},
158
    {"INTERVAL",             TK_INTERVAL},
159
    {"INTO",                 TK_INTO},
160
    {"IS",                   TK_IS},
161
    {"ISNOTNULL",            TK_ISNOTNULL},
162
    {"ISNULL",               TK_ISNULL},
163
    {"JLIMIT",               TK_JLIMIT},
164
    {"JOIN",                 TK_JOIN},
165
    {"JSON",                 TK_JSON},
166
    {"KEEP",                 TK_KEEP},
167
    {"KEY",                  TK_KEY},
168
    {"KILL",                 TK_KILL},
169
    {"LANGUAGE",             TK_LANGUAGE},
170
    {"LAST",                 TK_LAST},
171
    {"LAST_ROW",             TK_LAST_ROW},
172
    {"LEADER",               TK_LEADER},
173
    {"LEADING",              TK_LEADING},
174
    {"LEFT",                 TK_LEFT},
175
    {"LICENCES",             TK_LICENCES},
176
    {"LIKE",                 TK_LIKE},
177
    {"LIMIT",                TK_LIMIT},
178
    {"LINEAR",               TK_LINEAR},
179
    {"LOCAL",                TK_LOCAL},
180
    {"LOCK",                 TK_LOCK},
181
    {"LOW_LATENCY_CALC",     TK_LOW_LATENCY_CALC},
182
    {"MASK",                 TK_MASK},
183
    {"MATCH",                TK_MATCH},
184
    {"MAXROWS",              TK_MAXROWS},
185
    {"MAX_DELAY",            TK_MAX_DELAY},
186
    {"BWLIMIT",              TK_BWLIMIT},
187
    {"MERGE",                TK_MERGE},
188
    {"META",                 TK_META},
189
    {"ONLY",                 TK_ONLY},
190
    {"MINROWS",              TK_MINROWS},
191
    {"MINUS",                TK_MINUS},
192
    {"MNODE",                TK_MNODE},
193
    {"MNODES",               TK_MNODES},
194
    {"MODIFY",               TK_MODIFY},
195
    {"MODULES",              TK_MODULES},
196
    {"MOUNT",                TK_MOUNT},
197
    {"MOUNTS",               TK_MOUNTS},
198
    {"NORMAL",               TK_NORMAL},
199
    {"NCHAR",                TK_NCHAR},
200
    {"NEXT",                 TK_NEXT},
201
    {"NEAR",                 TK_NEAR},
202
    {"NMATCH",               TK_NMATCH},
203
    {"NODE",                 TK_NODE},
204
    {"NODES",                TK_NODES},
205
    {"NONE",                 TK_NONE},
206
    {"NOT",                  TK_NOT},
207
    {"NOW",                  TK_NOW},
208
    {"NOTIFY_OPTIONS",       TK_NOTIFY_OPTIONS},
209
    {"NO_BATCH_SCAN",        TK_NO_BATCH_SCAN},
210
    {"NULL",                 TK_NULL},
211
    {"NULL_F",               TK_NULL_F},
212
    {"NULLIF",               TK_NULLIF},
213
    {"NULLS",                TK_NULLS},
214
    {"NVL",                  TK_NVL},
215
    {"NVL2",                 TK_NVL2},
216
    {"OFFSET",               TK_OFFSET},
217
    {"ON",                   TK_ON},
218
    {"OR",                   TK_OR},
219
    {"ORDER",                TK_ORDER},
220
    {"OUTER",                TK_OUTER},
221
    {"OUTPUTTYPE",           TK_OUTPUTTYPE},
222
    {"OUTPUT_SUBTABLE",      TK_OUTPUT_SUBTABLE},
223
    {"OWNED",                TK_OWNED},
224
    {"PAGES",                TK_PAGES},
225
    {"PAGESIZE",             TK_PAGESIZE},
226
    {"PARA_TABLES_SORT",     TK_PARA_TABLES_SORT},
227
    {"PARTITION",            TK_PARTITION},
228
    {"PARTITION_FIRST",      TK_PARTITION_FIRST},
229
    {"PASS",                 TK_PASS},
230
    {"PORT",                 TK_PORT},
231
    {"POSITION",             TK_POSITION},
232
    {"PPS",                  TK_PPS},
233
    {"PRIMARY",              TK_PRIMARY},
234
    {"PRE_FILTER",           TK_PRE_FILTER},
235
    {"COMPOSITE",            TK_COMPOSITE},
236
    {"PRECISION",            TK_PRECISION},
237
    {"PREV",                 TK_PREV},
238
    {"PRIVILEGE",            TK_PRIVILEGE},
239
    {"PRIVILEGES",           TK_PRIVILEGES},
240
    {"QNODE",                TK_QNODE},
241
    {"QNODES",               TK_QNODES},
242
    {"QTIME",                TK_QTIME},
243
    {"QUERIES",              TK_QUERIES},
244
    {"QUERY",                TK_QUERY},
245
    {"PI",                   TK_PI},
246
    {"RAND",                 TK_RAND},
247
    {"RANGE",                TK_RANGE},
248
    {"RATIO",                TK_RATIO},
249
    {"PERIOD",               TK_PERIOD},
250
    {"READ",                 TK_READ},
251
    {"RECURSIVE",            TK_RECURSIVE},
252
    {"REDISTRIBUTE",         TK_REDISTRIBUTE},
253
    {"RENAME",               TK_RENAME},
254
    {"RELOAD",               TK_RELOAD},
255
    {"RECALCULATE",          TK_RECALCULATE},
256
    {"REPLACE",              TK_REPLACE},
257
    {"REPLICAS",             TK_REPLICAS},
258
    {"REPLICA",              TK_REPLICA},
259
    {"RESET",                TK_RESET},
260
    {"RESTORE",              TK_RESTORE},
261
    {"RETENTION",            TK_RETENTION},
262
    {"RETENTIONS",           TK_RETENTIONS},
263
    {"REVOKE",               TK_REVOKE},
264
    {"RIGHT",                TK_RIGHT},
265
    {"ROLE",                 TK_ROLE},
266
    {"ROLES",                TK_ROLES},
267
    {"ROLLUP",               TK_ROLLUP},
268
    {"RSMA",                 TK_RSMA},
269
    {"RSMAS",                TK_RSMAS},
270
    {"SCHEMALESS",           TK_SCHEMALESS},
271
    {"SCORES",               TK_SCORES},
272
    {"SELECT",               TK_SELECT},
273
    {"SEMI",                 TK_SEMI},
274
    {"SERVER_STATUS",        TK_SERVER_STATUS},
275
    {"SERVER_VERSION",       TK_SERVER_VERSION},
276
    {"SESSION",              TK_SESSION},
277
    {"SET",                  TK_SET},
278
    {"SHOW",                 TK_SHOW},
279
    {"SINGLE_STABLE",        TK_SINGLE_STABLE},
280
    {"SKIP_TSMA",            TK_SKIP_TSMA},
281
    {"SLIDING",              TK_SLIDING},
282
    {"SLIMIT",               TK_SLIMIT},
283
    {"SMA",                  TK_SMA},
284
    {"SMALLDATA_TS_SORT",    TK_SMALLDATA_TS_SORT},
285
    {"SMALLINT",             TK_SMALLINT},
286
    {"SNODE",                TK_SNODE},
287
    {"SNODES",               TK_SNODES},
288
    {"SORT_FOR_GROUP",       TK_SORT_FOR_GROUP},
289
    {"SOFFSET",              TK_SOFFSET},
290
    {"SPLIT",                TK_SPLIT},
291
    {"STABLE",               TK_STABLE},
292
    {"STABLES",              TK_STABLES},
293
    {"START",                TK_START},
294
    {"STATE",                TK_STATE},
295
    {"STATE_WINDOW",         TK_STATE_WINDOW},
296
    {"STOP",                 TK_STOP},
297
    {"STORAGE",              TK_STORAGE},
298
    {"STREAM",               TK_STREAM},
299
    {"STREAMS",              TK_STREAMS},
300
    {"STREAM_OPTIONS",       TK_STREAM_OPTIONS},
301
    {"STRICT",               TK_STRICT},
302
    {"STT_TRIGGER",          TK_STT_TRIGGER},
303
    {"SUBSCRIBE",            TK_SUBSCRIBE},
304
    {"SUBSCRIPTIONS",        TK_SUBSCRIPTIONS},
305
    {"SUBSTR",               TK_SUBSTR},
306
    {"SUBSTRING",            TK_SUBSTRING},
307
    {"SYSINFO",              TK_SYSINFO},
308
    {"SYSTEM",               TK_SYSTEM},
309
    {"TABLE",                TK_TABLE},
310
    {"TABLES",               TK_TABLES},
311
    {"TABLE_PREFIX",         TK_TABLE_PREFIX},
312
    {"TABLE_SUFFIX",         TK_TABLE_SUFFIX},
313
    {"TAG",                  TK_TAG},
314
    {"TAGS",                 TK_TAGS},
315
    {"TBNAME",               TK_TBNAME},
316
    {"THEN",                 TK_THEN},
317
    {"TIMESTAMP",            TK_TIMESTAMP},
318
    {"TIMEZONE",             TK_TIMEZONE},
319
    {"TINYINT",              TK_TINYINT},
320
    {"TO",                   TK_TO},
321
    {"TODAY",                TK_TODAY},
322
    {"TOKEN",                TK_TOKEN},
323
    {"TOPIC",                TK_TOPIC},
324
    {"TOPICS",               TK_TOPICS},
325
    {"TOTPSEED",             TK_TOTPSEED},
326
    {"TOTP_SECRET",          TK_TOTP_SECRET},
327
    {"TRAILING",             TK_TRAILING},
328
    {"TRANSACTION",          TK_TRANSACTION},
329
    {"TRANSACTIONS",         TK_TRANSACTIONS},
330
    {"TRIM",                 TK_TRIM},
331
    {"TROWS",                TK_TROWS},
332
    {"TSDB_PAGESIZE",        TK_TSDB_PAGESIZE},
333
    {"TSERIES",              TK_TSERIES},
334
    {"TSMA",                 TK_TSMA},
335
    {"TSMAS",                TK_TSMAS},
336
    {"TTL",                  TK_TTL},
337
    {"UNION",                TK_UNION},
338
    {"UNLIMITED",            TK_UNLIMITED},
339
    {"UNLOCK",               TK_UNLOCK},
340
    {"UNSAFE",               TK_UNSAFE},
341
    {"UNSIGNED",             TK_UNSIGNED},
342
    {"UNTREATED",            TK_UNTREATED},
343
    {"UPDATE",               TK_UPDATE},
344
    {"USE",                  TK_USE},
345
    {"USER",                 TK_USER},
346
    {"USERS",                TK_USERS},
347
    {"USING",                TK_USING},
348
    {"VALUE",                TK_VALUE},
349
    {"VALUE_F",              TK_VALUE_F},
350
    {"VALUES",               TK_VALUES},
351
    {"VARCHAR",              TK_VARCHAR},
352
    {"VARIABLES",            TK_VARIABLES},
353
    {"VERBOSE",              TK_VERBOSE},
354
    {"VGROUP",               TK_VGROUP},
355
    {"VGROUPS",              TK_VGROUPS},
356
    {"VIEW",                 TK_VIEW},
357
    {"VIEWS",                TK_VIEWS},
358
    {"VIRTUAL",              TK_VIRTUAL},
359
    {"VNODE",                TK_VNODE},
360
    {"VNODES",               TK_VNODES},
361
    {"VTABLE",               TK_VTABLE},
362
    {"WAL",                  TK_WAL},
363
    {"WAL_FSYNC_PERIOD",     TK_WAL_FSYNC_PERIOD},
364
    {"WAL_LEVEL",            TK_WAL_LEVEL},
365
    {"WAL_RETENTION_PERIOD", TK_WAL_RETENTION_PERIOD},
366
    {"WAL_RETENTION_SIZE",   TK_WAL_RETENTION_SIZE},
367
    {"WAL_ROLL_PERIOD",      TK_WAL_ROLL_PERIOD},
368
    {"WAL_SEGMENT_SIZE",     TK_WAL_SEGMENT_SIZE},
369
    {"WATERMARK",            TK_WATERMARK},
370
    {"WHEN",                 TK_WHEN},
371
    {"WHERE",                TK_WHERE},
372
    {"WINDOW",               TK_WINDOW},
373
    {"WINDOW_OPEN",          TK_WINDOW_OPEN},
374
    {"WINDOW_CLOSE",         TK_WINDOW_CLOSE},
375
    {"WINDOW_OFFSET",        TK_WINDOW_OFFSET},
376
    {"WIN_OPTIMIZE_BATCH",   TK_WIN_OPTIMIZE_BATCH},
377
    {"WIN_OPTIMIZE_SINGLE",  TK_WIN_OPTIMIZE_SINGLE},
378
    {"WITH",                 TK_WITH},
379
    {"WRITE",                TK_WRITE},
380
    {"_C0",                  TK_ROWTS},
381
    {"_IROWTS",              TK_IROWTS},
382
    {"_IROWTS_ORIGIN",       TK_IROWTS_ORIGIN},
383
    {"_ISFILLED",            TK_ISFILLED},
384
    {"_QDURATION",           TK_QDURATION},
385
    {"_QEND",                TK_QEND},
386
    {"_QSTART",              TK_QSTART},
387
    {"_ROWTS",               TK_ROWTS},
388
    {"_TAGS",                TK_QTAGS},
389
    {"_WDURATION",           TK_WDURATION},
390
    {"_WEND",                TK_WEND},
391
    {"_WSTART",              TK_WSTART},
392
    {"_FLOW",                TK_FLOW},
393
    {"_FHIGH",               TK_FHIGH},
394
    {"_FROWTS",              TK_FROWTS},
395
    {"_TPREV_TS",            TK_TPREV_TS},
396
    {"_TCURRENT_TS",         TK_TCURRENT_TS},
397
    {"_TNEXT_TS",            TK_TNEXT_TS},
398
    {"_TWSTART",             TK_TWSTART},
399
    {"_TWEND",               TK_TWEND},
400
    {"_TWDURATION",          TK_TWDURATION},
401
    {"_TWROWNUM",            TK_TWROWNUM},
402
    {"_TPREV_LOCALTIME",     TK_TPREV_LOCALTIME},
403
    {"_TNEXT_LOCALTIME",     TK_TNEXT_LOCALTIME},
404
    {"_TLOCALTIME",          TK_TLOCALTIME},
405
    {"_TGRPID",              TK_TGRPID},
406
    {"ALIVE",                TK_ALIVE},
407
    {"VARBINARY",            TK_VARBINARY},
408
    {"SS_CHUNKPAGES",        TK_SS_CHUNKPAGES},
409
    {"SS_KEEPLOCAL",         TK_SS_KEEPLOCAL},
410
    {"SS_COMPACT",           TK_SS_COMPACT},
411
    {"SSMIGRATE",            TK_SSMIGRATE},
412
    {"SSMIGRATES",           TK_SSMIGRATES},
413
    {"KEEP_TIME_OFFSET",     TK_KEEP_TIME_OFFSET},
414
    {"ARBGROUPS",            TK_ARBGROUPS},
415
    {"IS_IMPORT",            TK_IS_IMPORT},
416
    {"DISK_INFO",            TK_DISK_INFO},
417
    {"AUTO",                 TK_AUTO},
418
    {"MEDIUMBLOB",           TK_MEDIUMBLOB},
419
    {"BLOB",                 TK_BLOB},
420
    {"COLS",                 TK_COLS},
421
    {"NOTIFY",               TK_NOTIFY},
422
    {"NOTIFY_HISTORY",       TK_NOTIFY_HISTORY},
423
    {"REGEXP",               TK_REGEXP},
424
    {"ASSIGN",               TK_ASSIGN},
425
    {"TRUE_FOR",             TK_TRUE_FOR},
426
    {"META_ONLY",            TK_META_ONLY},
427
    {"VTABLES",              TK_VTABLES},
428
    {"META_ONLY",            TK_META_ONLY},
429
    {"_IMPROWTS",            TK_IMPROWTS},
430
    {"_IMPMARK",             TK_IMPMARK},
431
    {"SCAN",                 TK_SCAN},
432
    {"SCANS",                TK_SCANS},
433
    {"SVR_KEY",              TK_SVR_KEY},
434
    {"DB_KEY",               TK_DB_KEY},
435
    {"_ANOMALYMARK",         TK_ANOMALYMARK},
436
    {"CHANGEPASS",           TK_CHANGEPASS},
437
    {"SESSION_PER_USER",     TK_SESSION_PER_USER},
438
    {"CONNECT_TIME",         TK_CONNECT_TIME},
439
    {"CONNECT_IDLE_TIME",    TK_CONNECT_IDLE_TIME},
440
    {"CALL_PER_SESSION",     TK_CALL_PER_SESSION},
441
    {"FAILED_LOGIN_ATTEMPTS",TK_FAILED_LOGIN_ATTEMPTS},
442
    {"PASSWORD_LIFE_TIME",   TK_PASSWORD_LIFE_TIME},
443
    {"PASSWORD_REUSE_TIME",  TK_PASSWORD_REUSE_TIME},
444
    {"PASSWORD_REUSE_MAX",   TK_PASSWORD_REUSE_MAX},
445
    {"PASSWORD_LOCK_TIME",   TK_PASSWORD_LOCK_TIME},
446
    {"PASSWORD_GRACE_TIME",  TK_PASSWORD_GRACE_TIME},
447
    {"INACTIVE_ACCOUNT_TIME",TK_INACTIVE_ACCOUNT_TIME},
448
    {"ALLOW_TOKEN_NUM",      TK_ALLOW_TOKEN_NUM},
449
    {"NOT_ALLOW_HOST",       TK_NOT_ALLOW_HOST},
450
    {"ALLOW_DATETIME",       TK_ALLOW_DATETIME},
451
    {"RELOAD",               TK_RELOAD},
452
    {"NOT_ALLOW_DATETIME",   TK_NOT_ALLOW_DATETIME},
453
    {"ENCRYPT_ALGORITHMS",   TK_ENCRYPT_ALGORITHMS},
454
    {"ENCRYPT_STATUS",       TK_ENCRYPT_STATUS},
455
    {"ALGR_NAME",            TK_ALGR_NAME},
456
    {"ALGR_TYPE",            TK_ALGR_TYPE},
457
    {"ENCRYPT_ALGR",         TK_ENCRYPT_ALGR},
458
    {"OSSL_ALGR_NAME",       TK_OSSL_ALGR_NAME},
459
    {"PROVIDER",             TK_PROVIDER},
460
    {"EXTRA_INFO",           TK_EXTRA_INFO},
461
    {"TOKENS",               TK_TOKENS},
462
    {"IS_AUDIT",             TK_IS_AUDIT},
463
    {"VNODE_PER_CALL",       TK_VNODE_PER_CALL},
464
    {"XNODE",                TK_XNODE},
465
    {"XNODES",               TK_XNODES},
466
    {"DRAIN",                TK_DRAIN},
467
    {"REBALANCE",            TK_REBALANCE},
468
};
469
// clang-format on
470

471
static const char isIdChar[] = {
472
    /* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */
473
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */
474
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */
475
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */
476
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */
477
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */
478
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */
479
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */
480
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */
481
};
482

483
static void* keywordHashTable = NULL;
484

485
static int32_t doInitKeywordsTable(void) {
1,473,726✔
486
  int numOfEntries = tListLen(keywordTable);
1,473,726✔
487

488
  keywordHashTable = taosHashInit(numOfEntries, MurmurHash3_32, true, false);
1,473,726✔
489
  for (int32_t i = 0; i < numOfEntries; i++) {
642,544,536✔
490
    keywordTable[i].len = (uint8_t)strlen(keywordTable[i].name);
641,070,810✔
491
    void*   ptr = &keywordTable[i];
641,070,810✔
492
    int32_t code = taosHashPut(keywordHashTable, keywordTable[i].name, keywordTable[i].len, (void*)&ptr, POINTER_BYTES);
641,070,810✔
493
    if (TSDB_CODE_SUCCESS != code) {
641,070,810✔
UNCOV
494
      taosHashCleanup(keywordHashTable);
×
495
      return code;
×
496
    }
497
  }
498
  return TSDB_CODE_SUCCESS;
1,473,726✔
499
}
500

501
static int32_t tKeywordCode(const char* z, int n) {
2,147,483,647✔
502
  char key[512] = {0};
2,147,483,647✔
503
  if (n > tListLen(key)) {  // too long token, can not be any other token type
2,147,483,647✔
UNCOV
504
    return TK_NK_ID;
×
505
  }
506

507
  for (int32_t j = 0; j < n; ++j) {
2,147,483,647✔
508
    if (z[j] >= 'a' && z[j] <= 'z') {
2,147,483,647✔
509
      key[j] = (char)(z[j] & 0xDF);  // to uppercase and set the null-terminated
2,147,483,647✔
510
    } else {
511
      key[j] = z[j];
2,147,483,647✔
512
    }
513
  }
514

515
  if (keywordHashTable == NULL) {
2,147,483,647✔
UNCOV
516
    return TK_NK_ILLEGAL;
×
517
  }
518

519
  SKeyword** pKey = (SKeyword**)taosHashGet(keywordHashTable, key, n);
2,147,483,647✔
520
  return (pKey != NULL) ? (*pKey)->type : TK_NK_ID;
2,147,483,647✔
521
}
522

523
/*
524
 * Return the length of the token that begins at z[0].
525
 * Store the token type in *type before returning.
526
 */
527
uint32_t tGetToken(const char* z, uint32_t* tokenId, char *dupQuoteChar) {
2,147,483,647✔
528
  uint32_t i;
529
  switch (*z) {
2,147,483,647✔
530
    case ' ':
2,147,483,647✔
531
    case '\t':
532
    case '\n':
533
    case '\f':
534
    case '\r': {
535
      for (i = 1; isspace(z[i]); i++) {
2,147,483,647✔
536
      }
537
      *tokenId = TK_NK_SPACE;
2,147,483,647✔
538
      return i;
2,147,483,647✔
539
    }
540
    case ':': {
6,839✔
541
      *tokenId = TK_NK_COLON;
6,839✔
542
      return 1;
6,839✔
543
    }
544
    case '-': {
2,147,483,647✔
545
      if (z[1] == '-') {
2,147,483,647✔
546
        for (i = 2; z[i] && z[i] != '\n'; i++) {
469,144✔
547
        }
548
        *tokenId = TK_NK_COMMENT;
21,510✔
549
        return i;
21,510✔
550
      } else if (z[1] == '>') {
2,147,483,647✔
551
        *tokenId = TK_NK_ARROW;
169,611✔
552
        return 2;
169,611✔
553
      }
554
      *tokenId = TK_NK_MINUS;
2,147,483,647✔
555
      return 1;
2,147,483,647✔
556
    }
557
    case '(': {
2,147,483,647✔
558
      *tokenId = TK_NK_LP;
2,147,483,647✔
559
      return 1;
2,147,483,647✔
560
    }
561
    case ')': {
2,147,483,647✔
562
      *tokenId = TK_NK_RP;
2,147,483,647✔
563
      return 1;
2,147,483,647✔
564
    }
565
    case ';': {
281,713,834✔
566
      *tokenId = TK_NK_SEMI;
281,713,834✔
567
      return 1;
281,713,834✔
568
    }
569
    case '+': {
2,147,483,647✔
570
      *tokenId = TK_NK_PLUS;
2,147,483,647✔
571
      return 1;
2,147,483,647✔
572
    }
573
    case '*': {
85,207,801✔
574
      *tokenId = TK_NK_STAR;
85,207,801✔
575
      return 1;
85,207,779✔
576
    }
577
    case '/': {
14,902,095✔
578
      if (z[1] != '*' || z[2] == 0) {
14,902,095✔
579
        *tokenId = TK_NK_SLASH;
7,236,568✔
580
        return 1;
7,236,568✔
581
      }
582
      bool isHint = false;
7,665,527✔
583
      if (z[2] == '+') {
7,665,527✔
584
        isHint = true;
7,665,527✔
585
      }
586
      for (i = 3; z[i] && (z[i] != '/' || z[i - 1] != '*'); i++) {
168,539,022✔
587
      }
588
      if (z[i]) i++;
7,665,527✔
589
      *tokenId = isHint ? TK_NK_HINT : TK_NK_COMMENT;
7,665,527✔
590
      return i;
7,665,527✔
591
    }
592
    case '%': {
653,077✔
593
      if (z[1] == '%') {
653,077✔
594
        *tokenId = TK_NK_PH;
361,516✔
595
        return 2;
361,516✔
596
      } else {
597
        *tokenId = TK_NK_REM;
291,561✔
598
        return 1;
291,561✔
599
      }
600
      return 1;
601
    }
602
    case '=': {
83,441,595✔
603
      *tokenId = TK_NK_EQ;
83,441,595✔
604
      return 1 + (z[1] == '=');
83,441,595✔
605
    }
606
    case '<': {
21,934,327✔
607
      if (z[1] == '=') {
21,934,327✔
608
        *tokenId = TK_NK_LE;
13,044,972✔
609
        return 2;
13,044,972✔
610
      } else if (z[1] == '>') {
8,889,355✔
611
        *tokenId = TK_NK_NE;
1,138,578✔
612
        return 2;
1,138,578✔
613
      } else if (z[1] == '<') {
7,750,777✔
UNCOV
614
        *tokenId = TK_NK_LSHIFT;
×
615
        return 2;
×
616
      } else {
617
        *tokenId = TK_NK_LT;
7,750,777✔
618
        return 1;
7,750,777✔
619
      }
620
    }
621
    case '>': {
47,358,210✔
622
      if (z[1] == '=') {
47,358,210✔
623
        *tokenId = TK_NK_GE;
12,088,912✔
624
        return 2;
12,088,912✔
625
      } else if (z[1] == '>') {
35,269,298✔
UNCOV
626
        *tokenId = TK_NK_RSHIFT;
×
627
        return 2;
×
628
      } else {
629
        *tokenId = TK_NK_GT;
35,269,298✔
630
        return 1;
35,269,298✔
631
      }
632
    }
633
    case '!': {
5,116,371✔
634
      if (z[1] != '=') {
5,116,371✔
635
        *tokenId = TK_NK_ILLEGAL;
65,149✔
636
        return 2;
65,149✔
637
      } else {
638
        *tokenId = TK_NK_NE;
5,051,222✔
639
        return 2;
5,051,222✔
640
      }
641
    }
642
    case '|': {
181,937✔
643
      if (z[1] != '|') {
181,937✔
644
        *tokenId = TK_NK_BITOR;
179,665✔
645
        return 1;
179,665✔
646
      } else {
647
        *tokenId = TK_NK_CONCAT;
2,272✔
648
        return 2;
2,272✔
649
      }
650
    }
651
    case ',': {
2,147,483,647✔
652
      *tokenId = TK_NK_COMMA;
2,147,483,647✔
653
      return 1;
2,147,483,647✔
654
    }
655
    case '&': {
114,780✔
656
      *tokenId = TK_NK_BITAND;
114,780✔
657
      return 1;
114,780✔
658
    }
UNCOV
659
    case '~': {
×
660
      *tokenId = TK_NK_BITNOT;
×
661
      return 1;
×
662
    }
663
    case '?': {
25,510,310✔
664
      *tokenId = TK_NK_QUESTION;
25,510,310✔
665
      return 1;
25,509,350✔
666
    }
667
    case '`':
2,147,483,647✔
668
    case '\'':
669
    case '"': {
670
      int  delim = z[0];
2,147,483,647✔
671
      bool strEnd = false;
2,147,483,647✔
672
      for (i = 1; z[i]; i++) {
2,147,483,647✔
673
        if (delim != '`' && z[i] == '\\') {  // ignore the escaped character that follows this backslash
2,147,483,647✔
674
          i++;
3,965,518✔
675
          continue;
3,965,518✔
676
        }
677

678
        if (z[i] == delim) {
2,147,483,647✔
679
          if (z[i + 1] == delim) {
2,147,483,647✔
680
            if (dupQuoteChar && (*dupQuoteChar != *z)) {
480,371✔
681
              *dupQuoteChar = *z;
49,280✔
682
            }
683
            i++;
480,371✔
684
          } else {
685
            strEnd = true;
2,147,483,647✔
686
            break;
2,147,483,647✔
687
          }
688
        }
689
      }
690

691
      if (z[i]) i++;
2,147,483,647✔
692

693
      if (strEnd) {
2,147,483,647✔
694
        *tokenId = (delim == '`') ? TK_NK_ID : TK_NK_STRING;
2,147,483,647✔
695
        return i;
2,147,483,647✔
696
      }
697

698
      break;
8,561✔
699
    }
700
    case '.': {
479,001,237✔
701
      /*
702
       * handle the the float number with out integer part
703
       * .123
704
       * .123e4
705
       */
706
      if (isdigit(z[1])) {
479,001,237✔
707
        for (i = 2; isdigit(z[i]); i++) {
2,880,108✔
708
        }
709

710
        if ((z[i] == 'e' || z[i] == 'E') &&
2,875,868✔
UNCOV
711
            (isdigit(z[i + 1]) || ((z[i + 1] == '+' || z[i + 1] == '-') && isdigit(z[i + 2])))) {
×
712
          i += 2;
×
713
          while (isdigit(z[i])) {
×
714
            i++;
×
715
          }
716
        }
717

718
        *tokenId = TK_NK_FLOAT;
2,875,868✔
719
        return i;
2,875,868✔
720
      } else {
721
        *tokenId = TK_NK_DOT;
476,111,841✔
722
        return 1;
476,109,841✔
723
      }
724
    }
725

726
    case '0': {
2,147,483,647✔
727
      char next = z[1];
2,147,483,647✔
728

729
      if (next == 'b') {  // bin number
2,147,483,647✔
730
        *tokenId = TK_NK_BIN;
138,049✔
731
        for (i = 2; (z[i] == '0' || z[i] == '1'); ++i) {
478,904✔
732
        }
733

734
        if (i == 2) {
138,049✔
UNCOV
735
          break;
×
736
        }
737

738
        return i;
138,049✔
739
      } else if (next == 'x') {  // hex number
2,147,483,647✔
740
        *tokenId = TK_NK_HEX;
136,586✔
741
        for (i = 2; isxdigit(z[i]) != 0; ++i) {
399,049✔
742
        }
743

744
        if (i == 2) {
136,586✔
UNCOV
745
          break;
×
746
        }
747

748
        return i;
136,586✔
749
      }
750
    }
751
    case '1':
752
    case '2':
753
    case '3':
754
    case '4':
755
    case '5':
756
    case '6':
757
    case '7':
758
    case '8':
759
    case '9': {
760
      *tokenId = TK_NK_INTEGER;
2,147,483,647✔
761
      for (i = 1; isdigit(z[i]); i++) {
2,147,483,647✔
762
      }
763

764
      /* here is the 1u/1a/2s/3m/9y */
765
      if ((z[i] == 'b' || z[i] == 'u' || z[i] == 'a' || z[i] == 's' || z[i] == 'm' || z[i] == 'h' || z[i] == 'd' ||
2,147,483,647✔
766
           z[i] == 'n' || z[i] == 'y' || z[i] == 'w' || z[i] == 'B' || z[i] == 'U' || z[i] == 'A' || z[i] == 'S' ||
2,147,483,647✔
767
           z[i] == 'M' || z[i] == 'H' || z[i] == 'D' || z[i] == 'N' || z[i] == 'Y' || z[i] == 'W') &&
2,147,483,647✔
768
          (isIdChar[(uint8_t)z[i + 1]] == 0)) {
2,147,483,647✔
769
        *tokenId = TK_NK_VARIABLE;
2,147,483,647✔
770
        i += 1;
2,147,483,647✔
771
        return i;
2,147,483,647✔
772
      }
773

774
      int32_t seg = 1;
2,147,483,647✔
775
      while (z[i] == '.' && isdigit(z[i + 1])) {
2,147,483,647✔
776
        i += 2;
2,147,483,647✔
777
        while (isdigit(z[i])) {
2,147,483,647✔
778
          i++;
2,147,483,647✔
779
        }
780
        *tokenId = TK_NK_FLOAT;
2,147,483,647✔
781
        seg++;
2,147,483,647✔
782
      }
783

784
      if (seg == 4) {  // ip address
2,147,483,647✔
785
        *tokenId = TK_NK_IPTOKEN;
158✔
786
        return i;
158✔
787
      } else if (seg > 2) {
2,147,483,647✔
UNCOV
788
        break;
×
789
      }
790

791
      // support float with no decimal part after the decimal point
792
      if (z[i] == '.' && seg == 1) {
2,147,483,647✔
793
        *tokenId = TK_NK_FLOAT;
3,897,819✔
794
        i++;
3,897,819✔
795
      }
796
      if ((z[i] == 'e' || z[i] == 'E') &&
2,147,483,647✔
797
          (isdigit(z[i + 1]) || ((z[i + 1] == '+' || z[i + 1] == '-') && isdigit(z[i + 2])))) {
7,653✔
798
        i += 2;
35,756,974✔
799
        while (isdigit(z[i])) {
105,289,437✔
800
          i++;
69,532,463✔
801
        }
802
        *tokenId = TK_NK_FLOAT;
35,756,974✔
803
      }
804
      return i;
2,147,483,647✔
805
    }
806
    // case '[': {
807
    //   for (i = 1; z[i] && z[i - 1] != ']'; i++) {
808
    //   }
809
    //   *tokenId = TK_NK_ID;
810
    //   return i;
811
    // }
812
    case 'T':
2,147,483,647✔
813
    case 't':
814
    case 'F':
815
    case 'f': {
816
      bool hasNonAsciiChars = false;
2,147,483,647✔
817
      for (i = 1;; i++) {
2,147,483,647✔
818
        if ((z[i] & 0x80) != 0) {
2,147,483,647✔
819
          // utf-8 characters
820
          // currently, we support using utf-8 characters only in alias
UNCOV
821
          hasNonAsciiChars = true;
×
822
        } else if (isIdChar[(uint8_t)z[i]]) {
2,147,483,647✔
823
        } else {
824
          break;
2,147,483,647✔
825
        }
826
      }
827
      if (hasNonAsciiChars) {
2,147,483,647✔
UNCOV
828
        *tokenId = TK_NK_ALIAS;  // must be alias
×
829
        return i;
×
830
      }
831
      if (IS_TRUE_STR(z, i) || IS_FALSE_STR(z, i)) {
2,147,483,647✔
832
        *tokenId = TK_NK_BOOL;
2,147,483,647✔
833
        return i;
2,147,483,647✔
834
      }
835
      *tokenId = tKeywordCode(z, i);
2,147,483,647✔
836
      return i;
2,147,483,647✔
837
    }
838
    default: {
2,147,483,647✔
839
      if ((*z & 0x80) == 0 && !isIdChar[(uint8_t)*z]) {
2,147,483,647✔
840
        break;
315,066,200✔
841
      }
842
      bool hasNonAsciiChars = false;
2,147,483,647✔
843
      for (i = 1;; i++) {
2,147,483,647✔
844
        if ((z[i] & 0x80) != 0) {
2,147,483,647✔
845
          hasNonAsciiChars = true;
151,110✔
846
        } else if (isIdChar[(uint8_t)z[i]]) {
2,147,483,647✔
847
        } else {
848
          break;
2,147,483,647✔
849
        }
850
      }
851
      if (hasNonAsciiChars) {
2,147,483,647✔
852
        *tokenId = TK_NK_ALIAS;
26,456✔
853
        return i;
26,456✔
854
      }
855
      *tokenId = tKeywordCode(z, i);
2,147,483,647✔
856
      return i;
2,147,483,647✔
857
    }
858
  }
859

860
  *tokenId = TK_NK_ILLEGAL;
315,074,761✔
861
  return 0;
315,068,346✔
862
}
863

864
SToken tStrGetToken(const char* str, int32_t* i, bool isPrevOptr, bool* pIgnoreComma) {
2,147,483,647✔
865
  SToken t0 = {0};
2,147,483,647✔
866

867
  // here we reach the end of sql string, null-terminated string
868
  if (str[*i] == 0) {
2,147,483,647✔
869
    t0.n = 0;
641,502,979✔
870
    return t0;
641,502,979✔
871
  }
872

873
  // IGNORE TK_NK_SPACE, TK_NK_COMMA, and specified tokens
874
  while (1) {
875
    *i += t0.n;
2,147,483,647✔
876

877
    int32_t numOfComma = 0;
2,147,483,647✔
878
    char    t = str[*i];
2,147,483,647✔
879
    while (t == ' ' || t == '\n' || t == '\r' || t == '\t' || t == '\f' || t == '\b' || t == ',') {
2,147,483,647✔
880
      if (t == ',' && (++numOfComma > 1)) {  // comma only allowed once
2,147,483,647✔
881
        t0.n = 0;
632✔
882
        return t0;
632✔
883
      }
884

885
      if (NULL != pIgnoreComma && t == ',') {
2,147,483,647✔
886
        *pIgnoreComma = true;
64✔
887
      }
888

889
      t = str[++(*i)];
2,147,483,647✔
890
    }
891

892
    t0.n = tGetToken(&str[*i], &t0.type, NULL);
2,147,483,647✔
893
    break;
2,147,483,647✔
894

895
    // not support user specfied ignored symbol list
896
#if 0
897
    bool ignore = false;
898
    for (uint32_t k = 0; k < numOfIgnoreToken; k++) {
899
      if (t0.type == ignoreTokenTypes[k]) {
900
        ignore = true;
901
        break;
902
      }
903
    }
904

905
    if (!ignore) {
906
      break;
907
    }
908
#endif
909
  }
910

911
  if (t0.type == TK_NK_SEMI) {
2,147,483,647✔
912
    t0.n = 0;
187,786,505✔
913
    t0.type = 0;
187,786,505✔
914
    return t0;
187,786,505✔
915
  }
916

917
  uint32_t type = 0;
2,147,483,647✔
918
  int32_t  len;
919

920
  // support parse the 'db.tbl' format, notes: There should be no space on either side of the dot!
921
  if ('.' == str[*i + t0.n]) {
2,147,483,647✔
922
    len = tGetToken(&str[*i + t0.n + 1], &type, NULL);
774,193,143✔
923

924
    // only id、string and ? are valid
925
    if (((TK_NK_STRING != t0.type) && (TK_NK_ID != t0.type)) ||
774,185,212✔
926
        ((TK_NK_STRING != type) && (TK_NK_ID != type) && (TK_NK_QUESTION != type))) {
774,185,983✔
927
      t0.type = TK_NK_ILLEGAL;
4,217✔
928
      t0.n = 0;
4,217✔
929

930
      return t0;
4,217✔
931
    }
932

933
    // check the table name is '?', db.?asf is not valid.
934
    if (TK_NK_QUESTION == type) {
774,180,995✔
UNCOV
935
      (void)tGetToken(&str[*i + t0.n + 2], &type, NULL);
×
936
      if (TK_NK_SPACE != type) {
×
937
        t0.type = TK_NK_ILLEGAL;
×
938
        t0.n = 0;
×
939
        return t0;
×
940
      }
941
    }
942

943
    t0.n += len + 1;
774,173,318✔
944

945
  } else {
946
    // support parse the -/+number format
947
    if ((isPrevOptr) && (t0.type == TK_NK_MINUS || t0.type == TK_NK_PLUS)) {
2,147,483,647✔
948
      len = tGetToken(&str[*i + t0.n], &type, NULL);
2,147,483,647✔
949
      if (type == TK_NK_INTEGER || type == TK_NK_FLOAT || type == TK_NK_BIN || type == TK_NK_HEX) {
2,147,483,647✔
950
        t0.type = type;
2,147,483,647✔
951
        t0.n += len;
2,147,483,647✔
952
      }
953
    }
954
  }
955

956
  t0.z = (char*)str + (*i);
2,147,483,647✔
957
  *i += t0.n;
2,147,483,647✔
958

959
  return t0;
2,147,483,647✔
960
}
961

UNCOV
962
bool taosIsKeyWordToken(const char* z, int32_t len) { return (tKeywordCode((char*)z, len) != TK_NK_ID); }
×
963

964
int32_t taosInitKeywordsTable() { return doInitKeywordsTable(); }
1,473,726✔
965

966
void taosCleanupKeywordsTable() {
1,473,768✔
967
  void* m = keywordHashTable;
1,473,768✔
968
  if (m != NULL && atomic_val_compare_exchange_ptr(&keywordHashTable, m, 0) == m) {
1,473,768✔
969
    taosHashCleanup(m);
1,473,726✔
970
  }
971
}
1,473,768✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc