github.com/pingcap/tidb/parser@v0.0.0-20231013125129-93a834a6bf8d/misc.go (about)

     1  // Copyright 2016 PingCAP, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package parser
    15  
    16  func isLetter(ch byte) bool {
    17  	return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
    18  }
    19  
    20  func isDigit(ch byte) bool {
    21  	return ch >= '0' && ch <= '9'
    22  }
    23  
    24  func isIdentChar(ch byte) bool {
    25  	return isLetter(ch) || isDigit(ch) || ch == '_' || ch == '$' || isIdentExtend(ch)
    26  }
    27  
    28  func isIdentExtend(ch byte) bool {
    29  	return ch >= 0x80
    30  }
    31  
    32  // Initialize a lookup table for isUserVarChar
    33  var isUserVarCharTable [256]bool
    34  
    35  func init() {
    36  	for i := 0; i < 256; i++ {
    37  		ch := byte(i)
    38  		isUserVarCharTable[i] = isLetter(ch) || isDigit(ch) || ch == '_' || ch == '$' || ch == '.' || isIdentExtend(ch)
    39  	}
    40  }
    41  
    42  func isUserVarChar(ch byte) bool {
    43  	return isUserVarCharTable[ch]
    44  }
    45  
    46  type trieNode struct {
    47  	childs [256]*trieNode
    48  	token  int
    49  	fn     func(s *Scanner) (int, Pos, string)
    50  }
    51  
    52  var ruleTable trieNode
    53  
    54  func initTokenByte(c byte, tok int) {
    55  	if ruleTable.childs[c] == nil {
    56  		ruleTable.childs[c] = &trieNode{}
    57  	}
    58  	ruleTable.childs[c].token = tok
    59  }
    60  
    61  func initTokenString(str string, tok int) {
    62  	node := &ruleTable
    63  	for _, c := range str {
    64  		if node.childs[c] == nil {
    65  			node.childs[c] = &trieNode{}
    66  		}
    67  		node = node.childs[c]
    68  	}
    69  	node.token = tok
    70  }
    71  
    72  func initTokenFunc(str string, fn func(s *Scanner) (int, Pos, string)) {
    73  	for i := 0; i < len(str); i++ {
    74  		c := str[i]
    75  		if ruleTable.childs[c] == nil {
    76  			ruleTable.childs[c] = &trieNode{}
    77  		}
    78  		ruleTable.childs[c].fn = fn
    79  	}
    80  }
    81  
    82  func init() {
    83  	// invalid is a special token defined in parser.y, when parser meet
    84  	// this token, it will throw an error.
    85  	// set root trie node's token to invalid, so when input match nothing
    86  	// in the trie, invalid will be the default return token.
    87  	ruleTable.token = invalid
    88  	initTokenByte('/', int('/'))
    89  	initTokenByte('+', int('+'))
    90  	initTokenByte('>', int('>'))
    91  	initTokenByte('<', int('<'))
    92  	initTokenByte('(', int('('))
    93  	initTokenByte(')', int(')'))
    94  	initTokenByte('[', int('['))
    95  	initTokenByte(']', int(']'))
    96  	initTokenByte(';', int(';'))
    97  	initTokenByte(',', int(','))
    98  	initTokenByte('&', int('&'))
    99  	initTokenByte('%', int('%'))
   100  	initTokenByte(':', int(':'))
   101  	initTokenByte('|', int('|'))
   102  	initTokenByte('!', int('!'))
   103  	initTokenByte('^', int('^'))
   104  	initTokenByte('~', int('~'))
   105  	initTokenByte('\\', int('\\'))
   106  	initTokenByte('?', paramMarker)
   107  	initTokenByte('=', eq)
   108  	initTokenByte('{', int('{'))
   109  	initTokenByte('}', int('}'))
   110  
   111  	initTokenString("||", pipes)
   112  	initTokenString("&&", andand)
   113  	initTokenString("&^", andnot)
   114  	initTokenString(":=", assignmentEq)
   115  	initTokenString("<=>", nulleq)
   116  	initTokenString(">=", ge)
   117  	initTokenString("<=", le)
   118  	initTokenString("!=", neq)
   119  	initTokenString("<>", neqSynonym)
   120  	initTokenString("<<", lsh)
   121  	initTokenString(">>", rsh)
   122  	initTokenString("\\N", null)
   123  
   124  	initTokenFunc("@", startWithAt)
   125  	initTokenFunc("/", startWithSlash)
   126  	initTokenFunc("*", startWithStar)
   127  	initTokenFunc("-", startWithDash)
   128  	initTokenFunc("#", startWithSharp)
   129  	initTokenFunc("Xx", startWithXx)
   130  	initTokenFunc("Nn", startWithNn)
   131  	initTokenFunc("Bb", startWithBb)
   132  	initTokenFunc(".", startWithDot)
   133  	initTokenFunc("_$ACDEFGHIJKLMOPQRSTUVWYZacdefghijklmopqrstuvwyz", scanIdentifier)
   134  	initTokenFunc("`", scanQuotedIdent)
   135  	initTokenFunc("0123456789", startWithNumber)
   136  	initTokenFunc("'\"", startString)
   137  }
   138  
   139  // isInTokenMap indicates whether the target string is contained in tokenMap.
   140  func isInTokenMap(target string) bool {
   141  	_, ok := tokenMap[target]
   142  	return ok
   143  }
   144  
   145  // tokenMap is a map of known identifiers to the parser token ID.
   146  // Please try to keep the map in alphabetical order.
   147  var tokenMap = map[string]int{
   148  	"ACCOUNT":                  account,
   149  	"ACTION":                   action,
   150  	"ADD":                      add,
   151  	"ADDDATE":                  addDate,
   152  	"ADMIN":                    admin,
   153  	"ADVISE":                   advise,
   154  	"AFTER":                    after,
   155  	"AGAINST":                  against,
   156  	"AGO":                      ago,
   157  	"ALGORITHM":                algorithm,
   158  	"ALL":                      all,
   159  	"ALTER":                    alter,
   160  	"ALWAYS":                   always,
   161  	"ANALYZE":                  analyze,
   162  	"AND":                      and,
   163  	"ANY":                      any,
   164  	"APPROX_COUNT_DISTINCT":    approxCountDistinct,
   165  	"APPROX_PERCENTILE":        approxPercentile,
   166  	"ARRAY":                    array,
   167  	"AS":                       as,
   168  	"ASC":                      asc,
   169  	"ASCII":                    ascii,
   170  	"ATTRIBUTE":                attribute,
   171  	"ATTRIBUTES":               attributes,
   172  	"BATCH":                    batch,
   173  	"BACKGROUND":               background,
   174  	"STATS_OPTIONS":            statsOptions,
   175  	"STATS_SAMPLE_RATE":        statsSampleRate,
   176  	"STATS_COL_CHOICE":         statsColChoice,
   177  	"STATS_COL_LIST":           statsColList,
   178  	"AUTO_ID_CACHE":            autoIdCache,
   179  	"AUTO_INCREMENT":           autoIncrement,
   180  	"AUTO_RANDOM":              autoRandom,
   181  	"AUTO_RANDOM_BASE":         autoRandomBase,
   182  	"AVG_ROW_LENGTH":           avgRowLength,
   183  	"AVG":                      avg,
   184  	"BACKEND":                  backend,
   185  	"BACKUP":                   backup,
   186  	"BACKUPS":                  backups,
   187  	"BEGIN":                    begin,
   188  	"BETWEEN":                  between,
   189  	"BERNOULLI":                bernoulli,
   190  	"BIGINT":                   bigIntType,
   191  	"BINARY":                   binaryType,
   192  	"BINDING":                  binding,
   193  	"BINDING_CACHE":            bindingCache,
   194  	"BINDINGS":                 bindings,
   195  	"BINLOG":                   binlog,
   196  	"BIT_AND":                  bitAnd,
   197  	"BIT_OR":                   bitOr,
   198  	"BIT_XOR":                  bitXor,
   199  	"BIT":                      bitType,
   200  	"BLOB":                     blobType,
   201  	"BLOCK":                    block,
   202  	"BOOL":                     boolType,
   203  	"BOOLEAN":                  booleanType,
   204  	"BOTH":                     both,
   205  	"BOUND":                    bound,
   206  	"BR":                       br,
   207  	"BRIEF":                    briefType,
   208  	"BTREE":                    btree,
   209  	"BUCKETS":                  buckets,
   210  	"BUILTINS":                 builtins,
   211  	"BURSTABLE":                burstable,
   212  	"BY":                       by,
   213  	"BYTE":                     byteType,
   214  	"CACHE":                    cache,
   215  	"CALIBRATE":                calibrate,
   216  	"CALL":                     call,
   217  	"CANCEL":                   cancel,
   218  	"CAPTURE":                  capture,
   219  	"CARDINALITY":              cardinality,
   220  	"CASCADE":                  cascade,
   221  	"CASCADED":                 cascaded,
   222  	"CASE":                     caseKwd,
   223  	"CAST":                     cast,
   224  	"CAUSAL":                   causal,
   225  	"CHAIN":                    chain,
   226  	"CHANGE":                   change,
   227  	"CHAR":                     charType,
   228  	"CHARACTER":                character,
   229  	"CHARSET":                  charsetKwd,
   230  	"CHECK":                    check,
   231  	"CHECKPOINT":               checkpoint,
   232  	"CHECKSUM":                 checksum,
   233  	"CIPHER":                   cipher,
   234  	"CLEANUP":                  cleanup,
   235  	"CLIENT":                   client,
   236  	"CLIENT_ERRORS_SUMMARY":    clientErrorsSummary,
   237  	"CLOSE":                    close,
   238  	"CLUSTER":                  cluster,
   239  	"CLUSTERED":                clustered,
   240  	"CMSKETCH":                 cmSketch,
   241  	"COALESCE":                 coalesce,
   242  	"COLLATE":                  collate,
   243  	"COLLATION":                collation,
   244  	"COLUMN_FORMAT":            columnFormat,
   245  	"COLUMN_STATS_USAGE":       columnStatsUsage,
   246  	"COLUMN":                   column,
   247  	"COLUMNS":                  columns,
   248  	"COMMENT":                  comment,
   249  	"COMMIT":                   commit,
   250  	"COMMITTED":                committed,
   251  	"COMPACT":                  compact,
   252  	"COMPRESSED":               compressed,
   253  	"COMPRESSION":              compression,
   254  	"CONCURRENCY":              concurrency,
   255  	"CONFIG":                   config,
   256  	"CONNECTION":               connection,
   257  	"CONSISTENCY":              consistency,
   258  	"CONSISTENT":               consistent,
   259  	"CONSTRAINT":               constraint,
   260  	"CONSTRAINTS":              constraints,
   261  	"CONTEXT":                  context,
   262  	"CONTINUE":                 continueKwd,
   263  	"CONVERT":                  convert,
   264  	"COOLDOWN":                 cooldown,
   265  	"COPY":                     copyKwd,
   266  	"CORRELATION":              correlation,
   267  	"CPU":                      cpu,
   268  	"CREATE":                   create,
   269  	"CROSS":                    cross,
   270  	"CSV_BACKSLASH_ESCAPE":     csvBackslashEscape,
   271  	"CSV_DELIMITER":            csvDelimiter,
   272  	"CSV_HEADER":               csvHeader,
   273  	"CSV_NOT_NULL":             csvNotNull,
   274  	"CSV_NULL":                 csvNull,
   275  	"CSV_SEPARATOR":            csvSeparator,
   276  	"CSV_TRIM_LAST_SEPARATORS": csvTrimLastSeparators,
   277  	"CURDATE":                  curDate,
   278  	"CURRENT_DATE":             currentDate,
   279  	"CURRENT_ROLE":             currentRole,
   280  	"CURRENT_TIME":             currentTime,
   281  	"CURRENT_TIMESTAMP":        currentTs,
   282  	"CURRENT_USER":             currentUser,
   283  	"CURRENT":                  current,
   284  	"CURSOR":                   cursor,
   285  	"CURTIME":                  curTime,
   286  	"CYCLE":                    cycle,
   287  	"DATA":                     data,
   288  	"DATABASE":                 database,
   289  	"DATABASES":                databases,
   290  	"DATE_ADD":                 dateAdd,
   291  	"DATE_SUB":                 dateSub,
   292  	"DATE":                     dateType,
   293  	"DATETIME":                 datetimeType,
   294  	"DAY_HOUR":                 dayHour,
   295  	"DAY_MICROSECOND":          dayMicrosecond,
   296  	"DAY_MINUTE":               dayMinute,
   297  	"DAY_SECOND":               daySecond,
   298  	"DAY":                      day,
   299  	"DDL":                      ddl,
   300  	"DEALLOCATE":               deallocate,
   301  	"DEC":                      decimalType,
   302  	"DECIMAL":                  decimalType,
   303  	"DECLARE":                  declare,
   304  	"DEFAULT":                  defaultKwd,
   305  	"DEFINED":                  defined,
   306  	"DEFINER":                  definer,
   307  	"DELAY_KEY_WRITE":          delayKeyWrite,
   308  	"DELAYED":                  delayed,
   309  	"DELETE":                   deleteKwd,
   310  	"DEPENDENCY":               dependency,
   311  	"DEPTH":                    depth,
   312  	"DESC":                     desc,
   313  	"DESCRIBE":                 describe,
   314  	"DIGEST":                   digest,
   315  	"DIRECTORY":                directory,
   316  	"DISABLE":                  disable,
   317  	"DISABLED":                 disabled,
   318  	"DISCARD":                  discard,
   319  	"DISK":                     disk,
   320  	"DISTINCT":                 distinct,
   321  	"DISTINCTROW":              distinct,
   322  	"DIV":                      div,
   323  	"DO":                       do,
   324  	"DOT":                      dotType,
   325  	"DOUBLE":                   doubleType,
   326  	"DRAINER":                  drainer,
   327  	"DROP":                     drop,
   328  	"DRY":                      dry,
   329  	"DRYRUN":                   dryRun,
   330  	"DUAL":                     dual,
   331  	"DUMP":                     dump,
   332  	"DUPLICATE":                duplicate,
   333  	"DURATION":                 timeDuration,
   334  	"DYNAMIC":                  dynamic,
   335  	"ELSE":                     elseKwd,
   336  	"ELSEIF":                   elseIfKwd,
   337  	"ENABLE":                   enable,
   338  	"ENABLED":                  enabled,
   339  	"ENCLOSED":                 enclosed,
   340  	"ENCRYPTION":               encryption,
   341  	"END":                      end,
   342  	"END_TIME":                 endTime,
   343  	"ENFORCED":                 enforced,
   344  	"ENGINE":                   engine,
   345  	"ENGINES":                  engines,
   346  	"ENUM":                     enum,
   347  	"ERROR":                    errorKwd,
   348  	"ERRORS":                   identSQLErrors,
   349  	"ESCAPE":                   escape,
   350  	"ESCAPED":                  escaped,
   351  	"EVENT":                    event,
   352  	"EVENTS":                   events,
   353  	"EVOLVE":                   evolve,
   354  	"EXACT":                    exact,
   355  	"EXEC_ELAPSED":             execElapsed,
   356  	"EXCEPT":                   except,
   357  	"EXCHANGE":                 exchange,
   358  	"EXCLUSIVE":                exclusive,
   359  	"EXECUTE":                  execute,
   360  	"EXISTS":                   exists,
   361  	"EXIT":                     exit,
   362  	"EXPANSION":                expansion,
   363  	"EXPIRE":                   expire,
   364  	"EXPLAIN":                  explain,
   365  	"EXPR_PUSHDOWN_BLACKLIST":  exprPushdownBlacklist,
   366  	"EXTENDED":                 extended,
   367  	"EXTRACT":                  extract,
   368  	"FALSE":                    falseKwd,
   369  	"FAULTS":                   faultsSym,
   370  	"FETCH":                    fetch,
   371  	"FIELDS":                   fields,
   372  	"FILE":                     file,
   373  	"FIRST":                    first,
   374  	"FIXED":                    fixed,
   375  	"FLASHBACK":                flashback,
   376  	"FLOAT":                    floatType,
   377  	"FLOAT4":                   float4Type,
   378  	"FLOAT8":                   float8Type,
   379  	"FLUSH":                    flush,
   380  	"FOLLOWER":                 follower,
   381  	"FOLLOWERS":                followers,
   382  	"FOLLOWER_CONSTRAINTS":     followerConstraints,
   383  	"FOLLOWING":                following,
   384  	"FOR":                      forKwd,
   385  	"FORCE":                    force,
   386  	"FOREIGN":                  foreign,
   387  	"FORMAT":                   format,
   388  	"FOUND":                    found,
   389  	"FROM":                     from,
   390  	"FULL":                     full,
   391  	"FULL_BACKUP_STORAGE":      fullBackupStorage,
   392  	"FULLTEXT":                 fulltext,
   393  	"FUNCTION":                 function,
   394  	"GC_TTL":                   gcTTL,
   395  	"GENERAL":                  general,
   396  	"GENERATED":                generated,
   397  	"GET_FORMAT":               getFormat,
   398  	"GLOBAL":                   global,
   399  	"GRANT":                    grant,
   400  	"GRANTS":                   grants,
   401  	"GROUP_CONCAT":             groupConcat,
   402  	"GROUP":                    group,
   403  	"HASH":                     hash,
   404  	"HANDLER":                  handler,
   405  	"HAVING":                   having,
   406  	"HELP":                     help,
   407  	"HIGH_PRIORITY":            highPriority,
   408  	"HISTORY":                  history,
   409  	"HISTOGRAM":                histogram,
   410  	"HOSTS":                    hosts,
   411  	"HOUR_MICROSECOND":         hourMicrosecond,
   412  	"HOUR_MINUTE":              hourMinute,
   413  	"HOUR_SECOND":              hourSecond,
   414  	"HOUR":                     hour,
   415  	"IDENTIFIED":               identified,
   416  	"IF":                       ifKwd,
   417  	"IGNORE":                   ignore,
   418  	"ILIKE":                    ilike,
   419  	"IMPORT":                   importKwd,
   420  	"IMPORTS":                  imports,
   421  	"IN":                       in,
   422  	"INCREMENT":                increment,
   423  	"INCREMENTAL":              incremental,
   424  	"INDEX":                    index,
   425  	"INDEXES":                  indexes,
   426  	"INFILE":                   infile,
   427  	"INNER":                    inner,
   428  	"INOUT":                    inout,
   429  	"INPLACE":                  inplace,
   430  	"INSERT_METHOD":            insertMethod,
   431  	"INSERT":                   insert,
   432  	"INSTANCE":                 instance,
   433  	"INSTANT":                  instant,
   434  	"INT":                      intType,
   435  	"INT1":                     int1Type,
   436  	"INT2":                     int2Type,
   437  	"INT3":                     int3Type,
   438  	"INT4":                     int4Type,
   439  	"INT8":                     int8Type,
   440  	"INTEGER":                  integerType,
   441  	"INTERNAL":                 internal,
   442  	"INTERSECT":                intersect,
   443  	"INTERVAL":                 interval,
   444  	"INTO":                     into,
   445  	"INVISIBLE":                invisible,
   446  	"INVOKER":                  invoker,
   447  	"ITERATE":                  iterate,
   448  	"IO":                       io,
   449  	"RU_PER_SEC":               ruRate,
   450  	"PRIORITY":                 priority,
   451  	"HIGH":                     high,
   452  	"MEDIUM":                   medium,
   453  	"LOW":                      low,
   454  	"IO_READ_BANDWIDTH":        ioReadBandwidth,
   455  	"IO_WRITE_BANDWIDTH":       ioWriteBandwidth,
   456  	"IPC":                      ipc,
   457  	"IS":                       is,
   458  	"ISOLATION":                isolation,
   459  	"ISSUER":                   issuer,
   460  	"JOB":                      job,
   461  	"JOBS":                     jobs,
   462  	"JOIN":                     join,
   463  	"JSON_ARRAYAGG":            jsonArrayagg,
   464  	"JSON_OBJECTAGG":           jsonObjectAgg,
   465  	"JSON":                     jsonType,
   466  	"KEY_BLOCK_SIZE":           keyBlockSize,
   467  	"KEY":                      key,
   468  	"KEYS":                     keys,
   469  	"KILL":                     kill,
   470  	"LABELS":                   labels,
   471  	"LANGUAGE":                 language,
   472  	"LAST_BACKUP":              lastBackup,
   473  	"LAST":                     last,
   474  	"LASTVAL":                  lastval,
   475  	"LEADER":                   leader,
   476  	"LEADER_CONSTRAINTS":       leaderConstraints,
   477  	"LEADING":                  leading,
   478  	"LEARNER":                  learner,
   479  	"LEARNER_CONSTRAINTS":      learnerConstraints,
   480  	"LEARNERS":                 learners,
   481  	"LEAVE":                    leave,
   482  	"LEFT":                     left,
   483  	"LESS":                     less,
   484  	"LEVEL":                    level,
   485  	"LIKE":                     like,
   486  	"LIMIT":                    limit,
   487  	"LINEAR":                   linear,
   488  	"LINES":                    lines,
   489  	"LIST":                     list,
   490  	"LOAD":                     load,
   491  	"LOCAL":                    local,
   492  	"LOCALTIME":                localTime,
   493  	"LOCALTIMESTAMP":           localTs,
   494  	"LOCATION":                 location,
   495  	"LOCK":                     lock,
   496  	"LOCKED":                   locked,
   497  	"LOGS":                     logs,
   498  	"LONG":                     long,
   499  	"LONGBLOB":                 longblobType,
   500  	"LONGTEXT":                 longtextType,
   501  	"LOW_PRIORITY":             lowPriority,
   502  	"MASTER":                   master,
   503  	"MATCH":                    match,
   504  	"MAX_CONNECTIONS_PER_HOUR": maxConnectionsPerHour,
   505  	"MAX_IDXNUM":               max_idxnum,
   506  	"MAX_MINUTES":              max_minutes,
   507  	"MAX_QUERIES_PER_HOUR":     maxQueriesPerHour,
   508  	"MAX_ROWS":                 maxRows,
   509  	"MAX_UPDATES_PER_HOUR":     maxUpdatesPerHour,
   510  	"MAX_USER_CONNECTIONS":     maxUserConnections,
   511  	"MAX":                      max,
   512  	"MAXVALUE":                 maxValue,
   513  	"MB":                       mb,
   514  	"MEDIUMBLOB":               mediumblobType,
   515  	"MEDIUMINT":                mediumIntType,
   516  	"MEDIUMTEXT":               mediumtextType,
   517  	"MEMORY":                   memory,
   518  	"MEMBER":                   member,
   519  	"MERGE":                    merge,
   520  	"METADATA":                 metadata,
   521  	"MICROSECOND":              microsecond,
   522  	"MIDDLEINT":                middleIntType,
   523  	"MIN_ROWS":                 minRows,
   524  	"MIN":                      min,
   525  	"MINUTE_MICROSECOND":       minuteMicrosecond,
   526  	"MINUTE_SECOND":            minuteSecond,
   527  	"MINUTE":                   minute,
   528  	"MINVALUE":                 minValue,
   529  	"MOD":                      mod,
   530  	"MODE":                     mode,
   531  	"MODIFY":                   modify,
   532  	"MONTH":                    month,
   533  	"NAMES":                    names,
   534  	"NATIONAL":                 national,
   535  	"NATURAL":                  natural,
   536  	"NCHAR":                    ncharType,
   537  	"NEVER":                    never,
   538  	"NEXT_ROW_ID":              next_row_id,
   539  	"NEXT":                     next,
   540  	"NEXTVAL":                  nextval,
   541  	"NO_WRITE_TO_BINLOG":       noWriteToBinLog,
   542  	"NO":                       no,
   543  	"NOCACHE":                  nocache,
   544  	"NOCYCLE":                  nocycle,
   545  	"NODE_ID":                  nodeID,
   546  	"NODE_STATE":               nodeState,
   547  	"NODEGROUP":                nodegroup,
   548  	"NOMAXVALUE":               nomaxvalue,
   549  	"NOMINVALUE":               nominvalue,
   550  	"NONCLUSTERED":             nonclustered,
   551  	"NONE":                     none,
   552  	"NOT":                      not,
   553  	"NOW":                      now,
   554  	"NOWAIT":                   nowait,
   555  	"NULL":                     null,
   556  	"NULLS":                    nulls,
   557  	"NUMERIC":                  numericType,
   558  	"NVARCHAR":                 nvarcharType,
   559  	"OF":                       of,
   560  	"OFF":                      off,
   561  	"OFFSET":                   offset,
   562  	"OLTP_READ_ONLY":           oltpReadOnly,
   563  	"OLTP_READ_WRITE":          oltpReadWrite,
   564  	"OLTP_WRITE_ONLY":          oltpWriteOnly,
   565  	"TPCH_10":                  tpch10,
   566  	"ON_DUPLICATE":             onDuplicate,
   567  	"ON":                       on,
   568  	"ONLINE":                   online,
   569  	"ONLY":                     only,
   570  	"OPEN":                     open,
   571  	"OPT_RULE_BLACKLIST":       optRuleBlacklist,
   572  	"OPTIMISTIC":               optimistic,
   573  	"OPTIMIZE":                 optimize,
   574  	"OPTION":                   option,
   575  	"OPTIONAL":                 optional,
   576  	"OPTIONALLY":               optionally,
   577  	"OR":                       or,
   578  	"ORDER":                    order,
   579  	"OUT":                      out,
   580  	"OUTER":                    outer,
   581  	"OUTFILE":                  outfile,
   582  	"PACK_KEYS":                packKeys,
   583  	"PAGE":                     pageSym,
   584  	"PARSER":                   parser,
   585  	"PARTIAL":                  partial,
   586  	"PARTITION":                partition,
   587  	"PARTITIONING":             partitioning,
   588  	"PARTITIONS":               partitions,
   589  	"PASSWORD":                 password,
   590  	"PAUSE":                    pause,
   591  	"PERCENT":                  percent,
   592  	"PER_DB":                   per_db,
   593  	"PER_TABLE":                per_table,
   594  	"PESSIMISTIC":              pessimistic,
   595  	"PLACEMENT":                placement,
   596  	"PLAN":                     plan,
   597  	"PLAN_CACHE":               planCache,
   598  	"PLUGINS":                  plugins,
   599  	"POINT":                    point,
   600  	"POLICY":                   policy,
   601  	"POSITION":                 position,
   602  	"PRE_SPLIT_REGIONS":        preSplitRegions,
   603  	"PRECEDING":                preceding,
   604  	"PREDICATE":                predicate,
   605  	"PRECISION":                precisionType,
   606  	"PREPARE":                  prepare,
   607  	"PRESERVE":                 preserve,
   608  	"PRIMARY":                  primary,
   609  	"PRIMARY_REGION":           primaryRegion,
   610  	"PRIVILEGES":               privileges,
   611  	"PROCEDURE":                procedure,
   612  	"PROCESS":                  process,
   613  	"PROCESSLIST":              processlist,
   614  	"PROFILE":                  profile,
   615  	"PROFILES":                 profiles,
   616  	"PROXY":                    proxy,
   617  	"PUMP":                     pump,
   618  	"PURGE":                    purge,
   619  	"QUARTER":                  quarter,
   620  	"QUERIES":                  queries,
   621  	"QUERY":                    query,
   622  	"QUERY_LIMIT":              queryLimit,
   623  	"QUICK":                    quick,
   624  	"RANGE":                    rangeKwd,
   625  	"RATE_LIMIT":               rateLimit,
   626  	"READ":                     read,
   627  	"REAL":                     realType,
   628  	"REBUILD":                  rebuild,
   629  	"RECENT":                   recent,
   630  	"RECOVER":                  recover,
   631  	"RECURSIVE":                recursive,
   632  	"REDUNDANT":                redundant,
   633  	"REFERENCES":               references,
   634  	"REGEXP":                   regexpKwd,
   635  	"REGION":                   region,
   636  	"REGIONS":                  regions,
   637  	"RELEASE":                  release,
   638  	"RELOAD":                   reload,
   639  	"REMOVE":                   remove,
   640  	"RENAME":                   rename,
   641  	"REORGANIZE":               reorganize,
   642  	"REPAIR":                   repair,
   643  	"REPEAT":                   repeat,
   644  	"REPEATABLE":               repeatable,
   645  	"REPLACE":                  replace,
   646  	"REPLAYER":                 replayer,
   647  	"REPLICA":                  replica,
   648  	"REPLICAS":                 replicas,
   649  	"REPLICATION":              replication,
   650  	"REQUIRE":                  require,
   651  	"REQUIRED":                 required,
   652  	"RESET":                    reset,
   653  	"RESOURCE":                 resource,
   654  	"RESPECT":                  respect,
   655  	"RESTART":                  restart,
   656  	"RESTORE":                  restore,
   657  	"RESTORES":                 restores,
   658  	"RESTORED_TS":              restoredTS,
   659  	"RESTRICT":                 restrict,
   660  	"REVERSE":                  reverse,
   661  	"REVOKE":                   revoke,
   662  	"RIGHT":                    right,
   663  	"RLIKE":                    rlike,
   664  	"ROLE":                     role,
   665  	"ROLLBACK":                 rollback,
   666  	"ROLLUP":                   rollup,
   667  	"ROUTINE":                  routine,
   668  	"ROW_COUNT":                rowCount,
   669  	"ROW_FORMAT":               rowFormat,
   670  	"ROW":                      row,
   671  	"ROWS":                     rows,
   672  	"RTREE":                    rtree,
   673  	"HYPO":                     hypo,
   674  	"RESUME":                   resume,
   675  	"RUN":                      run,
   676  	"RUNNING":                  running,
   677  	"S3":                       s3,
   678  	"SAMPLES":                  samples,
   679  	"SAMPLERATE":               sampleRate,
   680  	"SAN":                      san,
   681  	"SAVEPOINT":                savepoint,
   682  	"SCHEDULE":                 schedule,
   683  	"SCHEMA":                   database,
   684  	"SCHEMAS":                  databases,
   685  	"SECOND_MICROSECOND":       secondMicrosecond,
   686  	"SECOND":                   second,
   687  	"SECONDARY_ENGINE":         secondaryEngine,
   688  	"SECONDARY_LOAD":           secondaryLoad,
   689  	"SECONDARY_UNLOAD":         secondaryUnload,
   690  	"SECURITY":                 security,
   691  	"SELECT":                   selectKwd,
   692  	"SEND_CREDENTIALS_TO_TIKV": sendCredentialsToTiKV,
   693  	"SEPARATOR":                separator,
   694  	"SEQUENCE":                 sequence,
   695  	"SERIAL":                   serial,
   696  	"SERIALIZABLE":             serializable,
   697  	"SESSION":                  session,
   698  	"SESSION_STATES":           sessionStates,
   699  	"SET":                      set,
   700  	"SETVAL":                   setval,
   701  	"SHARD_ROW_ID_BITS":        shardRowIDBits,
   702  	"SHARE":                    share,
   703  	"SHARED":                   shared,
   704  	"SHOW":                     show,
   705  	"SHUTDOWN":                 shutdown,
   706  	"SIGNED":                   signed,
   707  	"SIMILAR":                  similar,
   708  	"SIMPLE":                   simple,
   709  	"SKIP":                     skip,
   710  	"SKIP_SCHEMA_FILES":        skipSchemaFiles,
   711  	"SLAVE":                    slave,
   712  	"SLOW":                     slow,
   713  	"SMALLINT":                 smallIntType,
   714  	"SNAPSHOT":                 snapshot,
   715  	"SOME":                     some,
   716  	"SOURCE":                   source,
   717  	"SPATIAL":                  spatial,
   718  	"SPLIT":                    split,
   719  	"SQL_BIG_RESULT":           sqlBigResult,
   720  	"SQL_BUFFER_RESULT":        sqlBufferResult,
   721  	"SQL_CACHE":                sqlCache,
   722  	"SQL_CALC_FOUND_ROWS":      sqlCalcFoundRows,
   723  	"SQL_NO_CACHE":             sqlNoCache,
   724  	"SQL_SMALL_RESULT":         sqlSmallResult,
   725  	"SQL_TSI_DAY":              sqlTsiDay,
   726  	"SQL_TSI_HOUR":             sqlTsiHour,
   727  	"SQL_TSI_MINUTE":           sqlTsiMinute,
   728  	"SQL_TSI_MONTH":            sqlTsiMonth,
   729  	"SQL_TSI_QUARTER":          sqlTsiQuarter,
   730  	"SQL_TSI_SECOND":           sqlTsiSecond,
   731  	"SQL_TSI_WEEK":             sqlTsiWeek,
   732  	"SQL_TSI_YEAR":             sqlTsiYear,
   733  	"SQL":                      sql,
   734  	"SQLEXCEPTION":             sqlexception,
   735  	"SQLSTATE":                 sqlstate,
   736  	"SQLWARNING":               sqlwarning,
   737  	"SSL":                      ssl,
   738  	"STALENESS":                staleness,
   739  	"START":                    start,
   740  	"START_TIME":               startTime,
   741  	"START_TS":                 startTS,
   742  	"STARTING":                 starting,
   743  	"STATISTICS":               statistics,
   744  	"STATS_AUTO_RECALC":        statsAutoRecalc,
   745  	"STATS_BUCKETS":            statsBuckets,
   746  	"STATS_EXTENDED":           statsExtended,
   747  	"STATS_HEALTHY":            statsHealthy,
   748  	"STATS_HISTOGRAMS":         statsHistograms,
   749  	"STATS_TOPN":               statsTopN,
   750  	"STATS_META":               statsMeta,
   751  	"STATS_LOCKED":             statsLocked,
   752  	"HISTOGRAMS_IN_FLIGHT":     histogramsInFlight,
   753  	"STATS_PERSISTENT":         statsPersistent,
   754  	"STATS_SAMPLE_PAGES":       statsSamplePages,
   755  	"STATS":                    stats,
   756  	"STATUS":                   status,
   757  	"STD":                      stddevPop,
   758  	"STDDEV_POP":               stddevPop,
   759  	"STDDEV_SAMP":              stddevSamp,
   760  	"STDDEV":                   stddevPop,
   761  	"STOP":                     stop,
   762  	"STORAGE":                  storage,
   763  	"STORED":                   stored,
   764  	"STRAIGHT_JOIN":            straightJoin,
   765  	"STRICT":                   strict,
   766  	"STRICT_FORMAT":            strictFormat,
   767  	"STRONG":                   strong,
   768  	"SUBDATE":                  subDate,
   769  	"SUBJECT":                  subject,
   770  	"SUBPARTITION":             subpartition,
   771  	"SUBPARTITIONS":            subpartitions,
   772  	"SUBSTR":                   substring,
   773  	"SUBSTRING":                substring,
   774  	"SUM":                      sum,
   775  	"SUPER":                    super,
   776  	"SURVIVAL_PREFERENCES":     survivalPreferences,
   777  	"SWAPS":                    swaps,
   778  	"SWITCHES":                 switchesSym,
   779  	"SYSTEM":                   system,
   780  	"SYSTEM_TIME":              systemTime,
   781  	"TARGET":                   target,
   782  	"TASK_TYPES":               taskTypes,
   783  	"TABLE_CHECKSUM":           tableChecksum,
   784  	"TABLE":                    tableKwd,
   785  	"TABLES":                   tables,
   786  	"TABLESAMPLE":              tableSample,
   787  	"TABLESPACE":               tablespace,
   788  	"TELEMETRY":                telemetry,
   789  	"TELEMETRY_ID":             telemetryID,
   790  	"TEMPORARY":                temporary,
   791  	"TEMPTABLE":                temptable,
   792  	"TERMINATED":               terminated,
   793  	"TEXT":                     textType,
   794  	"THAN":                     than,
   795  	"THEN":                     then,
   796  	"TIDB":                     tidb,
   797  	"TIDB_CURRENT_TSO":         tidbCurrentTSO,
   798  	"TIDB_JSON":                tidbJson,
   799  	"TIFLASH":                  tiFlash,
   800  	"TIKV_IMPORTER":            tikvImporter,
   801  	"TIME":                     timeType,
   802  	"TIMESTAMP":                timestampType,
   803  	"TIMESTAMPADD":             timestampAdd,
   804  	"TIMESTAMPDIFF":            timestampDiff,
   805  	"TINYBLOB":                 tinyblobType,
   806  	"TINYINT":                  tinyIntType,
   807  	"TINYTEXT":                 tinytextType,
   808  	"TLS":                      tls,
   809  	"TO":                       to,
   810  	"TOKEN_ISSUER":             tokenIssuer,
   811  	"TOKUDB_DEFAULT":           tokudbDefault,
   812  	"TOKUDB_FAST":              tokudbFast,
   813  	"TOKUDB_LZMA":              tokudbLzma,
   814  	"TOKUDB_QUICKLZ":           tokudbQuickLZ,
   815  	"TOKUDB_SMALL":             tokudbSmall,
   816  	"TOKUDB_SNAPPY":            tokudbSnappy,
   817  	"TOKUDB_UNCOMPRESSED":      tokudbUncompressed,
   818  	"TOKUDB_ZLIB":              tokudbZlib,
   819  	"TOKUDB_ZSTD":              tokudbZstd,
   820  	"TOP":                      top,
   821  	"TOPN":                     topn,
   822  	"TPCC":                     tpcc,
   823  	"TRACE":                    trace,
   824  	"TRADITIONAL":              traditional,
   825  	"TRAILING":                 trailing,
   826  	"TRANSACTION":              transaction,
   827  	"TRIGGER":                  trigger,
   828  	"TRIGGERS":                 triggers,
   829  	"TRIM":                     trim,
   830  	"TRUE":                     trueKwd,
   831  	"TRUNCATE":                 truncate,
   832  	"TRUE_CARD_COST":           trueCardCost,
   833  	"TTL":                      ttl,
   834  	"TTL_ENABLE":               ttlEnable,
   835  	"TTL_JOB_INTERVAL":         ttlJobInterval,
   836  	"TYPE":                     tp,
   837  	"UNBOUNDED":                unbounded,
   838  	"UNCOMMITTED":              uncommitted,
   839  	"UNDEFINED":                undefined,
   840  	"UNICODE":                  unicodeSym,
   841  	"UNION":                    union,
   842  	"UNIQUE":                   unique,
   843  	"UNKNOWN":                  unknown,
   844  	"UNLOCK":                   unlock,
   845  	"UNLIMITED":                unlimited,
   846  	"UNSIGNED":                 unsigned,
   847  	"UNTIL":                    until,
   848  	"UNTIL_TS":                 untilTS,
   849  	"UPDATE":                   update,
   850  	"USAGE":                    usage,
   851  	"USE":                      use,
   852  	"USER":                     user,
   853  	"USING":                    using,
   854  	"UTC_DATE":                 utcDate,
   855  	"UTC_TIME":                 utcTime,
   856  	"UTC_TIMESTAMP":            utcTimestamp,
   857  	"VALIDATION":               validation,
   858  	"VALUE":                    value,
   859  	"VALUES":                   values,
   860  	"VAR_POP":                  varPop,
   861  	"VAR_SAMP":                 varSamp,
   862  	"VARBINARY":                varbinaryType,
   863  	"VARCHAR":                  varcharType,
   864  	"VARCHARACTER":             varcharacter,
   865  	"VARIABLES":                variables,
   866  	"VARIANCE":                 varPop,
   867  	"VARYING":                  varying,
   868  	"VERBOSE":                  verboseType,
   869  	"VOTER":                    voter,
   870  	"VOTER_CONSTRAINTS":        voterConstraints,
   871  	"VOTERS":                   voters,
   872  	"VIEW":                     view,
   873  	"VIRTUAL":                  virtual,
   874  	"VISIBLE":                  visible,
   875  	"WARNINGS":                 warnings,
   876  	"WATCH":                    watch,
   877  	"WEEK":                     week,
   878  	"WEIGHT_STRING":            weightString,
   879  	"WHEN":                     when,
   880  	"WHERE":                    where,
   881  	"WHILE":                    while,
   882  	"WIDTH":                    width,
   883  	"WITH":                     with,
   884  	"WITHOUT":                  without,
   885  	"WRITE":                    write,
   886  	"WORKLOAD":                 workload,
   887  	"X509":                     x509,
   888  	"XOR":                      xor,
   889  	"YEAR_MONTH":               yearMonth,
   890  	"YEAR":                     yearType,
   891  	"ZEROFILL":                 zerofill,
   892  	"WAIT":                     wait,
   893  	"FAILED_LOGIN_ATTEMPTS":    failedLoginAttempts,
   894  	"PASSWORD_LOCK_TIME":       passwordLockTime,
   895  	"REUSE":                    reuse,
   896  }
   897  
   898  // See https://dev.mysql.com/doc/refman/5.7/en/function-resolution.html for details.
   899  // ADDDATE, SESSION_USER, SUBDATE, and SYSTEM_USER are exceptions because they are actually recognized as
   900  // identifiers even in `create table adddate (a int)`.
   901  var btFuncTokenMap = map[string]int{
   902  	"BIT_AND":               builtinBitAnd,
   903  	"BIT_OR":                builtinBitOr,
   904  	"BIT_XOR":               builtinBitXor,
   905  	"CAST":                  builtinCast,
   906  	"COUNT":                 builtinCount,
   907  	"APPROX_COUNT_DISTINCT": builtinApproxCountDistinct,
   908  	"APPROX_PERCENTILE":     builtinApproxPercentile,
   909  	"CURDATE":               builtinCurDate,
   910  	"CURTIME":               builtinCurTime,
   911  	"DATE_ADD":              builtinDateAdd,
   912  	"DATE_SUB":              builtinDateSub,
   913  	"EXTRACT":               builtinExtract,
   914  	"GROUP_CONCAT":          builtinGroupConcat,
   915  	"MAX":                   builtinMax,
   916  	"MID":                   builtinSubstring,
   917  	"MIN":                   builtinMin,
   918  	"NOW":                   builtinNow,
   919  	"POSITION":              builtinPosition,
   920  	"STD":                   builtinStddevPop,
   921  	"STDDEV":                builtinStddevPop,
   922  	"STDDEV_POP":            builtinStddevPop,
   923  	"STDDEV_SAMP":           builtinStddevSamp,
   924  	"SUBSTR":                builtinSubstring,
   925  	"SUBSTRING":             builtinSubstring,
   926  	"SUM":                   builtinSum,
   927  	"SYSDATE":               builtinSysDate,
   928  	"TRANSLATE":             builtinTranslate,
   929  	"TRIM":                  builtinTrim,
   930  	"VARIANCE":              builtinVarPop,
   931  	"VAR_POP":               builtinVarPop,
   932  	"VAR_SAMP":              builtinVarSamp,
   933  }
   934  
   935  var windowFuncTokenMap = map[string]int{
   936  	"CUME_DIST":    cumeDist,
   937  	"DENSE_RANK":   denseRank,
   938  	"FIRST_VALUE":  firstValue,
   939  	"GROUPS":       groups,
   940  	"LAG":          lag,
   941  	"LAST_VALUE":   lastValue,
   942  	"LEAD":         lead,
   943  	"NTH_VALUE":    nthValue,
   944  	"NTILE":        ntile,
   945  	"OVER":         over,
   946  	"PERCENT_RANK": percentRank,
   947  	"RANK":         rank,
   948  	"ROW_NUMBER":   rowNumber,
   949  	"WINDOW":       window,
   950  }
   951  
   952  // aliases are strings directly map to another string and use the same token.
   953  var aliases = map[string]string{
   954  	"SCHEMA":  "DATABASE",
   955  	"SCHEMAS": "DATABASES",
   956  	"DEC":     "DECIMAL",
   957  	"SUBSTR":  "SUBSTRING",
   958  }
   959  
   960  // hintedTokens is a set of tokens which recognizes a hint.
   961  // According to https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html,
   962  // only SELECT, INSERT, REPLACE, UPDATE and DELETE accept optimizer hints.
   963  // additionally we support CREATE and PARTITION for hints at table creation.
   964  var hintedTokens = map[int]struct{}{
   965  	selectKwd: {},
   966  	insert:    {},
   967  	replace:   {},
   968  	update:    {},
   969  	deleteKwd: {},
   970  	create:    {},
   971  	partition: {},
   972  }
   973  
   974  var hintTokenMap = map[string]int{
   975  	// MySQL 8.0 hint names
   976  	"JOIN_FIXED_ORDER":      hintJoinFixedOrder,
   977  	"JOIN_ORDER":            hintJoinOrder,
   978  	"JOIN_PREFIX":           hintJoinPrefix,
   979  	"JOIN_SUFFIX":           hintJoinSuffix,
   980  	"BKA":                   hintBKA,
   981  	"NO_BKA":                hintNoBKA,
   982  	"BNL":                   hintBNL,
   983  	"NO_BNL":                hintNoBNL,
   984  	"HASH_JOIN":             hintHashJoin,
   985  	"HASH_JOIN_BUILD":       hintHashJoinBuild,
   986  	"HASH_JOIN_PROBE":       hintHashJoinProbe,
   987  	"NO_HASH_JOIN":          hintNoHashJoin,
   988  	"MERGE":                 hintMerge,
   989  	"NO_MERGE":              hintNoMerge,
   990  	"INDEX_MERGE":           hintIndexMerge,
   991  	"NO_INDEX_MERGE":        hintNoIndexMerge,
   992  	"MRR":                   hintMRR,
   993  	"NO_MRR":                hintNoMRR,
   994  	"NO_ICP":                hintNoICP,
   995  	"NO_RANGE_OPTIMIZATION": hintNoRangeOptimization,
   996  	"SKIP_SCAN":             hintSkipScan,
   997  	"NO_SKIP_SCAN":          hintNoSkipScan,
   998  	"SEMIJOIN":              hintSemijoin,
   999  	"NO_SEMIJOIN":           hintNoSemijoin,
  1000  	"MAX_EXECUTION_TIME":    hintMaxExecutionTime,
  1001  	"SET_VAR":               hintSetVar,
  1002  	"RESOURCE_GROUP":        hintResourceGroup,
  1003  	"QB_NAME":               hintQBName,
  1004  
  1005  	// TiDB hint names
  1006  	"AGG_TO_COP":              hintAggToCop,
  1007  	"LIMIT_TO_COP":            hintLimitToCop,
  1008  	"IGNORE_PLAN_CACHE":       hintIgnorePlanCache,
  1009  	"HASH_AGG":                hintHashAgg,
  1010  	"MPP_1PHASE_AGG":          hintMpp1PhaseAgg,
  1011  	"MPP_2PHASE_AGG":          hintMpp2PhaseAgg,
  1012  	"IGNORE_INDEX":            hintIgnoreIndex,
  1013  	"INL_HASH_JOIN":           hintInlHashJoin,
  1014  	"INDEX_HASH_JOIN":         hintIndexHashJoin,
  1015  	"NO_INDEX_HASH_JOIN":      hintNoIndexHashJoin,
  1016  	"INL_JOIN":                hintInlJoin,
  1017  	"INDEX_JOIN":              hintIndexJoin,
  1018  	"NO_INDEX_JOIN":           hintNoIndexJoin,
  1019  	"INL_MERGE_JOIN":          hintInlMergeJoin,
  1020  	"INDEX_MERGE_JOIN":        hintIndexMergeJoin,
  1021  	"NO_INDEX_MERGE_JOIN":     hintNoIndexMergeJoin,
  1022  	"MEMORY_QUOTA":            hintMemoryQuota,
  1023  	"NO_SWAP_JOIN_INPUTS":     hintNoSwapJoinInputs,
  1024  	"QUERY_TYPE":              hintQueryType,
  1025  	"READ_CONSISTENT_REPLICA": hintReadConsistentReplica,
  1026  	"READ_FROM_STORAGE":       hintReadFromStorage,
  1027  	"BROADCAST_JOIN":          hintBCJoin,
  1028  	"SHUFFLE_JOIN":            hintShuffleJoin,
  1029  	"MERGE_JOIN":              hintSMJoin,
  1030  	"NO_MERGE_JOIN":           hintNoSMJoin,
  1031  	"STREAM_AGG":              hintStreamAgg,
  1032  	"SWAP_JOIN_INPUTS":        hintSwapJoinInputs,
  1033  	"USE_INDEX_MERGE":         hintUseIndexMerge,
  1034  	"USE_INDEX":               hintUseIndex,
  1035  	"ORDER_INDEX":             hintOrderIndex,
  1036  	"NO_ORDER_INDEX":          hintNoOrderIndex,
  1037  	"USE_PLAN_CACHE":          hintUsePlanCache,
  1038  	"USE_TOJA":                hintUseToja,
  1039  	"TIME_RANGE":              hintTimeRange,
  1040  	"USE_CASCADES":            hintUseCascades,
  1041  	"NTH_PLAN":                hintNthPlan,
  1042  	"FORCE_INDEX":             hintForceIndex,
  1043  	"STRAIGHT_JOIN":           hintStraightJoin,
  1044  	"LEADING":                 hintLeading,
  1045  	"SEMI_JOIN_REWRITE":       hintSemiJoinRewrite,
  1046  	"NO_DECORRELATE":          hintNoDecorrelate,
  1047  
  1048  	// TiDB hint aliases
  1049  	"TIDB_HJ":   hintHashJoin,
  1050  	"TIDB_INLJ": hintInlJoin,
  1051  	"TIDB_SMJ":  hintSMJoin,
  1052  
  1053  	// Other keywords
  1054  	"OLAP":            hintOLAP,
  1055  	"OLTP":            hintOLTP,
  1056  	"TIKV":            hintTiKV,
  1057  	"TIFLASH":         hintTiFlash,
  1058  	"PARTITION":       hintPartition,
  1059  	"FALSE":           hintFalse,
  1060  	"TRUE":            hintTrue,
  1061  	"MB":              hintMB,
  1062  	"GB":              hintGB,
  1063  	"DUPSWEEDOUT":     hintDupsWeedOut,
  1064  	"FIRSTMATCH":      hintFirstMatch,
  1065  	"LOOSESCAN":       hintLooseScan,
  1066  	"MATERIALIZATION": hintMaterialization,
  1067  }
  1068  
  1069  func (s *Scanner) isTokenIdentifier(lit string, offset int) int {
  1070  	// An identifier before or after '.' means it is part of a qualified identifier.
  1071  	// We do not parse it as keyword.
  1072  	if s.r.peek() == '.' {
  1073  		return 0
  1074  	}
  1075  
  1076  	for idx := offset - 1; idx >= 0; idx-- {
  1077  		if s.r.s[idx] == ' ' {
  1078  			continue
  1079  		} else if s.r.s[idx] == '.' {
  1080  			return 0
  1081  		} else {
  1082  			break
  1083  		}
  1084  	}
  1085  
  1086  	buf := &s.buf
  1087  	buf.Reset()
  1088  	buf.Grow(len(lit))
  1089  	data := buf.Bytes()[:len(lit)]
  1090  
  1091  	for i := 0; i < len(lit); i++ {
  1092  		c := lit[i]
  1093  		if c >= 'a' && c <= 'z' {
  1094  			data[i] = c + 'A' - 'a'
  1095  		} else {
  1096  			data[i] = c
  1097  		}
  1098  	}
  1099  
  1100  	checkBtFuncToken := s.r.peek() == '('
  1101  	if !checkBtFuncToken && s.sqlMode.HasIgnoreSpaceMode() {
  1102  		s.skipWhitespace()
  1103  		checkBtFuncToken = s.r.peek() == '('
  1104  	}
  1105  
  1106  	if checkBtFuncToken {
  1107  		if tok := btFuncTokenMap[string(data)]; tok != 0 {
  1108  			return tok
  1109  		}
  1110  	}
  1111  	tok, ok := tokenMap[string(data)]
  1112  	if !ok && s.supportWindowFunc {
  1113  		tok = windowFuncTokenMap[string(data)]
  1114  	}
  1115  	return tok
  1116  }