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 }