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

taosdata / TDengine / #5034

24 Apr 2026 11:25AM UTC coverage: 73.058%. Remained the same
#5034

push

travis-ci

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

merge: from main to 3.0 branch[manual-only]

1336 of 1975 new or added lines in 48 files covered. (67.65%)

14149 existing lines in 164 files now uncovered.

275896 of 377640 relevant lines covered (73.06%)

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

499
static const char isIdChar[] = {
500
    /* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */
501
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */
502
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */
503
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */
504
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */
505
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */
506
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */
507
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */
508
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */
509
};
510

511
static void* keywordHashTable = NULL;
512

513
static int32_t doInitKeywordsTable(void) {
1,622,399✔
514
  int numOfEntries = tListLen(keywordTable);
1,622,399✔
515

516
  keywordHashTable = taosHashInit(numOfEntries, MurmurHash3_32, true, false);
1,622,399✔
517
  for (int32_t i = 0; i < numOfEntries; i++) {
754,415,535✔
518
    keywordTable[i].len = (uint8_t)strlen(keywordTable[i].name);
752,793,136✔
519
    void*   ptr = &keywordTable[i];
752,793,136✔
520
    int32_t code = taosHashPut(keywordHashTable, keywordTable[i].name, keywordTable[i].len, (void*)&ptr, POINTER_BYTES);
752,793,136✔
521
    if (TSDB_CODE_SUCCESS != code) {
752,793,136✔
UNCOV
522
      taosHashCleanup(keywordHashTable);
×
UNCOV
523
      return code;
×
524
    }
525
  }
526
  return TSDB_CODE_SUCCESS;
1,622,399✔
527
}
528

529
static int32_t tKeywordCode(const char* z, int n) {
2,147,483,647✔
530
  char key[512] = {0};
2,147,483,647✔
531
  if (n > tListLen(key)) {  // too long token, can not be any other token type
2,147,483,647✔
UNCOV
532
    return TK_NK_ID;
×
533
  }
534

535
  for (int32_t j = 0; j < n; ++j) {
2,147,483,647✔
536
    if (z[j] >= 'a' && z[j] <= 'z') {
2,147,483,647✔
537
      key[j] = (char)(z[j] & 0xDF);  // to uppercase and set the null-terminated
2,147,483,647✔
538
    } else {
539
      key[j] = z[j];
2,147,483,647✔
540
    }
541
  }
542

543
  if (keywordHashTable == NULL) {
2,147,483,647✔
UNCOV
544
    return TK_NK_ILLEGAL;
×
545
  }
546

547
  SKeyword** pKey = (SKeyword**)taosHashGet(keywordHashTable, key, n);
2,147,483,647✔
548
  return (pKey != NULL) ? (*pKey)->type : TK_NK_ID;
2,147,483,647✔
549
}
550

551
/*
552
 * Return the length of the token that begins at z[0].
553
 * Store the token type in *type before returning.
554
 */
555
uint32_t tGetToken(const char* z, uint32_t* tokenId, char* dupQuoteChar) {
2,147,483,647✔
556
  uint32_t i;
557
  switch (*z) {
2,147,483,647✔
558
    case ' ':
2,147,483,647✔
559
    case '\t':
560
    case '\n':
561
    case '\f':
562
    case '\r': {
563
      for (i = 1; isspace(z[i]); i++) {
2,147,483,647✔
564
      }
565
      *tokenId = TK_NK_SPACE;
2,147,483,647✔
566
      return i;
2,147,483,647✔
567
    }
568
    case ':': {
24,029✔
569
      *tokenId = TK_NK_COLON;
24,029✔
570
      return 1;
24,029✔
571
    }
572
    case '-': {
2,147,483,647✔
573
      if (z[1] == '-') {
2,147,483,647✔
574
        for (i = 2; z[i] && z[i] != '\n'; i++) {
551,791✔
575
        }
576
        *tokenId = TK_NK_COMMENT;
25,268✔
577
        return i;
25,268✔
578
      } else if (z[1] == '>') {
2,147,483,647✔
579
        *tokenId = TK_NK_ARROW;
5,287,077✔
580
        return 2;
5,287,077✔
581
      }
582
      *tokenId = TK_NK_MINUS;
2,147,483,647✔
583
      return 1;
2,147,483,647✔
584
    }
585
    case '(': {
2,147,483,647✔
586
      *tokenId = TK_NK_LP;
2,147,483,647✔
587
      return 1;
2,147,483,647✔
588
    }
589
    case ')': {
2,147,483,647✔
590
      *tokenId = TK_NK_RP;
2,147,483,647✔
591
      return 1;
2,147,483,647✔
592
    }
593
    case ';': {
490,575,097✔
594
      *tokenId = TK_NK_SEMI;
490,575,097✔
595
      return 1;
490,575,097✔
596
    }
597
    case '+': {
2,147,483,647✔
598
      *tokenId = TK_NK_PLUS;
2,147,483,647✔
599
      return 1;
2,147,483,647✔
600
    }
601
    case '*': {
116,718,298✔
602
      *tokenId = TK_NK_STAR;
116,718,298✔
603
      return 1;
116,718,360✔
604
    }
605
    case '/': {
22,177,383✔
606
      if (z[1] != '*' || z[2] == 0) {
22,177,383✔
607
        *tokenId = TK_NK_SLASH;
12,908,024✔
608
        return 1;
12,908,024✔
609
      }
610
      bool isHint = false;
9,269,359✔
611
      if (z[2] == '+') {
9,269,359✔
612
        isHint = true;
9,269,359✔
613
      }
614
      for (i = 3; z[i] && (z[i] != '/' || z[i - 1] != '*'); i++) {
203,796,488✔
615
      }
616
      if (z[i]) i++;
9,269,359✔
617
      *tokenId = isHint ? TK_NK_HINT : TK_NK_COMMENT;
9,269,359✔
618
      return i;
9,269,359✔
619
    }
620
    case '%': {
906,867✔
621
      if (z[1] == '%') {
906,867✔
622
        *tokenId = TK_NK_PH;
558,950✔
623
        return 2;
558,950✔
624
      } else {
625
        *tokenId = TK_NK_REM;
347,917✔
626
        return 1;
347,917✔
627
      }
628
      return 1;
629
    }
630
    case '=': {
147,870,813✔
631
      *tokenId = TK_NK_EQ;
147,870,813✔
632
      return 1 + (z[1] == '=');
147,870,813✔
633
    }
634
    case '<': {
50,229,769✔
635
      if (z[1] == '=') {
50,229,769✔
636
        *tokenId = TK_NK_LE;
24,868,830✔
637
        return 2;
24,868,792✔
638
      } else if (z[1] == '>') {
25,360,977✔
639
        *tokenId = TK_NK_NE;
1,435,479✔
640
        return 2;
1,435,479✔
641
      } else if (z[1] == '<') {
23,925,498✔
UNCOV
642
        *tokenId = TK_NK_LSHIFT;
×
UNCOV
643
        return 2;
×
644
      } else {
645
        *tokenId = TK_NK_LT;
23,925,498✔
646
        return 1;
23,925,498✔
647
      }
648
    }
649
    case '>': {
96,664,213✔
650
      if (z[1] == '=') {
96,664,213✔
651
        *tokenId = TK_NK_GE;
25,680,547✔
652
        return 2;
25,680,547✔
653
      } else if (z[1] == '>') {
70,983,666✔
UNCOV
654
        *tokenId = TK_NK_RSHIFT;
×
UNCOV
655
        return 2;
×
656
      } else {
657
        *tokenId = TK_NK_GT;
70,983,666✔
658
        return 1;
70,983,666✔
659
      }
660
    }
661
    case '!': {
19,365,867✔
662
      if (z[1] != '=') {
19,365,867✔
663
        *tokenId = TK_NK_ILLEGAL;
80,940✔
664
        return 2;
80,940✔
665
      } else {
666
        *tokenId = TK_NK_NE;
19,284,927✔
667
        return 2;
19,284,927✔
668
      }
669
    }
670
    case '|': {
366,134✔
671
      if (z[1] != '|') {
366,134✔
672
        *tokenId = TK_NK_BITOR;
363,566✔
673
        return 1;
363,566✔
674
      } else {
675
        *tokenId = TK_NK_CONCAT;
2,568✔
676
        return 2;
2,568✔
677
      }
678
    }
679
    case ',': {
2,147,483,647✔
680
      *tokenId = TK_NK_COMMA;
2,147,483,647✔
681
      return 1;
2,147,483,647✔
682
    }
683
    case '&': {
135,340✔
684
      *tokenId = TK_NK_BITAND;
135,340✔
685
      return 1;
135,340✔
686
    }
687
    case '~': {
407✔
688
      *tokenId = TK_NK_BITNOT;
407✔
689
      return 1;
407✔
690
    }
691
    case '?': {
59,272,480✔
692
      *tokenId = TK_NK_QUESTION;
59,272,480✔
693
      return 1;
59,266,673✔
694
    }
695
    case '`':
2,147,483,647✔
696
    case '\'':
697
    case '"': {
698
      int  delim = z[0];
2,147,483,647✔
699
      bool strEnd = false;
2,147,483,647✔
700
      for (i = 1; z[i]; i++) {
2,147,483,647✔
701
        if (delim != '`' && z[i] == '\\') {  // ignore the escaped character that follows this backslash
2,147,483,647✔
702
          i++;
4,642,912✔
703
          continue;
4,642,912✔
704
        }
705

706
        if (z[i] == delim) {
2,147,483,647✔
707
          if (z[i + 1] == delim) {
2,147,483,647✔
708
            if (dupQuoteChar && (*dupQuoteChar != *z)) {
546,343✔
709
              *dupQuoteChar = *z;
56,246✔
710
            }
711
            i++;
546,343✔
712
          } else {
713
            strEnd = true;
2,147,483,647✔
714
            break;
2,147,483,647✔
715
          }
716
        }
717
      }
718

719
      if (z[i]) i++;
2,147,483,647✔
720

721
      if (strEnd) {
2,147,483,647✔
722
        *tokenId = (delim == '`') ? TK_NK_ID : TK_NK_STRING;
2,147,483,647✔
723
        return i;
2,147,483,647✔
724
      }
725

726
      break;
11,963✔
727
    }
728
    case '.': {
641,506,579✔
729
      /*
730
       * handle the the float number with out integer part
731
       * .123
732
       * .123e4
733
       */
734
      if (isdigit(z[1])) {
641,506,579✔
735
        for (i = 2; isdigit(z[i]); i++) {
2,603,941✔
736
        }
737

738
        if ((z[i] == 'e' || z[i] == 'E') &&
2,599,133✔
UNCOV
739
            (isdigit(z[i + 1]) || ((z[i + 1] == '+' || z[i + 1] == '-') && isdigit(z[i + 2])))) {
×
UNCOV
740
          i += 2;
×
741
          while (isdigit(z[i])) {
×
742
            i++;
×
743
          }
744
        }
745

746
        *tokenId = TK_NK_FLOAT;
2,599,133✔
747
        return i;
2,599,133✔
748
      } else {
749
        *tokenId = TK_NK_DOT;
638,902,630✔
750
        return 1;
638,902,412✔
751
      }
752
    }
753

754
    case '0': {
2,147,483,647✔
755
      char next = z[1];
2,147,483,647✔
756

757
      if (next == 'b') {  // bin number
2,147,483,647✔
758
        *tokenId = TK_NK_BIN;
154,666✔
759
        for (i = 2; (z[i] == '0' || z[i] == '1'); ++i) {
538,322✔
760
        }
761

762
        if (i == 2) {
154,666✔
UNCOV
763
          break;
×
764
        }
765

766
        return i;
154,666✔
767
      } else if (next == 'x') {  // hex number
2,147,483,647✔
768
        *tokenId = TK_NK_HEX;
153,076✔
769
        for (i = 2; isxdigit(z[i]) != 0; ++i) {
447,120✔
770
        }
771

772
        if (i == 2) {
153,076✔
UNCOV
773
          break;
×
774
        }
775

776
        return i;
153,076✔
777
      }
778
    }
779
    case '1':
780
    case '2':
781
    case '3':
782
    case '4':
783
    case '5':
784
    case '6':
785
    case '7':
786
    case '8':
787
    case '9': {
788
      *tokenId = TK_NK_INTEGER;
2,147,483,647✔
789
      for (i = 1; isdigit(z[i]); i++) {
2,147,483,647✔
790
      }
791

792
      /* here is the 1u/1a/2s/3m/9y */
793
      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✔
794
           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✔
795
           z[i] == 'M' || z[i] == 'H' || z[i] == 'D' || z[i] == 'N' || z[i] == 'Y' || z[i] == 'W') &&
2,147,483,647✔
796
          (isIdChar[(uint8_t)z[i + 1]] == 0)) {
2,147,483,647✔
797
        *tokenId = TK_NK_VARIABLE;
2,147,483,647✔
798
        i += 1;
2,147,483,647✔
799
        return i;
2,147,483,647✔
800
      }
801

802
      int32_t seg = 1;
2,147,483,647✔
803
      while (z[i] == '.' && isdigit(z[i + 1])) {
2,147,483,647✔
804
        i += 2;
2,147,483,647✔
805
        while (isdigit(z[i])) {
2,147,483,647✔
806
          i++;
2,147,483,647✔
807
        }
808
        *tokenId = TK_NK_FLOAT;
2,147,483,647✔
809
        seg++;
2,147,483,647✔
810
      }
811

812
      if (seg == 4) {  // ip address
2,147,483,647✔
813
        *tokenId = TK_NK_IPTOKEN;
3,798✔
814
        return i;
3,798✔
815
      } else if (seg > 2) {
2,147,483,647✔
UNCOV
816
        break;
×
817
      }
818

819
      // support float with no decimal part after the decimal point
820
      if (z[i] == '.' && seg == 1) {
2,147,483,647✔
821
        *tokenId = TK_NK_FLOAT;
3,571,609✔
822
        i++;
3,571,609✔
823
      }
824
      if ((z[i] == 'e' || z[i] == 'E') &&
2,147,483,647✔
825
          (isdigit(z[i + 1]) || ((z[i + 1] == '+' || z[i + 1] == '-') && isdigit(z[i + 2])))) {
3,116,647✔
826
        i += 2;
42,877,655✔
827
        while (isdigit(z[i])) {
126,076,252✔
828
          i++;
83,198,597✔
829
        }
830
        *tokenId = TK_NK_FLOAT;
42,877,655✔
831
      }
832
      return i;
2,147,483,647✔
833
    }
834
    // case '[': {
835
    //   for (i = 1; z[i] && z[i - 1] != ']'; i++) {
836
    //   }
837
    //   *tokenId = TK_NK_ID;
838
    //   return i;
839
    // }
840
    case 'T':
2,147,483,647✔
841
    case 't':
842
    case 'F':
843
    case 'f': {
844
      bool hasNonAsciiChars = false;
2,147,483,647✔
845
      for (i = 1;; i++) {
2,147,483,647✔
846
        if ((z[i] & 0x80) != 0) {
2,147,483,647✔
847
          // utf-8 characters
848
          // currently, we support using utf-8 characters only in alias
UNCOV
849
          hasNonAsciiChars = true;
×
850
        } else if (isIdChar[(uint8_t)z[i]]) {
2,147,483,647✔
851
        } else {
852
          break;
2,147,483,647✔
853
        }
854
      }
855
      if (hasNonAsciiChars) {
2,147,483,647✔
UNCOV
856
        *tokenId = TK_NK_ALIAS;  // must be alias
×
UNCOV
857
        return i;
×
858
      }
859
      if (IS_TRUE_STR(z, i) || IS_FALSE_STR(z, i)) {
2,147,483,647✔
860
        *tokenId = TK_NK_BOOL;
2,147,483,647✔
861
        return i;
2,147,483,647✔
862
      }
863
      *tokenId = tKeywordCode(z, i);
2,147,483,647✔
864
      return i;
2,147,483,647✔
865
    }
866
    default: {
2,147,483,647✔
867
      if ((*z & 0x80) == 0 && !isIdChar[(uint8_t)*z]) {
2,147,483,647✔
868
        break;
633,762,129✔
869
      }
870
      bool hasNonAsciiChars = false;
2,147,483,647✔
871
      for (i = 1;; i++) {
2,147,483,647✔
872
        if ((z[i] & 0x80) != 0) {
2,147,483,647✔
873
          hasNonAsciiChars = true;
173,310✔
874
        } else if (isIdChar[(uint8_t)z[i]]) {
2,147,483,647✔
875
        } else {
876
          break;
2,147,483,647✔
877
        }
878
      }
879
      if (hasNonAsciiChars) {
2,147,483,647✔
880
        *tokenId = TK_NK_ALIAS;
30,185✔
881
        return i;
30,185✔
882
      }
883
      *tokenId = tKeywordCode(z, i);
2,147,483,647✔
884
      return i;
2,147,483,647✔
885
    }
886
  }
887

888
  *tokenId = TK_NK_ILLEGAL;
633,630,532✔
889
  return 0;
633,592,485✔
890
}
891

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

895
  // here we reach the end of sql string, null-terminated string
896
  if (str[*i] == 0) {
2,147,483,647✔
897
    t0.n = 0;
637,066,021✔
898
    return t0;
637,066,021✔
899
  }
900

901
  // IGNORE TK_NK_SPACE, TK_NK_COMMA, and specified tokens
902
  while (1) {
903
    *i += t0.n;
2,147,483,647✔
904

905
    int32_t numOfComma = 0;
2,147,483,647✔
906
    char    t = str[*i];
2,147,483,647✔
907
    while (t == ' ' || t == '\n' || t == '\r' || t == '\t' || t == '\f' || t == '\b' || t == ',') {
2,147,483,647✔
908
      if (t == ',' && (++numOfComma > 1)) {  // comma only allowed once
2,147,483,647✔
909
        t0.n = 0;
726✔
910
        return t0;
726✔
911
      }
912

913
      if (NULL != pIgnoreComma && t == ',') {
2,147,483,647✔
914
        *pIgnoreComma = true;
96✔
915
      }
916

917
      t = str[++(*i)];
2,147,483,647✔
918
    }
919

920
    t0.n = tGetToken(&str[*i], &t0.type, NULL);
2,147,483,647✔
921
    break;
2,147,483,647✔
922

923
    // not support user specfied ignored symbol list
924
#if 0
925
    bool ignore = false;
926
    for (uint32_t k = 0; k < numOfIgnoreToken; k++) {
927
      if (t0.type == ignoreTokenTypes[k]) {
928
        ignore = true;
929
        break;
930
      }
931
    }
932

933
    if (!ignore) {
934
      break;
935
    }
936
#endif
937
  }
938

939
  if (t0.type == TK_NK_SEMI) {
2,147,483,647✔
940
    t0.n = 0;
190,618,045✔
941
    t0.type = 0;
190,618,045✔
942
    return t0;
190,618,045✔
943
  }
944

945
  uint32_t type = 0;
2,147,483,647✔
946
  int32_t  len;
947

948
  // support parse the 'db.tbl' format, notes: There should be no space on either side of the dot!
949
  if ('.' == str[*i + t0.n]) {
2,147,483,647✔
950
    len = tGetToken(&str[*i + t0.n + 1], &type, NULL);
860,393,896✔
951

952
    // only id、string and ? are valid
953
    if (((TK_NK_STRING != t0.type) && (TK_NK_ID != t0.type)) ||
860,388,247✔
954
        ((TK_NK_STRING != type) && (TK_NK_ID != type) && (TK_NK_QUESTION != type))) {
860,388,093✔
955
      t0.type = TK_NK_ILLEGAL;
4,994✔
956
      t0.n = 0;
4,994✔
957

958
      return t0;
4,994✔
959
    }
960

961
    // check the table name is '?', db.?asf is not valid.
962
    if (TK_NK_QUESTION == type) {
860,383,253✔
963
      (void)tGetToken(&str[*i + t0.n + 2], &type, NULL);
64,876✔
964
      if (TK_NK_SPACE != type) {
64,876✔
UNCOV
965
        t0.type = TK_NK_ILLEGAL;
×
UNCOV
966
        t0.n = 0;
×
967
        return t0;
×
968
      }
969
    }
970

971
    t0.n += len + 1;
860,375,112✔
972

973
  } else {
974
    // support parse the -/+number format
975
    if ((isPrevOptr) && (t0.type == TK_NK_MINUS || t0.type == TK_NK_PLUS)) {
2,147,483,647✔
976
      len = tGetToken(&str[*i + t0.n], &type, NULL);
2,147,483,647✔
977
      if (type == TK_NK_INTEGER || type == TK_NK_FLOAT || type == TK_NK_BIN || type == TK_NK_HEX) {
2,147,483,647✔
978
        t0.type = type;
2,147,483,647✔
979
        t0.n += len;
2,147,483,647✔
980
      }
981
    }
982
  }
983

984
  t0.z = (char*)str + (*i);
2,147,483,647✔
985
  *i += t0.n;
2,147,483,647✔
986

987
  return t0;
2,147,483,647✔
988
}
989

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

992
int32_t taosInitKeywordsTable() { return doInitKeywordsTable(); }
1,622,399✔
993

994
void taosCleanupKeywordsTable() {
1,576,842✔
995
  void* m = keywordHashTable;
1,576,842✔
996
  if (m != NULL && atomic_val_compare_exchange_ptr(&keywordHashTable, m, 0) == m) {
1,576,842✔
997
    taosHashCleanup(m);
1,576,793✔
998
  }
999
}
1,576,842✔
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