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

taosdata / TDengine / #4988

16 Mar 2026 12:26PM UTC coverage: 75.821% (+1.9%) from 73.883%
#4988

push

travis-ci

web-flow
feat: support secure delete option. (#34591)

274 of 464 new or added lines in 29 files covered. (59.05%)

4404 existing lines in 23 files now uncovered.

337108 of 444611 relevant lines covered (75.82%)

146708292.94 hits per line

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

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

487
static const char isIdChar[] = {
488
    /* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */
489
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */
490
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */
491
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */
492
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */
493
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */
494
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */
495
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */
496
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */
497
};
498

499
static void* keywordHashTable = NULL;
500

501
static int32_t doInitKeywordsTable(void) {
2,723,740✔
502
  int numOfEntries = tListLen(keywordTable);
2,723,740✔
503

504
  keywordHashTable = taosHashInit(numOfEntries, MurmurHash3_32, true, false);
2,723,740✔
505
  for (int32_t i = 0; i < numOfEntries; i++) {
1,233,854,220✔
506
    keywordTable[i].len = (uint8_t)strlen(keywordTable[i].name);
1,231,130,480✔
507
    void*   ptr = &keywordTable[i];
1,231,130,480✔
508
    int32_t code = taosHashPut(keywordHashTable, keywordTable[i].name, keywordTable[i].len, (void*)&ptr, POINTER_BYTES);
1,231,130,480✔
509
    if (TSDB_CODE_SUCCESS != code) {
1,231,130,480✔
UNCOV
510
      taosHashCleanup(keywordHashTable);
×
511
      return code;
×
512
    }
513
  }
514
  return TSDB_CODE_SUCCESS;
2,723,740✔
515
}
516

517
static int32_t tKeywordCode(const char* z, int n) {
2,147,483,647✔
518
  char key[512] = {0};
2,147,483,647✔
519
  if (n > tListLen(key)) {  // too long token, can not be any other token type
2,147,483,647✔
UNCOV
520
    return TK_NK_ID;
×
521
  }
522

523
  for (int32_t j = 0; j < n; ++j) {
2,147,483,647✔
524
    if (z[j] >= 'a' && z[j] <= 'z') {
2,147,483,647✔
525
      key[j] = (char)(z[j] & 0xDF);  // to uppercase and set the null-terminated
2,147,483,647✔
526
    } else {
527
      key[j] = z[j];
2,147,483,647✔
528
    }
529
  }
530

531
  if (keywordHashTable == NULL) {
2,147,483,647✔
UNCOV
532
    return TK_NK_ILLEGAL;
×
533
  }
534

535
  SKeyword** pKey = (SKeyword**)taosHashGet(keywordHashTable, key, n);
2,147,483,647✔
536
  return (pKey != NULL) ? (*pKey)->type : TK_NK_ID;
2,147,483,647✔
537
}
538

539
/*
540
 * Return the length of the token that begins at z[0].
541
 * Store the token type in *type before returning.
542
 */
543
uint32_t tGetToken(const char* z, uint32_t* tokenId, char *dupQuoteChar) {
2,147,483,647✔
544
  uint32_t i;
545
  switch (*z) {
2,147,483,647✔
546
    case ' ':
2,147,483,647✔
547
    case '\t':
548
    case '\n':
549
    case '\f':
550
    case '\r': {
551
      for (i = 1; isspace(z[i]); i++) {
2,147,483,647✔
552
      }
553
      *tokenId = TK_NK_SPACE;
2,147,483,647✔
554
      return i;
2,147,483,647✔
555
    }
556
    case ':': {
30,756✔
557
      *tokenId = TK_NK_COLON;
30,756✔
558
      return 1;
30,756✔
559
    }
560
    case '-': {
2,147,483,647✔
561
      if (z[1] == '-') {
2,147,483,647✔
562
        for (i = 2; z[i] && z[i] != '\n'; i++) {
1,024,798✔
563
        }
564
        *tokenId = TK_NK_COMMENT;
46,956✔
565
        return i;
46,956✔
566
      } else if (z[1] == '>') {
2,147,483,647✔
567
        *tokenId = TK_NK_ARROW;
9,449,014✔
568
        return 2;
9,449,014✔
569
      }
570
      *tokenId = TK_NK_MINUS;
2,147,483,647✔
571
      return 1;
2,147,483,647✔
572
    }
573
    case '(': {
2,147,483,647✔
574
      *tokenId = TK_NK_LP;
2,147,483,647✔
575
      return 1;
2,147,483,647✔
576
    }
577
    case ')': {
2,147,483,647✔
578
      *tokenId = TK_NK_RP;
2,147,483,647✔
579
      return 1;
2,147,483,647✔
580
    }
581
    case ';': {
867,166,326✔
582
      *tokenId = TK_NK_SEMI;
867,166,326✔
583
      return 1;
867,166,326✔
584
    }
585
    case '+': {
2,147,483,647✔
586
      *tokenId = TK_NK_PLUS;
2,147,483,647✔
587
      return 1;
2,147,483,647✔
588
    }
589
    case '*': {
206,541,126✔
590
      *tokenId = TK_NK_STAR;
206,541,126✔
591
      return 1;
206,541,198✔
592
    }
593
    case '/': {
36,068,794✔
594
      if (z[1] != '*' || z[2] == 0) {
36,068,794✔
595
        *tokenId = TK_NK_SLASH;
18,990,166✔
596
        return 1;
18,990,166✔
597
      }
598
      bool isHint = false;
17,078,628✔
599
      if (z[2] == '+') {
17,078,628✔
600
        isHint = true;
17,078,628✔
601
      }
602
      for (i = 3; z[i] && (z[i] != '/' || z[i - 1] != '*'); i++) {
375,505,870✔
603
      }
604
      if (z[i]) i++;
17,078,628✔
605
      *tokenId = isHint ? TK_NK_HINT : TK_NK_COMMENT;
17,078,628✔
606
      return i;
17,078,628✔
607
    }
608
    case '%': {
1,549,832✔
609
      if (z[1] == '%') {
1,549,832✔
610
        *tokenId = TK_NK_PH;
918,280✔
611
        return 2;
918,280✔
612
      } else {
613
        *tokenId = TK_NK_REM;
631,552✔
614
        return 1;
631,552✔
615
      }
616
      return 1;
617
    }
618
    case '=': {
259,446,246✔
619
      *tokenId = TK_NK_EQ;
259,446,246✔
620
      return 1 + (z[1] == '=');
259,446,246✔
621
    }
622
    case '<': {
89,524,546✔
623
      if (z[1] == '=') {
89,524,546✔
624
        *tokenId = TK_NK_LE;
44,421,438✔
625
        return 2;
44,421,438✔
626
      } else if (z[1] == '>') {
45,103,108✔
627
        *tokenId = TK_NK_NE;
2,667,454✔
628
        return 2;
2,667,454✔
629
      } else if (z[1] == '<') {
42,435,654✔
UNCOV
630
        *tokenId = TK_NK_LSHIFT;
×
631
        return 2;
×
632
      } else {
633
        *tokenId = TK_NK_LT;
42,435,654✔
634
        return 1;
42,435,654✔
635
      }
636
    }
637
    case '>': {
166,945,438✔
638
      if (z[1] == '=') {
166,945,438✔
639
        *tokenId = TK_NK_GE;
45,344,006✔
640
        return 2;
45,344,006✔
641
      } else if (z[1] == '>') {
121,601,432✔
UNCOV
642
        *tokenId = TK_NK_RSHIFT;
×
643
        return 2;
×
644
      } else {
645
        *tokenId = TK_NK_GT;
121,601,432✔
646
        return 1;
121,601,432✔
647
      }
648
    }
649
    case '!': {
34,425,934✔
650
      if (z[1] != '=') {
34,425,934✔
651
        *tokenId = TK_NK_ILLEGAL;
148,132✔
652
        return 2;
148,132✔
653
      } else {
654
        *tokenId = TK_NK_NE;
34,277,802✔
655
        return 2;
34,277,802✔
656
      }
657
    }
658
    case '|': {
416,836✔
659
      if (z[1] != '|') {
416,836✔
660
        *tokenId = TK_NK_BITOR;
411,964✔
661
        return 1;
411,964✔
662
      } else {
663
        *tokenId = TK_NK_CONCAT;
4,872✔
664
        return 2;
4,872✔
665
      }
666
    }
667
    case ',': {
2,147,483,647✔
668
      *tokenId = TK_NK_COMMA;
2,147,483,647✔
669
      return 1;
2,147,483,647✔
670
    }
671
    case '&': {
248,996✔
672
      *tokenId = TK_NK_BITAND;
248,996✔
673
      return 1;
248,996✔
674
    }
675
    case '~': {
742✔
676
      *tokenId = TK_NK_BITNOT;
742✔
677
      return 1;
742✔
678
    }
679
    case '?': {
110,226,130✔
680
      *tokenId = TK_NK_QUESTION;
110,226,130✔
681
      return 1;
110,227,978✔
682
    }
683
    case '`':
2,147,483,647✔
684
    case '\'':
685
    case '"': {
686
      int  delim = z[0];
2,147,483,647✔
687
      bool strEnd = false;
2,147,483,647✔
688
      for (i = 1; z[i]; i++) {
2,147,483,647✔
689
        if (delim != '`' && z[i] == '\\') {  // ignore the escaped character that follows this backslash
2,147,483,647✔
690
          i++;
8,659,512✔
691
          continue;
8,659,512✔
692
        }
693

694
        if (z[i] == delim) {
2,147,483,647✔
695
          if (z[i + 1] == delim) {
2,147,483,647✔
696
            if (dupQuoteChar && (*dupQuoteChar != *z)) {
1,033,640✔
697
              *dupQuoteChar = *z;
106,364✔
698
            }
699
            i++;
1,033,640✔
700
          } else {
701
            strEnd = true;
2,147,483,647✔
702
            break;
2,147,483,647✔
703
          }
704
        }
705
      }
706

707
      if (z[i]) i++;
2,147,483,647✔
708

709
      if (strEnd) {
2,147,483,647✔
710
        *tokenId = (delim == '`') ? TK_NK_ID : TK_NK_STRING;
2,147,483,647✔
711
        return i;
2,147,483,647✔
712
      }
713

714
      break;
22,184✔
715
    }
716
    case '.': {
1,163,070,196✔
717
      /*
718
       * handle the the float number with out integer part
719
       * .123
720
       * .123e4
721
       */
722
      if (isdigit(z[1])) {
1,163,070,196✔
723
        for (i = 2; isdigit(z[i]); i++) {
4,737,094✔
724
        }
725

726
        if ((z[i] == 'e' || z[i] == 'E') &&
4,728,054✔
UNCOV
727
            (isdigit(z[i + 1]) || ((z[i + 1] == '+' || z[i + 1] == '-') && isdigit(z[i + 2])))) {
×
728
          i += 2;
×
729
          while (isdigit(z[i])) {
×
730
            i++;
×
731
          }
732
        }
733

734
        *tokenId = TK_NK_FLOAT;
4,728,054✔
735
        return i;
4,728,054✔
736
      } else {
737
        *tokenId = TK_NK_DOT;
1,158,302,686✔
738
        return 1;
1,158,299,472✔
739
      }
740
    }
741

742
    case '0': {
2,147,483,647✔
743
      char next = z[1];
2,147,483,647✔
744

745
      if (next == 'b') {  // bin number
2,147,483,647✔
746
        *tokenId = TK_NK_BIN;
294,904✔
747
        for (i = 2; (z[i] == '0' || z[i] == '1'); ++i) {
1,025,624✔
748
        }
749

750
        if (i == 2) {
294,904✔
UNCOV
751
          break;
×
752
        }
753

754
        return i;
294,904✔
755
      } else if (next == 'x') {  // hex number
2,147,483,647✔
756
        *tokenId = TK_NK_HEX;
291,836✔
757
        for (i = 2; isxdigit(z[i]) != 0; ++i) {
852,544✔
758
        }
759

760
        if (i == 2) {
291,836✔
UNCOV
761
          break;
×
762
        }
763

764
        return i;
291,836✔
765
      }
766
    }
767
    case '1':
768
    case '2':
769
    case '3':
770
    case '4':
771
    case '5':
772
    case '6':
773
    case '7':
774
    case '8':
775
    case '9': {
776
      *tokenId = TK_NK_INTEGER;
2,147,483,647✔
777
      for (i = 1; isdigit(z[i]); i++) {
2,147,483,647✔
778
      }
779

780
      /* here is the 1u/1a/2s/3m/9y */
781
      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✔
782
           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✔
783
           z[i] == 'M' || z[i] == 'H' || z[i] == 'D' || z[i] == 'N' || z[i] == 'Y' || z[i] == 'W') &&
2,147,483,647✔
784
          (isIdChar[(uint8_t)z[i + 1]] == 0)) {
2,147,483,647✔
785
        *tokenId = TK_NK_VARIABLE;
2,147,483,647✔
786
        i += 1;
2,147,483,647✔
787
        return i;
2,147,483,647✔
788
      }
789

790
      int32_t seg = 1;
2,147,483,647✔
791
      while (z[i] == '.' && isdigit(z[i + 1])) {
2,147,483,647✔
792
        i += 2;
2,147,483,647✔
793
        while (isdigit(z[i])) {
2,147,483,647✔
794
          i++;
2,147,483,647✔
795
        }
796
        *tokenId = TK_NK_FLOAT;
2,147,483,647✔
797
        seg++;
2,147,483,647✔
798
      }
799

800
      if (seg == 4) {  // ip address
2,147,483,647✔
801
        *tokenId = TK_NK_IPTOKEN;
5,134✔
802
        return i;
5,134✔
803
      } else if (seg > 2) {
2,147,483,647✔
UNCOV
804
        break;
×
805
      }
806

807
      // support float with no decimal part after the decimal point
808
      if (z[i] == '.' && seg == 1) {
2,147,483,647✔
809
        *tokenId = TK_NK_FLOAT;
6,615,828✔
810
        i++;
6,615,828✔
811
      }
812
      if ((z[i] == 'e' || z[i] == 'E') &&
2,147,483,647✔
813
          (isdigit(z[i + 1]) || ((z[i + 1] == '+' || z[i + 1] == '-') && isdigit(z[i + 2])))) {
26,654✔
814
        i += 2;
78,886,836✔
815
        while (isdigit(z[i])) {
232,098,568✔
816
          i++;
153,211,732✔
817
        }
818
        *tokenId = TK_NK_FLOAT;
78,886,836✔
819
      }
820
      return i;
2,147,483,647✔
821
    }
822
    // case '[': {
823
    //   for (i = 1; z[i] && z[i - 1] != ']'; i++) {
824
    //   }
825
    //   *tokenId = TK_NK_ID;
826
    //   return i;
827
    // }
828
    case 'T':
2,147,483,647✔
829
    case 't':
830
    case 'F':
831
    case 'f': {
832
      bool hasNonAsciiChars = false;
2,147,483,647✔
833
      for (i = 1;; i++) {
2,147,483,647✔
834
        if ((z[i] & 0x80) != 0) {
2,147,483,647✔
835
          // utf-8 characters
836
          // currently, we support using utf-8 characters only in alias
UNCOV
837
          hasNonAsciiChars = true;
×
838
        } else if (isIdChar[(uint8_t)z[i]]) {
2,147,483,647✔
839
        } else {
840
          break;
2,147,483,647✔
841
        }
842
      }
843
      if (hasNonAsciiChars) {
2,147,483,647✔
UNCOV
844
        *tokenId = TK_NK_ALIAS;  // must be alias
×
845
        return i;
×
846
      }
847
      if (IS_TRUE_STR(z, i) || IS_FALSE_STR(z, i)) {
2,147,483,647✔
848
        *tokenId = TK_NK_BOOL;
2,147,483,647✔
849
        return i;
2,147,483,647✔
850
      }
851
      *tokenId = tKeywordCode(z, i);
2,147,483,647✔
852
      return i;
2,147,483,647✔
853
    }
854
    default: {
2,147,483,647✔
855
      if ((*z & 0x80) == 0 && !isIdChar[(uint8_t)*z]) {
2,147,483,647✔
856
        break;
702,787,750✔
857
      }
858
      bool hasNonAsciiChars = false;
2,147,483,647✔
859
      for (i = 1;; i++) {
2,147,483,647✔
860
        if ((z[i] & 0x80) != 0) {
2,147,483,647✔
861
          hasNonAsciiChars = true;
324,452✔
862
        } else if (isIdChar[(uint8_t)z[i]]) {
2,147,483,647✔
863
        } else {
864
          break;
2,147,483,647✔
865
        }
866
      }
867
      if (hasNonAsciiChars) {
2,147,483,647✔
868
        *tokenId = TK_NK_ALIAS;
56,626✔
869
        return i;
56,626✔
870
      }
871
      *tokenId = tKeywordCode(z, i);
2,147,483,647✔
872
      return i;
2,147,483,647✔
873
    }
874
  }
875

876
  *tokenId = TK_NK_ILLEGAL;
702,681,308✔
877
  return 0;
702,659,752✔
878
}
879

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

883
  // here we reach the end of sql string, null-terminated string
884
  if (str[*i] == 0) {
2,147,483,647✔
885
    t0.n = 0;
1,306,772,554✔
886
    return t0;
1,306,772,554✔
887
  }
888

889
  // IGNORE TK_NK_SPACE, TK_NK_COMMA, and specified tokens
890
  while (1) {
891
    *i += t0.n;
2,147,483,647✔
892

893
    int32_t numOfComma = 0;
2,147,483,647✔
894
    char    t = str[*i];
2,147,483,647✔
895
    while (t == ' ' || t == '\n' || t == '\r' || t == '\t' || t == '\f' || t == '\b' || t == ',') {
2,147,483,647✔
896
      if (t == ',' && (++numOfComma > 1)) {  // comma only allowed once
2,147,483,647✔
897
        t0.n = 0;
1,362✔
898
        return t0;
1,362✔
899
      }
900

901
      if (NULL != pIgnoreComma && t == ',') {
2,147,483,647✔
902
        *pIgnoreComma = true;
186✔
903
      }
904

905
      t = str[++(*i)];
2,147,483,647✔
906
    }
907

908
    t0.n = tGetToken(&str[*i], &t0.type, NULL);
2,147,483,647✔
909
    break;
2,147,483,647✔
910

911
    // not support user specfied ignored symbol list
912
#if 0
913
    bool ignore = false;
914
    for (uint32_t k = 0; k < numOfIgnoreToken; k++) {
915
      if (t0.type == ignoreTokenTypes[k]) {
916
        ignore = true;
917
        break;
918
      }
919
    }
920

921
    if (!ignore) {
922
      break;
923
    }
924
#endif
925
  }
926

927
  if (t0.type == TK_NK_SEMI) {
2,147,483,647✔
928
    t0.n = 0;
352,795,702✔
929
    t0.type = 0;
352,795,702✔
930
    return t0;
352,795,702✔
931
  }
932

933
  uint32_t type = 0;
2,147,483,647✔
934
  int32_t  len;
935

936
  // support parse the 'db.tbl' format, notes: There should be no space on either side of the dot!
937
  if ('.' == str[*i + t0.n]) {
2,147,483,647✔
938
    len = tGetToken(&str[*i + t0.n + 1], &type, NULL);
1,772,683,062✔
939

940
    // only id、string and ? are valid
941
    if (((TK_NK_STRING != t0.type) && (TK_NK_ID != t0.type)) ||
1,772,676,188✔
942
        ((TK_NK_STRING != type) && (TK_NK_ID != type) && (TK_NK_QUESTION != type))) {
1,772,677,252✔
943
      t0.type = TK_NK_ILLEGAL;
9,240✔
944
      t0.n = 0;
9,240✔
945

946
      return t0;
9,240✔
947
    }
948

949
    // check the table name is '?', db.?asf is not valid.
950
    if (TK_NK_QUESTION == type) {
1,772,666,948✔
951
      (void)tGetToken(&str[*i + t0.n + 2], &type, NULL);
61,248✔
952
      if (TK_NK_SPACE != type) {
61,248✔
UNCOV
953
        t0.type = TK_NK_ILLEGAL;
×
954
        t0.n = 0;
×
955
        return t0;
×
956
      }
957
    }
958

959
    t0.n += len + 1;
1,772,641,390✔
960

961
  } else {
962
    // support parse the -/+number format
963
    if ((isPrevOptr) && (t0.type == TK_NK_MINUS || t0.type == TK_NK_PLUS)) {
2,147,483,647✔
964
      len = tGetToken(&str[*i + t0.n], &type, NULL);
2,147,483,647✔
965
      if (type == TK_NK_INTEGER || type == TK_NK_FLOAT || type == TK_NK_BIN || type == TK_NK_HEX) {
2,147,483,647✔
966
        t0.type = type;
2,147,483,647✔
967
        t0.n += len;
2,147,483,647✔
968
      }
969
    }
970
  }
971

972
  t0.z = (char*)str + (*i);
2,147,483,647✔
973
  *i += t0.n;
2,147,483,647✔
974

975
  return t0;
2,147,483,647✔
976
}
977

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

980
int32_t taosInitKeywordsTable() { return doInitKeywordsTable(); }
2,723,740✔
981

982
void taosCleanupKeywordsTable() {
2,679,596✔
983
  void* m = keywordHashTable;
2,679,596✔
984
  if (m != NULL && atomic_val_compare_exchange_ptr(&keywordHashTable, m, 0) == m) {
2,679,596✔
985
    taosHashCleanup(m);
2,679,508✔
986
  }
987
}
2,679,596✔
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