Edit on GitHub

sqlglot.tokens

  1from __future__ import annotations
  2
  3import typing as t
  4
  5from sqlglot import tokenizer_core
  6from sqlglot.trie import new_trie
  7
  8from sqlglot.tokenizer_core import Token, TokenizerCore, TokenType
  9
 10
 11# The sqlglotc distribution ships no importable `sqlglotc` module; it overlays
 12# compiled .so files onto sqlglot's modules, so detect it via the compiled core.
 13SQLGLOTC_INSTALLED = not getattr(tokenizer_core, "__file__", "py").endswith(".py")
 14
 15try:
 16    import sqlglotrs  # type: ignore # noqa: F401
 17
 18    if not SQLGLOTC_INSTALLED:
 19        import warnings
 20
 21        warnings.warn(
 22            "sqlglot[rs] is deprecated and no longer compatible with sqlglot. "
 23            "Please use sqlglotc instead for faster parsing: pip install sqlglot[c]",
 24        )
 25except ImportError:
 26    pass
 27
 28if t.TYPE_CHECKING:
 29    from sqlglot.dialects.dialect import DialectType
 30
 31
 32def _convert_quotes(arr: list[str | tuple[str, str]]) -> dict[str, str]:
 33    return dict((item, item) if isinstance(item, str) else (item[0], item[1]) for item in arr)
 34
 35
 36def _quotes_to_format(
 37    token_type: TokenType, arr: list[str | tuple[str, str]]
 38) -> dict[str, tuple[str, TokenType]]:
 39    return {k: (v, token_type) for k, v in _convert_quotes(arr).items()}
 40
 41
 42class _TokenizerBase:
 43    QUOTES: t.ClassVar[list[tuple[str, str] | str]]
 44    IDENTIFIERS: t.ClassVar[list[str | tuple[str, str]]]
 45    BIT_STRINGS: t.ClassVar[list[str | tuple[str, str]]]
 46    BYTE_STRINGS: t.ClassVar[list[str | tuple[str, str]]]
 47    HEX_STRINGS: t.ClassVar[list[str | tuple[str, str]]]
 48    RAW_STRINGS: t.ClassVar[list[str | tuple[str, str]]]
 49    HEREDOC_STRINGS: t.ClassVar[list[str | tuple[str, str]]]
 50    UNICODE_STRINGS: t.ClassVar[list[str | tuple[str, str]]]
 51    STRING_ESCAPES: t.ClassVar[list[str]]
 52    BYTE_STRING_ESCAPES: t.ClassVar[list[str]]
 53    IDENTIFIER_ESCAPES: t.ClassVar[list[str]]
 54    HINT_START: t.ClassVar[str]
 55    KEYWORDS: t.ClassVar[dict[str, TokenType]]
 56    SINGLE_TOKENS: t.ClassVar[dict[str, TokenType]]
 57    NUMERIC_LITERALS: t.ClassVar[dict[str, str]]
 58    VAR_SINGLE_TOKENS: t.ClassVar[set[str]]
 59    COMMANDS: t.ClassVar[set[TokenType]]
 60    COMMAND_PREFIX_TOKENS: t.ClassVar[set[TokenType]]
 61    HEREDOC_TAG_IS_IDENTIFIER: t.ClassVar[bool]
 62    STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS: t.ClassVar[bool]
 63    NUMERIC_ESCAPES: t.ClassVar[dict[str, tuple[int, int, int, int]]]
 64    DROP_UNKNOWN_ESCAPES: t.ClassVar[bool]
 65    NUMERIC_ESCAPES_ARE_BYTES: t.ClassVar[bool]
 66    LONE_SURROGATE_REPLACEMENT: t.ClassVar[str]
 67    NESTED_COMMENTS: t.ClassVar[bool]
 68    DASH_COMMENT_REQUIRES_BOUNDARY: t.ClassVar[bool]
 69    COMMENTS_TERMINATE_AT_NEWLINE_ONLY: t.ClassVar[bool]
 70    TOKENS_PRECEDING_HINT: t.ClassVar[set[TokenType]]
 71    HEREDOC_STRING_ALTERNATIVE: t.ClassVar[TokenType]
 72    COMMENTS: t.ClassVar[list[str | tuple[str, str]]]
 73    _QUOTES: t.ClassVar[dict[str, str]]
 74    _IDENTIFIERS: t.ClassVar[dict[str, str]]
 75    _FORMAT_STRINGS: t.ClassVar[dict[str, tuple[str, TokenType]]]
 76    _STRING_ESCAPES: t.ClassVar[set[str]]
 77    _BYTE_STRING_ESCAPES: t.ClassVar[set[str]]
 78    _IDENTIFIER_ESCAPES: t.ClassVar[set[str]]
 79    _COMMENTS: t.ClassVar[dict[str, str | None]]
 80    _KEYWORD_TRIE: t.ClassVar[dict[str | int, object]]
 81
 82    @classmethod
 83    def __init_subclass__(cls, **kwargs: t.Any) -> None:
 84        super().__init_subclass__(**kwargs)
 85        cls._QUOTES = _convert_quotes(cls.QUOTES)
 86        cls._IDENTIFIERS = _convert_quotes(cls.IDENTIFIERS)
 87        cls._FORMAT_STRINGS = {
 88            **{
 89                p + s: (e, TokenType.NATIONAL_STRING)
 90                for s, e in cls._QUOTES.items()
 91                for p in ("n", "N")
 92            },
 93            **_quotes_to_format(TokenType.BIT_STRING, cls.BIT_STRINGS),
 94            **_quotes_to_format(TokenType.BYTE_STRING, cls.BYTE_STRINGS),
 95            **_quotes_to_format(TokenType.HEX_STRING, cls.HEX_STRINGS),
 96            **_quotes_to_format(TokenType.RAW_STRING, cls.RAW_STRINGS),
 97            **_quotes_to_format(TokenType.HEREDOC_STRING, cls.HEREDOC_STRINGS),
 98            **_quotes_to_format(TokenType.UNICODE_STRING, cls.UNICODE_STRINGS),
 99        }
100        if not any(
101            "BYTE_STRING_ESCAPES" in k.__dict__ for k in cls.__mro__ if k.__module__ != __name__
102        ):
103            cls.BYTE_STRING_ESCAPES = cls.STRING_ESCAPES.copy()
104        cls._STRING_ESCAPES = set(cls.STRING_ESCAPES)
105        cls._BYTE_STRING_ESCAPES = set(cls.BYTE_STRING_ESCAPES)
106        cls._IDENTIFIER_ESCAPES = set(cls.IDENTIFIER_ESCAPES)
107        cls._COMMENTS = {
108            **{c: None for c in cls.COMMENTS if isinstance(c, str)},
109            **{c[0]: c[1] for c in cls.COMMENTS if not isinstance(c, str)},
110            "{#": "#}",  # Ensure Jinja comments are tokenized correctly in all dialects
111        }
112        if cls.HINT_START in cls.KEYWORDS:
113            cls._COMMENTS[cls.HINT_START] = "*/"
114        cls._KEYWORD_TRIE = new_trie(
115            key.upper()
116            for key in (
117                *cls.KEYWORDS,
118                *cls._COMMENTS,
119                *cls._QUOTES,
120                *cls._FORMAT_STRINGS,
121            )
122            if " " in key or any(single in key for single in cls.SINGLE_TOKENS)
123        )
124
125
126class Tokenizer(_TokenizerBase):
127    SINGLE_TOKENS = {
128        "(": TokenType.L_PAREN,
129        ")": TokenType.R_PAREN,
130        "[": TokenType.L_BRACKET,
131        "]": TokenType.R_BRACKET,
132        "{": TokenType.L_BRACE,
133        "}": TokenType.R_BRACE,
134        "&": TokenType.AMP,
135        "^": TokenType.CARET,
136        ":": TokenType.COLON,
137        ",": TokenType.COMMA,
138        ".": TokenType.DOT,
139        "-": TokenType.DASH,
140        "=": TokenType.EQ,
141        ">": TokenType.GT,
142        "<": TokenType.LT,
143        "%": TokenType.MOD,
144        "!": TokenType.NOT,
145        "|": TokenType.PIPE,
146        "+": TokenType.PLUS,
147        ";": TokenType.SEMICOLON,
148        "/": TokenType.SLASH,
149        "\\": TokenType.BACKSLASH,
150        "*": TokenType.STAR,
151        "~": TokenType.TILDE,
152        "?": TokenType.PLACEHOLDER,
153        "@": TokenType.PARAMETER,
154        "#": TokenType.HASH,
155        # Used for breaking a var like x'y' but nothing else the token type doesn't matter
156        "'": TokenType.UNKNOWN,
157        "`": TokenType.UNKNOWN,
158        '"': TokenType.UNKNOWN,
159    }
160
161    BIT_STRINGS: t.ClassVar[list[str | tuple[str, str]]] = []
162    BYTE_STRINGS: t.ClassVar[list[str | tuple[str, str]]] = []
163    HEX_STRINGS: t.ClassVar[list[str | tuple[str, str]]] = []
164    RAW_STRINGS: t.ClassVar[list[str | tuple[str, str]]] = []
165    HEREDOC_STRINGS: t.ClassVar[list[str | tuple[str, str]]] = []
166    UNICODE_STRINGS: t.ClassVar[list[str | tuple[str, str]]] = []
167    IDENTIFIERS: t.ClassVar[list[str | tuple[str, str]]] = ['"']
168    QUOTES: t.ClassVar[list[tuple[str, str] | str]] = ["'"]
169    STRING_ESCAPES: t.ClassVar[list[str]] = ["'"]
170    BYTE_STRING_ESCAPES: t.ClassVar[list[str]] = []
171    VAR_SINGLE_TOKENS: t.ClassVar[set[str]] = set()
172
173    # The strings in this list can always be used as escapes, regardless of the surrounding
174    # identifier delimiters. By default, the closing delimiter is assumed to also act as an
175    # identifier escape, e.g. if we use double-quotes, then they also act as escapes: "x"""
176    IDENTIFIER_ESCAPES: t.ClassVar[list[str]] = []
177
178    # Whether the heredoc tags follow the same lexical rules as unquoted identifiers
179    HEREDOC_TAG_IS_IDENTIFIER = False
180
181    # Token that we'll generate as a fallback if the heredoc prefix doesn't correspond to a heredoc
182    HEREDOC_STRING_ALTERNATIVE = TokenType.VAR
183
184    # Whether string escape characters function as such when placed within raw strings
185    STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS = True
186
187    # Maps the char after a backslash to (base, min digits, max digits, max value) for escape
188    # sequences that encode a code point, e.g. {"x": (16, 2, 2, 0xFF)} decodes '\x41' as 'A'.
189    # Digits are read until the next one would exceed the max value; if fewer than the min digits
190    # are read, the sequence isn't decoded. Octal escapes, e.g. '\101', are keyed by "0".
191    NUMERIC_ESCAPES: t.ClassVar[dict[str, tuple[int, int, int, int]]] = {}
192
193    # Whether the backslash is dropped from escape sequences that aren't otherwise decoded,
194    # e.g. '\z' is 'z'
195    DROP_UNKNOWN_ESCAPES = False
196
197    # Whether byte-valued numeric escapes (e.g. \xhh) are raw bytes, so that consecutive ones are
198    # decoded together as UTF-8, e.g. '\xC3\xA9' is 'é' instead of 'é'
199    NUMERIC_ESCAPES_ARE_BYTES = False
200
201    # What an unpaired surrogate escape (e.g. \uD800) decodes to. If empty, it isn't decoded
202    LONE_SURROGATE_REPLACEMENT = ""
203
204    NESTED_COMMENTS = True
205
206    # Whether "--" only starts a comment when followed by whitespace or a control character
207    DASH_COMMENT_REQUIRES_BOUNDARY = False
208
209    # Whether "--"/"#" line comments are terminated only by "\n", and not also by "\r"
210    COMMENTS_TERMINATE_AT_NEWLINE_ONLY = False
211
212    HINT_START = "/*+"
213
214    TOKENS_PRECEDING_HINT = {TokenType.SELECT, TokenType.INSERT, TokenType.UPDATE, TokenType.DELETE}
215
216    # Autofilled
217    _COMMENTS: t.ClassVar[dict[str, str | None]] = {}
218    _FORMAT_STRINGS: t.ClassVar[dict[str, tuple[str, TokenType]]] = {}
219    _IDENTIFIERS: t.ClassVar[dict[str, str]] = {}
220    _IDENTIFIER_ESCAPES: t.ClassVar[set[str]] = set()
221    _QUOTES: t.ClassVar[dict[str, str]] = {}
222    _STRING_ESCAPES: t.ClassVar[set[str]] = set()
223    _BYTE_STRING_ESCAPES: t.ClassVar[set[str]] = set()
224    _KEYWORD_TRIE: t.ClassVar[dict[str | int, object]] = {}
225
226    KEYWORDS: t.ClassVar[dict[str, TokenType]] = {
227        **{f"{{%{postfix}": TokenType.BLOCK_START for postfix in ("", "+", "-")},
228        **{f"{prefix}%}}": TokenType.BLOCK_END for prefix in ("", "+", "-")},
229        **{f"{{{{{postfix}": TokenType.BLOCK_START for postfix in ("+", "-")},
230        **{f"{prefix}}}}}": TokenType.BLOCK_END for prefix in ("+", "-")},
231        HINT_START: TokenType.HINT,
232        "&<": TokenType.AMP_LT,
233        "&>": TokenType.AMP_GT,
234        "==": TokenType.EQ,
235        "::": TokenType.DCOLON,
236        "?::": TokenType.QDCOLON,
237        "||": TokenType.DPIPE,
238        "|>": TokenType.PIPE_GT,
239        ">=": TokenType.GTE,
240        "<=": TokenType.LTE,
241        "<>": TokenType.NEQ,
242        "!=": TokenType.NEQ,
243        ":=": TokenType.COLON_EQ,
244        "<=>": TokenType.NULLSAFE_EQ,
245        "->": TokenType.ARROW,
246        "->>": TokenType.DARROW,
247        "=>": TokenType.FARROW,
248        "#>": TokenType.HASH_ARROW,
249        "#>>": TokenType.DHASH_ARROW,
250        "<->": TokenType.LR_ARROW,
251        "<<->>": TokenType.LLRR_ARROW,
252        "&&": TokenType.DAMP,
253        "??": TokenType.DQMARK,
254        "~~~": TokenType.GLOB,
255        "~~": TokenType.LIKE,
256        "~~*": TokenType.ILIKE,
257        "~*": TokenType.IRLIKE,
258        "-|-": TokenType.ADJACENT,
259        "ALL": TokenType.ALL,
260        "AND": TokenType.AND,
261        "ANTI": TokenType.ANTI,
262        "ANY": TokenType.ANY,
263        "ASC": TokenType.ASC,
264        "AS": TokenType.ALIAS,
265        "ASOF": TokenType.ASOF,
266        "AUTOINCREMENT": TokenType.AUTO_INCREMENT,
267        "AUTO_INCREMENT": TokenType.AUTO_INCREMENT,
268        "BEGIN": TokenType.BEGIN,
269        "BETWEEN": TokenType.BETWEEN,
270        "CACHE": TokenType.CACHE,
271        "UNCACHE": TokenType.UNCACHE,
272        "CASE": TokenType.CASE,
273        "CLUSTER BY": TokenType.CLUSTER_BY,
274        "COLLATE": TokenType.COLLATE,
275        "COLUMN": TokenType.COLUMN,
276        "COMMIT": TokenType.COMMIT,
277        "CONNECT BY": TokenType.CONNECT_BY,
278        "CONSTRAINT": TokenType.CONSTRAINT,
279        "COPY": TokenType.COPY,
280        "CREATE": TokenType.CREATE,
281        "CROSS": TokenType.CROSS,
282        "CUBE": TokenType.CUBE,
283        "CURRENT_DATE": TokenType.CURRENT_DATE,
284        "CURRENT_SCHEMA": TokenType.CURRENT_SCHEMA,
285        "CURRENT_TIME": TokenType.CURRENT_TIME,
286        "CURRENT_TIMESTAMP": TokenType.CURRENT_TIMESTAMP,
287        "CURRENT_USER": TokenType.CURRENT_USER,
288        "CURRENT_CATALOG": TokenType.CURRENT_CATALOG,
289        "DATABASE": TokenType.DATABASE,
290        "DEFAULT": TokenType.DEFAULT,
291        "DELETE": TokenType.DELETE,
292        "DESC": TokenType.DESC,
293        "DESCRIBE": TokenType.DESCRIBE,
294        "DISTINCT": TokenType.DISTINCT,
295        "DISTRIBUTE BY": TokenType.DISTRIBUTE_BY,
296        "DIV": TokenType.DIV,
297        "DROP": TokenType.DROP,
298        "ELSE": TokenType.ELSE,
299        "END": TokenType.END,
300        "ENUM": TokenType.ENUM,
301        "ESCAPE": TokenType.ESCAPE,
302        "EXCEPT": TokenType.EXCEPT,
303        "EXECUTE": TokenType.EXECUTE,
304        "EXISTS": TokenType.EXISTS,
305        "FALSE": TokenType.FALSE,
306        "FETCH": TokenType.FETCH,
307        "FILTER": TokenType.FILTER,
308        "FILE": TokenType.FILE,
309        "FIRST": TokenType.FIRST,
310        "FULL": TokenType.FULL,
311        "FUNCTION": TokenType.FUNCTION,
312        "FOR": TokenType.FOR,
313        "FOREIGN KEY": TokenType.FOREIGN_KEY,
314        "FORMAT": TokenType.FORMAT,
315        "FROM": TokenType.FROM,
316        "GEOGRAPHY": TokenType.GEOGRAPHY,
317        "GEOMETRY": TokenType.GEOMETRY,
318        "GLOB": TokenType.GLOB,
319        "GROUP BY": TokenType.GROUP_BY,
320        "GROUPING SETS": TokenType.GROUPING_SETS,
321        "HAVING": TokenType.HAVING,
322        "ILIKE": TokenType.ILIKE,
323        "IN": TokenType.IN,
324        "INDEX": TokenType.INDEX,
325        "INET": TokenType.INET,
326        "INNER": TokenType.INNER,
327        "INSERT": TokenType.INSERT,
328        "INTERVAL": TokenType.INTERVAL,
329        "INTERSECT": TokenType.INTERSECT,
330        "INTO": TokenType.INTO,
331        "IS": TokenType.IS,
332        "ISNULL": TokenType.ISNULL,
333        "JOIN": TokenType.JOIN,
334        "KEEP": TokenType.KEEP,
335        "KILL": TokenType.KILL,
336        "LATERAL": TokenType.LATERAL,
337        "LEFT": TokenType.LEFT,
338        "LIKE": TokenType.LIKE,
339        "LIMIT": TokenType.LIMIT,
340        "LOAD": TokenType.LOAD,
341        "LOCALTIME": TokenType.LOCALTIME,
342        "LOCALTIMESTAMP": TokenType.LOCALTIMESTAMP,
343        "LOCK": TokenType.LOCK,
344        "MERGE": TokenType.MERGE,
345        "NAMESPACE": TokenType.NAMESPACE,
346        "NATURAL": TokenType.NATURAL,
347        "NEXT": TokenType.NEXT,
348        "NOT": TokenType.NOT,
349        "NOTNULL": TokenType.NOTNULL,
350        "NULL": TokenType.NULL,
351        "OBJECT": TokenType.OBJECT,
352        "OFFSET": TokenType.OFFSET,
353        "ON": TokenType.ON,
354        "OR": TokenType.OR,
355        "XOR": TokenType.XOR,
356        "ORDER BY": TokenType.ORDER_BY,
357        "ORDINALITY": TokenType.ORDINALITY,
358        "OUT": TokenType.OUT,
359        "OUTER": TokenType.OUTER,
360        "OVER": TokenType.OVER,
361        "OVERLAPS": TokenType.OVERLAPS,
362        "OVERWRITE": TokenType.OVERWRITE,
363        "PARTITION": TokenType.PARTITION,
364        "PARTITION BY": TokenType.PARTITION_BY,
365        "PARTITIONED BY": TokenType.PARTITION_BY,
366        "PARTITIONED_BY": TokenType.PARTITION_BY,
367        "PERCENT": TokenType.PERCENT,
368        "PIVOT": TokenType.PIVOT,
369        "PRAGMA": TokenType.PRAGMA,
370        "PRIMARY KEY": TokenType.PRIMARY_KEY,
371        "PROCEDURE": TokenType.PROCEDURE,
372        "OPERATOR": TokenType.OPERATOR,
373        "QUALIFY": TokenType.QUALIFY,
374        "RANGE": TokenType.RANGE,
375        "RECURSIVE": TokenType.RECURSIVE,
376        "REGEXP": TokenType.RLIKE,
377        "RENAME": TokenType.RENAME,
378        "REPLACE": TokenType.REPLACE,
379        "RETURNING": TokenType.RETURNING,
380        "REFERENCES": TokenType.REFERENCES,
381        "RIGHT": TokenType.RIGHT,
382        "RLIKE": TokenType.RLIKE,
383        "ROLLBACK": TokenType.ROLLBACK,
384        "ROLLUP": TokenType.ROLLUP,
385        "ROW": TokenType.ROW,
386        "ROWS": TokenType.ROWS,
387        "SCHEMA": TokenType.SCHEMA,
388        "SELECT": TokenType.SELECT,
389        "SEMI": TokenType.SEMI,
390        "SESSION": TokenType.SESSION,
391        "SESSION_USER": TokenType.SESSION_USER,
392        "SET": TokenType.SET,
393        "SETTINGS": TokenType.SETTINGS,
394        "SHOW": TokenType.SHOW,
395        "SIMILAR TO": TokenType.SIMILAR_TO,
396        "SOME": TokenType.SOME,
397        "SORT BY": TokenType.SORT_BY,
398        "SQL SECURITY": TokenType.SQL_SECURITY,
399        "STRAIGHT_JOIN": TokenType.STRAIGHT_JOIN,
400        "TABLE": TokenType.TABLE,
401        "TABLESAMPLE": TokenType.TABLE_SAMPLE,
402        "TEMP": TokenType.TEMPORARY,
403        "TEMPORARY": TokenType.TEMPORARY,
404        "THEN": TokenType.THEN,
405        "TRUE": TokenType.TRUE,
406        "TRUNCATE": TokenType.TRUNCATE,
407        "TRIGGER": TokenType.TRIGGER,
408        "UNION": TokenType.UNION,
409        "UNKNOWN": TokenType.UNKNOWN,
410        "UNNEST": TokenType.UNNEST,
411        "UNPIVOT": TokenType.UNPIVOT,
412        "UPDATE": TokenType.UPDATE,
413        "USE": TokenType.USE,
414        "USING": TokenType.USING,
415        "UUID": TokenType.UUID,
416        "VALUES": TokenType.VALUES,
417        "VIEW": TokenType.VIEW,
418        "VOLATILE": TokenType.VOLATILE,
419        "WHEN": TokenType.WHEN,
420        "WHERE": TokenType.WHERE,
421        "WINDOW": TokenType.WINDOW,
422        "WITH": TokenType.WITH,
423        "APPLY": TokenType.APPLY,
424        "ARRAY": TokenType.ARRAY,
425        "BIT": TokenType.BIT,
426        "BOOL": TokenType.BOOLEAN,
427        "BOOLEAN": TokenType.BOOLEAN,
428        "BYTE": TokenType.TINYINT,
429        "MEDIUMINT": TokenType.MEDIUMINT,
430        "INT1": TokenType.TINYINT,
431        "TINYINT": TokenType.TINYINT,
432        "INT16": TokenType.SMALLINT,
433        "SHORT": TokenType.SMALLINT,
434        "SMALLINT": TokenType.SMALLINT,
435        "HUGEINT": TokenType.INT128,
436        "UHUGEINT": TokenType.UINT128,
437        "INT2": TokenType.SMALLINT,
438        "INTEGER": TokenType.INT,
439        "INT": TokenType.INT,
440        "INT4": TokenType.INT,
441        "INT32": TokenType.INT,
442        "INT64": TokenType.BIGINT,
443        "INT128": TokenType.INT128,
444        "INT256": TokenType.INT256,
445        "LONG": TokenType.BIGINT,
446        "BIGINT": TokenType.BIGINT,
447        "INT8": TokenType.TINYINT,
448        "UINT": TokenType.UINT,
449        "UINT128": TokenType.UINT128,
450        "UINT256": TokenType.UINT256,
451        "DEC": TokenType.DECIMAL,
452        "DECIMAL": TokenType.DECIMAL,
453        "DECIMAL32": TokenType.DECIMAL32,
454        "DECIMAL64": TokenType.DECIMAL64,
455        "DECIMAL128": TokenType.DECIMAL128,
456        "DECIMAL256": TokenType.DECIMAL256,
457        "DECFLOAT": TokenType.DECFLOAT,
458        "BIGDECIMAL": TokenType.BIGDECIMAL,
459        "BIGNUMERIC": TokenType.BIGDECIMAL,
460        "BIGNUM": TokenType.BIGNUM,
461        "LIST": TokenType.LIST,
462        "MAP": TokenType.MAP,
463        "NULLABLE": TokenType.NULLABLE,
464        "NUMBER": TokenType.DECIMAL,
465        "NUMERIC": TokenType.DECIMAL,
466        "FIXED": TokenType.DECIMAL,
467        "REAL": TokenType.FLOAT,
468        "FLOAT": TokenType.FLOAT,
469        "FLOAT4": TokenType.FLOAT,
470        "FLOAT8": TokenType.DOUBLE,
471        "DOUBLE": TokenType.DOUBLE,
472        "DOUBLE PRECISION": TokenType.DOUBLE,
473        "JSON": TokenType.JSON,
474        "JSONB": TokenType.JSONB,
475        "CHAR": TokenType.CHAR,
476        "CHARACTER": TokenType.CHAR,
477        "CHAR VARYING": TokenType.VARCHAR,
478        "CHARACTER VARYING": TokenType.VARCHAR,
479        "NCHAR": TokenType.NCHAR,
480        "VARCHAR": TokenType.VARCHAR,
481        "VARCHAR2": TokenType.VARCHAR,
482        "NVARCHAR": TokenType.NVARCHAR,
483        "NVARCHAR2": TokenType.NVARCHAR,
484        "BPCHAR": TokenType.BPCHAR,
485        "STR": TokenType.TEXT,
486        "STRING": TokenType.TEXT,
487        "TEXT": TokenType.TEXT,
488        "LONGTEXT": TokenType.LONGTEXT,
489        "MEDIUMTEXT": TokenType.MEDIUMTEXT,
490        "TINYTEXT": TokenType.TINYTEXT,
491        "CLOB": TokenType.TEXT,
492        "LONGVARCHAR": TokenType.TEXT,
493        "BINARY": TokenType.BINARY,
494        "BLOB": TokenType.VARBINARY,
495        "LONGBLOB": TokenType.LONGBLOB,
496        "MEDIUMBLOB": TokenType.MEDIUMBLOB,
497        "TINYBLOB": TokenType.TINYBLOB,
498        "BYTEA": TokenType.VARBINARY,
499        "VARBINARY": TokenType.VARBINARY,
500        "TIME": TokenType.TIME,
501        "TIMETZ": TokenType.TIMETZ,
502        "TIME_NS": TokenType.TIME_NS,
503        "TIMESTAMP": TokenType.TIMESTAMP,
504        "TIMESTAMPTZ": TokenType.TIMESTAMPTZ,
505        "TIMESTAMPLTZ": TokenType.TIMESTAMPLTZ,
506        "TIMESTAMP_LTZ": TokenType.TIMESTAMPLTZ,
507        "TIMESTAMPNTZ": TokenType.TIMESTAMPNTZ,
508        "TIMESTAMP_NTZ": TokenType.TIMESTAMPNTZ,
509        "DATE": TokenType.DATE,
510        "DATETIME": TokenType.DATETIME,
511        "INT4RANGE": TokenType.INT4RANGE,
512        "INT4MULTIRANGE": TokenType.INT4MULTIRANGE,
513        "INT8RANGE": TokenType.INT8RANGE,
514        "INT8MULTIRANGE": TokenType.INT8MULTIRANGE,
515        "NUMRANGE": TokenType.NUMRANGE,
516        "NUMMULTIRANGE": TokenType.NUMMULTIRANGE,
517        "TSRANGE": TokenType.TSRANGE,
518        "TSMULTIRANGE": TokenType.TSMULTIRANGE,
519        "TSTZRANGE": TokenType.TSTZRANGE,
520        "TSTZMULTIRANGE": TokenType.TSTZMULTIRANGE,
521        "DATERANGE": TokenType.DATERANGE,
522        "DATEMULTIRANGE": TokenType.DATEMULTIRANGE,
523        "UNIQUE": TokenType.UNIQUE,
524        "VECTOR": TokenType.VECTOR,
525        "STRUCT": TokenType.STRUCT,
526        "SEQUENCE": TokenType.SEQUENCE,
527        "VARIANT": TokenType.VARIANT,
528        "ALTER": TokenType.ALTER,
529        "ANALYZE": TokenType.ANALYZE,
530        "CALL": TokenType.COMMAND,
531        "COMMENT": TokenType.COMMENT,
532        "EXPLAIN": TokenType.COMMAND,
533        "GRANT": TokenType.GRANT,
534        "REVOKE": TokenType.REVOKE,
535        "OPTIMIZE": TokenType.COMMAND,
536        "PREPARE": TokenType.COMMAND,
537        "VACUUM": TokenType.COMMAND,
538        "USER-DEFINED": TokenType.USERDEFINED,
539    }
540
541    COMMANDS = {
542        TokenType.COMMAND,
543        TokenType.EXECUTE,
544        TokenType.FETCH,
545        TokenType.SHOW,
546        TokenType.RENAME,
547    }
548
549    COMMAND_PREFIX_TOKENS = {TokenType.SEMICOLON, TokenType.BEGIN}
550
551    # Handle numeric literals like in hive (3L = BIGINT)
552    NUMERIC_LITERALS: t.ClassVar[dict[str, str]] = {}
553
554    # In tokenizers like JSONPath, dots are always key separators, never decimal points
555    NUMBERS_CAN_HAVE_DECIMALS: t.ClassVar[bool] = True
556
557    COMMENTS = ["--", ("/*", "*/")]
558
559    __slots__ = (
560        "dialect",
561        "_core",
562    )
563
564    def __init__(self, dialect: DialectType = None) -> None:
565        from sqlglot.dialects.dialect import Dialect
566
567        self.dialect = Dialect.get_or_raise(dialect)
568        self._core = self._init_core()
569
570    def _init_core(self) -> TokenizerCore:
571        return TokenizerCore(
572            single_tokens=self.SINGLE_TOKENS,
573            keywords=self.KEYWORDS,
574            quotes=self._QUOTES,
575            format_strings=self._FORMAT_STRINGS,
576            identifiers=self._IDENTIFIERS,
577            comments=self._COMMENTS,
578            string_escapes=self._STRING_ESCAPES,
579            byte_string_escapes=self._BYTE_STRING_ESCAPES,
580            identifier_escapes=self._IDENTIFIER_ESCAPES,
581            commands=self.COMMANDS,
582            command_prefix_tokens=self.COMMAND_PREFIX_TOKENS,
583            nested_comments=self.NESTED_COMMENTS,
584            dash_comment_requires_boundary=self.DASH_COMMENT_REQUIRES_BOUNDARY,
585            comments_terminate_at_newline_only=self.COMMENTS_TERMINATE_AT_NEWLINE_ONLY,
586            hint_start=self.HINT_START,
587            tokens_preceding_hint=self.TOKENS_PRECEDING_HINT,
588            has_bit_strings=bool(self.BIT_STRINGS),
589            has_hex_strings=bool(self.HEX_STRINGS),
590            numeric_literals=self.NUMERIC_LITERALS,
591            var_single_tokens=self.VAR_SINGLE_TOKENS,
592            string_escapes_allowed_in_raw_strings=self.STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS,
593            heredoc_tag_is_identifier=self.HEREDOC_TAG_IS_IDENTIFIER,
594            heredoc_string_alternative=self.HEREDOC_STRING_ALTERNATIVE,
595            keyword_trie=self._KEYWORD_TRIE,
596            numbers_can_be_underscore_separated=self.dialect.NUMBERS_CAN_BE_UNDERSCORE_SEPARATED,
597            numbers_can_have_decimals=self.NUMBERS_CAN_HAVE_DECIMALS,
598            identifiers_can_start_with_digit=self.dialect.IDENTIFIERS_CAN_START_WITH_DIGIT,
599            unescaped_sequences=self.dialect.UNESCAPED_SEQUENCES,
600            numeric_escapes=self.NUMERIC_ESCAPES,
601            drop_unknown_escapes=self.DROP_UNKNOWN_ESCAPES,
602            numeric_escapes_are_bytes=self.NUMERIC_ESCAPES_ARE_BYTES,
603            byte_strings_are_bytes=self.dialect.BYTE_STRING_IS_BYTES_TYPE,
604            lone_surrogate_replacement=self.LONE_SURROGATE_REPLACEMENT,
605        )
606
607    def tokenize(self, sql: str) -> list[Token]:
608        """Returns a list of tokens corresponding to the SQL string `sql`."""
609        return self._core.tokenize(sql)  # type: ignore
610
611    @property
612    def sql(self) -> str:
613        """The SQL string being tokenized."""
614        return self._core.sql
615
616    @property
617    def size(self) -> int:
618        """Length of the SQL string."""
619        return self._core.size
620
621    @property
622    def tokens(self) -> list[Token]:
623        """The list of tokens produced by tokenization."""
624        return self._core.tokens
SQLGLOTC_INSTALLED = False
class Tokenizer(_TokenizerBase):
127class Tokenizer(_TokenizerBase):
128    SINGLE_TOKENS = {
129        "(": TokenType.L_PAREN,
130        ")": TokenType.R_PAREN,
131        "[": TokenType.L_BRACKET,
132        "]": TokenType.R_BRACKET,
133        "{": TokenType.L_BRACE,
134        "}": TokenType.R_BRACE,
135        "&": TokenType.AMP,
136        "^": TokenType.CARET,
137        ":": TokenType.COLON,
138        ",": TokenType.COMMA,
139        ".": TokenType.DOT,
140        "-": TokenType.DASH,
141        "=": TokenType.EQ,
142        ">": TokenType.GT,
143        "<": TokenType.LT,
144        "%": TokenType.MOD,
145        "!": TokenType.NOT,
146        "|": TokenType.PIPE,
147        "+": TokenType.PLUS,
148        ";": TokenType.SEMICOLON,
149        "/": TokenType.SLASH,
150        "\\": TokenType.BACKSLASH,
151        "*": TokenType.STAR,
152        "~": TokenType.TILDE,
153        "?": TokenType.PLACEHOLDER,
154        "@": TokenType.PARAMETER,
155        "#": TokenType.HASH,
156        # Used for breaking a var like x'y' but nothing else the token type doesn't matter
157        "'": TokenType.UNKNOWN,
158        "`": TokenType.UNKNOWN,
159        '"': TokenType.UNKNOWN,
160    }
161
162    BIT_STRINGS: t.ClassVar[list[str | tuple[str, str]]] = []
163    BYTE_STRINGS: t.ClassVar[list[str | tuple[str, str]]] = []
164    HEX_STRINGS: t.ClassVar[list[str | tuple[str, str]]] = []
165    RAW_STRINGS: t.ClassVar[list[str | tuple[str, str]]] = []
166    HEREDOC_STRINGS: t.ClassVar[list[str | tuple[str, str]]] = []
167    UNICODE_STRINGS: t.ClassVar[list[str | tuple[str, str]]] = []
168    IDENTIFIERS: t.ClassVar[list[str | tuple[str, str]]] = ['"']
169    QUOTES: t.ClassVar[list[tuple[str, str] | str]] = ["'"]
170    STRING_ESCAPES: t.ClassVar[list[str]] = ["'"]
171    BYTE_STRING_ESCAPES: t.ClassVar[list[str]] = []
172    VAR_SINGLE_TOKENS: t.ClassVar[set[str]] = set()
173
174    # The strings in this list can always be used as escapes, regardless of the surrounding
175    # identifier delimiters. By default, the closing delimiter is assumed to also act as an
176    # identifier escape, e.g. if we use double-quotes, then they also act as escapes: "x"""
177    IDENTIFIER_ESCAPES: t.ClassVar[list[str]] = []
178
179    # Whether the heredoc tags follow the same lexical rules as unquoted identifiers
180    HEREDOC_TAG_IS_IDENTIFIER = False
181
182    # Token that we'll generate as a fallback if the heredoc prefix doesn't correspond to a heredoc
183    HEREDOC_STRING_ALTERNATIVE = TokenType.VAR
184
185    # Whether string escape characters function as such when placed within raw strings
186    STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS = True
187
188    # Maps the char after a backslash to (base, min digits, max digits, max value) for escape
189    # sequences that encode a code point, e.g. {"x": (16, 2, 2, 0xFF)} decodes '\x41' as 'A'.
190    # Digits are read until the next one would exceed the max value; if fewer than the min digits
191    # are read, the sequence isn't decoded. Octal escapes, e.g. '\101', are keyed by "0".
192    NUMERIC_ESCAPES: t.ClassVar[dict[str, tuple[int, int, int, int]]] = {}
193
194    # Whether the backslash is dropped from escape sequences that aren't otherwise decoded,
195    # e.g. '\z' is 'z'
196    DROP_UNKNOWN_ESCAPES = False
197
198    # Whether byte-valued numeric escapes (e.g. \xhh) are raw bytes, so that consecutive ones are
199    # decoded together as UTF-8, e.g. '\xC3\xA9' is 'é' instead of 'é'
200    NUMERIC_ESCAPES_ARE_BYTES = False
201
202    # What an unpaired surrogate escape (e.g. \uD800) decodes to. If empty, it isn't decoded
203    LONE_SURROGATE_REPLACEMENT = ""
204
205    NESTED_COMMENTS = True
206
207    # Whether "--" only starts a comment when followed by whitespace or a control character
208    DASH_COMMENT_REQUIRES_BOUNDARY = False
209
210    # Whether "--"/"#" line comments are terminated only by "\n", and not also by "\r"
211    COMMENTS_TERMINATE_AT_NEWLINE_ONLY = False
212
213    HINT_START = "/*+"
214
215    TOKENS_PRECEDING_HINT = {TokenType.SELECT, TokenType.INSERT, TokenType.UPDATE, TokenType.DELETE}
216
217    # Autofilled
218    _COMMENTS: t.ClassVar[dict[str, str | None]] = {}
219    _FORMAT_STRINGS: t.ClassVar[dict[str, tuple[str, TokenType]]] = {}
220    _IDENTIFIERS: t.ClassVar[dict[str, str]] = {}
221    _IDENTIFIER_ESCAPES: t.ClassVar[set[str]] = set()
222    _QUOTES: t.ClassVar[dict[str, str]] = {}
223    _STRING_ESCAPES: t.ClassVar[set[str]] = set()
224    _BYTE_STRING_ESCAPES: t.ClassVar[set[str]] = set()
225    _KEYWORD_TRIE: t.ClassVar[dict[str | int, object]] = {}
226
227    KEYWORDS: t.ClassVar[dict[str, TokenType]] = {
228        **{f"{{%{postfix}": TokenType.BLOCK_START for postfix in ("", "+", "-")},
229        **{f"{prefix}%}}": TokenType.BLOCK_END for prefix in ("", "+", "-")},
230        **{f"{{{{{postfix}": TokenType.BLOCK_START for postfix in ("+", "-")},
231        **{f"{prefix}}}}}": TokenType.BLOCK_END for prefix in ("+", "-")},
232        HINT_START: TokenType.HINT,
233        "&<": TokenType.AMP_LT,
234        "&>": TokenType.AMP_GT,
235        "==": TokenType.EQ,
236        "::": TokenType.DCOLON,
237        "?::": TokenType.QDCOLON,
238        "||": TokenType.DPIPE,
239        "|>": TokenType.PIPE_GT,
240        ">=": TokenType.GTE,
241        "<=": TokenType.LTE,
242        "<>": TokenType.NEQ,
243        "!=": TokenType.NEQ,
244        ":=": TokenType.COLON_EQ,
245        "<=>": TokenType.NULLSAFE_EQ,
246        "->": TokenType.ARROW,
247        "->>": TokenType.DARROW,
248        "=>": TokenType.FARROW,
249        "#>": TokenType.HASH_ARROW,
250        "#>>": TokenType.DHASH_ARROW,
251        "<->": TokenType.LR_ARROW,
252        "<<->>": TokenType.LLRR_ARROW,
253        "&&": TokenType.DAMP,
254        "??": TokenType.DQMARK,
255        "~~~": TokenType.GLOB,
256        "~~": TokenType.LIKE,
257        "~~*": TokenType.ILIKE,
258        "~*": TokenType.IRLIKE,
259        "-|-": TokenType.ADJACENT,
260        "ALL": TokenType.ALL,
261        "AND": TokenType.AND,
262        "ANTI": TokenType.ANTI,
263        "ANY": TokenType.ANY,
264        "ASC": TokenType.ASC,
265        "AS": TokenType.ALIAS,
266        "ASOF": TokenType.ASOF,
267        "AUTOINCREMENT": TokenType.AUTO_INCREMENT,
268        "AUTO_INCREMENT": TokenType.AUTO_INCREMENT,
269        "BEGIN": TokenType.BEGIN,
270        "BETWEEN": TokenType.BETWEEN,
271        "CACHE": TokenType.CACHE,
272        "UNCACHE": TokenType.UNCACHE,
273        "CASE": TokenType.CASE,
274        "CLUSTER BY": TokenType.CLUSTER_BY,
275        "COLLATE": TokenType.COLLATE,
276        "COLUMN": TokenType.COLUMN,
277        "COMMIT": TokenType.COMMIT,
278        "CONNECT BY": TokenType.CONNECT_BY,
279        "CONSTRAINT": TokenType.CONSTRAINT,
280        "COPY": TokenType.COPY,
281        "CREATE": TokenType.CREATE,
282        "CROSS": TokenType.CROSS,
283        "CUBE": TokenType.CUBE,
284        "CURRENT_DATE": TokenType.CURRENT_DATE,
285        "CURRENT_SCHEMA": TokenType.CURRENT_SCHEMA,
286        "CURRENT_TIME": TokenType.CURRENT_TIME,
287        "CURRENT_TIMESTAMP": TokenType.CURRENT_TIMESTAMP,
288        "CURRENT_USER": TokenType.CURRENT_USER,
289        "CURRENT_CATALOG": TokenType.CURRENT_CATALOG,
290        "DATABASE": TokenType.DATABASE,
291        "DEFAULT": TokenType.DEFAULT,
292        "DELETE": TokenType.DELETE,
293        "DESC": TokenType.DESC,
294        "DESCRIBE": TokenType.DESCRIBE,
295        "DISTINCT": TokenType.DISTINCT,
296        "DISTRIBUTE BY": TokenType.DISTRIBUTE_BY,
297        "DIV": TokenType.DIV,
298        "DROP": TokenType.DROP,
299        "ELSE": TokenType.ELSE,
300        "END": TokenType.END,
301        "ENUM": TokenType.ENUM,
302        "ESCAPE": TokenType.ESCAPE,
303        "EXCEPT": TokenType.EXCEPT,
304        "EXECUTE": TokenType.EXECUTE,
305        "EXISTS": TokenType.EXISTS,
306        "FALSE": TokenType.FALSE,
307        "FETCH": TokenType.FETCH,
308        "FILTER": TokenType.FILTER,
309        "FILE": TokenType.FILE,
310        "FIRST": TokenType.FIRST,
311        "FULL": TokenType.FULL,
312        "FUNCTION": TokenType.FUNCTION,
313        "FOR": TokenType.FOR,
314        "FOREIGN KEY": TokenType.FOREIGN_KEY,
315        "FORMAT": TokenType.FORMAT,
316        "FROM": TokenType.FROM,
317        "GEOGRAPHY": TokenType.GEOGRAPHY,
318        "GEOMETRY": TokenType.GEOMETRY,
319        "GLOB": TokenType.GLOB,
320        "GROUP BY": TokenType.GROUP_BY,
321        "GROUPING SETS": TokenType.GROUPING_SETS,
322        "HAVING": TokenType.HAVING,
323        "ILIKE": TokenType.ILIKE,
324        "IN": TokenType.IN,
325        "INDEX": TokenType.INDEX,
326        "INET": TokenType.INET,
327        "INNER": TokenType.INNER,
328        "INSERT": TokenType.INSERT,
329        "INTERVAL": TokenType.INTERVAL,
330        "INTERSECT": TokenType.INTERSECT,
331        "INTO": TokenType.INTO,
332        "IS": TokenType.IS,
333        "ISNULL": TokenType.ISNULL,
334        "JOIN": TokenType.JOIN,
335        "KEEP": TokenType.KEEP,
336        "KILL": TokenType.KILL,
337        "LATERAL": TokenType.LATERAL,
338        "LEFT": TokenType.LEFT,
339        "LIKE": TokenType.LIKE,
340        "LIMIT": TokenType.LIMIT,
341        "LOAD": TokenType.LOAD,
342        "LOCALTIME": TokenType.LOCALTIME,
343        "LOCALTIMESTAMP": TokenType.LOCALTIMESTAMP,
344        "LOCK": TokenType.LOCK,
345        "MERGE": TokenType.MERGE,
346        "NAMESPACE": TokenType.NAMESPACE,
347        "NATURAL": TokenType.NATURAL,
348        "NEXT": TokenType.NEXT,
349        "NOT": TokenType.NOT,
350        "NOTNULL": TokenType.NOTNULL,
351        "NULL": TokenType.NULL,
352        "OBJECT": TokenType.OBJECT,
353        "OFFSET": TokenType.OFFSET,
354        "ON": TokenType.ON,
355        "OR": TokenType.OR,
356        "XOR": TokenType.XOR,
357        "ORDER BY": TokenType.ORDER_BY,
358        "ORDINALITY": TokenType.ORDINALITY,
359        "OUT": TokenType.OUT,
360        "OUTER": TokenType.OUTER,
361        "OVER": TokenType.OVER,
362        "OVERLAPS": TokenType.OVERLAPS,
363        "OVERWRITE": TokenType.OVERWRITE,
364        "PARTITION": TokenType.PARTITION,
365        "PARTITION BY": TokenType.PARTITION_BY,
366        "PARTITIONED BY": TokenType.PARTITION_BY,
367        "PARTITIONED_BY": TokenType.PARTITION_BY,
368        "PERCENT": TokenType.PERCENT,
369        "PIVOT": TokenType.PIVOT,
370        "PRAGMA": TokenType.PRAGMA,
371        "PRIMARY KEY": TokenType.PRIMARY_KEY,
372        "PROCEDURE": TokenType.PROCEDURE,
373        "OPERATOR": TokenType.OPERATOR,
374        "QUALIFY": TokenType.QUALIFY,
375        "RANGE": TokenType.RANGE,
376        "RECURSIVE": TokenType.RECURSIVE,
377        "REGEXP": TokenType.RLIKE,
378        "RENAME": TokenType.RENAME,
379        "REPLACE": TokenType.REPLACE,
380        "RETURNING": TokenType.RETURNING,
381        "REFERENCES": TokenType.REFERENCES,
382        "RIGHT": TokenType.RIGHT,
383        "RLIKE": TokenType.RLIKE,
384        "ROLLBACK": TokenType.ROLLBACK,
385        "ROLLUP": TokenType.ROLLUP,
386        "ROW": TokenType.ROW,
387        "ROWS": TokenType.ROWS,
388        "SCHEMA": TokenType.SCHEMA,
389        "SELECT": TokenType.SELECT,
390        "SEMI": TokenType.SEMI,
391        "SESSION": TokenType.SESSION,
392        "SESSION_USER": TokenType.SESSION_USER,
393        "SET": TokenType.SET,
394        "SETTINGS": TokenType.SETTINGS,
395        "SHOW": TokenType.SHOW,
396        "SIMILAR TO": TokenType.SIMILAR_TO,
397        "SOME": TokenType.SOME,
398        "SORT BY": TokenType.SORT_BY,
399        "SQL SECURITY": TokenType.SQL_SECURITY,
400        "STRAIGHT_JOIN": TokenType.STRAIGHT_JOIN,
401        "TABLE": TokenType.TABLE,
402        "TABLESAMPLE": TokenType.TABLE_SAMPLE,
403        "TEMP": TokenType.TEMPORARY,
404        "TEMPORARY": TokenType.TEMPORARY,
405        "THEN": TokenType.THEN,
406        "TRUE": TokenType.TRUE,
407        "TRUNCATE": TokenType.TRUNCATE,
408        "TRIGGER": TokenType.TRIGGER,
409        "UNION": TokenType.UNION,
410        "UNKNOWN": TokenType.UNKNOWN,
411        "UNNEST": TokenType.UNNEST,
412        "UNPIVOT": TokenType.UNPIVOT,
413        "UPDATE": TokenType.UPDATE,
414        "USE": TokenType.USE,
415        "USING": TokenType.USING,
416        "UUID": TokenType.UUID,
417        "VALUES": TokenType.VALUES,
418        "VIEW": TokenType.VIEW,
419        "VOLATILE": TokenType.VOLATILE,
420        "WHEN": TokenType.WHEN,
421        "WHERE": TokenType.WHERE,
422        "WINDOW": TokenType.WINDOW,
423        "WITH": TokenType.WITH,
424        "APPLY": TokenType.APPLY,
425        "ARRAY": TokenType.ARRAY,
426        "BIT": TokenType.BIT,
427        "BOOL": TokenType.BOOLEAN,
428        "BOOLEAN": TokenType.BOOLEAN,
429        "BYTE": TokenType.TINYINT,
430        "MEDIUMINT": TokenType.MEDIUMINT,
431        "INT1": TokenType.TINYINT,
432        "TINYINT": TokenType.TINYINT,
433        "INT16": TokenType.SMALLINT,
434        "SHORT": TokenType.SMALLINT,
435        "SMALLINT": TokenType.SMALLINT,
436        "HUGEINT": TokenType.INT128,
437        "UHUGEINT": TokenType.UINT128,
438        "INT2": TokenType.SMALLINT,
439        "INTEGER": TokenType.INT,
440        "INT": TokenType.INT,
441        "INT4": TokenType.INT,
442        "INT32": TokenType.INT,
443        "INT64": TokenType.BIGINT,
444        "INT128": TokenType.INT128,
445        "INT256": TokenType.INT256,
446        "LONG": TokenType.BIGINT,
447        "BIGINT": TokenType.BIGINT,
448        "INT8": TokenType.TINYINT,
449        "UINT": TokenType.UINT,
450        "UINT128": TokenType.UINT128,
451        "UINT256": TokenType.UINT256,
452        "DEC": TokenType.DECIMAL,
453        "DECIMAL": TokenType.DECIMAL,
454        "DECIMAL32": TokenType.DECIMAL32,
455        "DECIMAL64": TokenType.DECIMAL64,
456        "DECIMAL128": TokenType.DECIMAL128,
457        "DECIMAL256": TokenType.DECIMAL256,
458        "DECFLOAT": TokenType.DECFLOAT,
459        "BIGDECIMAL": TokenType.BIGDECIMAL,
460        "BIGNUMERIC": TokenType.BIGDECIMAL,
461        "BIGNUM": TokenType.BIGNUM,
462        "LIST": TokenType.LIST,
463        "MAP": TokenType.MAP,
464        "NULLABLE": TokenType.NULLABLE,
465        "NUMBER": TokenType.DECIMAL,
466        "NUMERIC": TokenType.DECIMAL,
467        "FIXED": TokenType.DECIMAL,
468        "REAL": TokenType.FLOAT,
469        "FLOAT": TokenType.FLOAT,
470        "FLOAT4": TokenType.FLOAT,
471        "FLOAT8": TokenType.DOUBLE,
472        "DOUBLE": TokenType.DOUBLE,
473        "DOUBLE PRECISION": TokenType.DOUBLE,
474        "JSON": TokenType.JSON,
475        "JSONB": TokenType.JSONB,
476        "CHAR": TokenType.CHAR,
477        "CHARACTER": TokenType.CHAR,
478        "CHAR VARYING": TokenType.VARCHAR,
479        "CHARACTER VARYING": TokenType.VARCHAR,
480        "NCHAR": TokenType.NCHAR,
481        "VARCHAR": TokenType.VARCHAR,
482        "VARCHAR2": TokenType.VARCHAR,
483        "NVARCHAR": TokenType.NVARCHAR,
484        "NVARCHAR2": TokenType.NVARCHAR,
485        "BPCHAR": TokenType.BPCHAR,
486        "STR": TokenType.TEXT,
487        "STRING": TokenType.TEXT,
488        "TEXT": TokenType.TEXT,
489        "LONGTEXT": TokenType.LONGTEXT,
490        "MEDIUMTEXT": TokenType.MEDIUMTEXT,
491        "TINYTEXT": TokenType.TINYTEXT,
492        "CLOB": TokenType.TEXT,
493        "LONGVARCHAR": TokenType.TEXT,
494        "BINARY": TokenType.BINARY,
495        "BLOB": TokenType.VARBINARY,
496        "LONGBLOB": TokenType.LONGBLOB,
497        "MEDIUMBLOB": TokenType.MEDIUMBLOB,
498        "TINYBLOB": TokenType.TINYBLOB,
499        "BYTEA": TokenType.VARBINARY,
500        "VARBINARY": TokenType.VARBINARY,
501        "TIME": TokenType.TIME,
502        "TIMETZ": TokenType.TIMETZ,
503        "TIME_NS": TokenType.TIME_NS,
504        "TIMESTAMP": TokenType.TIMESTAMP,
505        "TIMESTAMPTZ": TokenType.TIMESTAMPTZ,
506        "TIMESTAMPLTZ": TokenType.TIMESTAMPLTZ,
507        "TIMESTAMP_LTZ": TokenType.TIMESTAMPLTZ,
508        "TIMESTAMPNTZ": TokenType.TIMESTAMPNTZ,
509        "TIMESTAMP_NTZ": TokenType.TIMESTAMPNTZ,
510        "DATE": TokenType.DATE,
511        "DATETIME": TokenType.DATETIME,
512        "INT4RANGE": TokenType.INT4RANGE,
513        "INT4MULTIRANGE": TokenType.INT4MULTIRANGE,
514        "INT8RANGE": TokenType.INT8RANGE,
515        "INT8MULTIRANGE": TokenType.INT8MULTIRANGE,
516        "NUMRANGE": TokenType.NUMRANGE,
517        "NUMMULTIRANGE": TokenType.NUMMULTIRANGE,
518        "TSRANGE": TokenType.TSRANGE,
519        "TSMULTIRANGE": TokenType.TSMULTIRANGE,
520        "TSTZRANGE": TokenType.TSTZRANGE,
521        "TSTZMULTIRANGE": TokenType.TSTZMULTIRANGE,
522        "DATERANGE": TokenType.DATERANGE,
523        "DATEMULTIRANGE": TokenType.DATEMULTIRANGE,
524        "UNIQUE": TokenType.UNIQUE,
525        "VECTOR": TokenType.VECTOR,
526        "STRUCT": TokenType.STRUCT,
527        "SEQUENCE": TokenType.SEQUENCE,
528        "VARIANT": TokenType.VARIANT,
529        "ALTER": TokenType.ALTER,
530        "ANALYZE": TokenType.ANALYZE,
531        "CALL": TokenType.COMMAND,
532        "COMMENT": TokenType.COMMENT,
533        "EXPLAIN": TokenType.COMMAND,
534        "GRANT": TokenType.GRANT,
535        "REVOKE": TokenType.REVOKE,
536        "OPTIMIZE": TokenType.COMMAND,
537        "PREPARE": TokenType.COMMAND,
538        "VACUUM": TokenType.COMMAND,
539        "USER-DEFINED": TokenType.USERDEFINED,
540    }
541
542    COMMANDS = {
543        TokenType.COMMAND,
544        TokenType.EXECUTE,
545        TokenType.FETCH,
546        TokenType.SHOW,
547        TokenType.RENAME,
548    }
549
550    COMMAND_PREFIX_TOKENS = {TokenType.SEMICOLON, TokenType.BEGIN}
551
552    # Handle numeric literals like in hive (3L = BIGINT)
553    NUMERIC_LITERALS: t.ClassVar[dict[str, str]] = {}
554
555    # In tokenizers like JSONPath, dots are always key separators, never decimal points
556    NUMBERS_CAN_HAVE_DECIMALS: t.ClassVar[bool] = True
557
558    COMMENTS = ["--", ("/*", "*/")]
559
560    __slots__ = (
561        "dialect",
562        "_core",
563    )
564
565    def __init__(self, dialect: DialectType = None) -> None:
566        from sqlglot.dialects.dialect import Dialect
567
568        self.dialect = Dialect.get_or_raise(dialect)
569        self._core = self._init_core()
570
571    def _init_core(self) -> TokenizerCore:
572        return TokenizerCore(
573            single_tokens=self.SINGLE_TOKENS,
574            keywords=self.KEYWORDS,
575            quotes=self._QUOTES,
576            format_strings=self._FORMAT_STRINGS,
577            identifiers=self._IDENTIFIERS,
578            comments=self._COMMENTS,
579            string_escapes=self._STRING_ESCAPES,
580            byte_string_escapes=self._BYTE_STRING_ESCAPES,
581            identifier_escapes=self._IDENTIFIER_ESCAPES,
582            commands=self.COMMANDS,
583            command_prefix_tokens=self.COMMAND_PREFIX_TOKENS,
584            nested_comments=self.NESTED_COMMENTS,
585            dash_comment_requires_boundary=self.DASH_COMMENT_REQUIRES_BOUNDARY,
586            comments_terminate_at_newline_only=self.COMMENTS_TERMINATE_AT_NEWLINE_ONLY,
587            hint_start=self.HINT_START,
588            tokens_preceding_hint=self.TOKENS_PRECEDING_HINT,
589            has_bit_strings=bool(self.BIT_STRINGS),
590            has_hex_strings=bool(self.HEX_STRINGS),
591            numeric_literals=self.NUMERIC_LITERALS,
592            var_single_tokens=self.VAR_SINGLE_TOKENS,
593            string_escapes_allowed_in_raw_strings=self.STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS,
594            heredoc_tag_is_identifier=self.HEREDOC_TAG_IS_IDENTIFIER,
595            heredoc_string_alternative=self.HEREDOC_STRING_ALTERNATIVE,
596            keyword_trie=self._KEYWORD_TRIE,
597            numbers_can_be_underscore_separated=self.dialect.NUMBERS_CAN_BE_UNDERSCORE_SEPARATED,
598            numbers_can_have_decimals=self.NUMBERS_CAN_HAVE_DECIMALS,
599            identifiers_can_start_with_digit=self.dialect.IDENTIFIERS_CAN_START_WITH_DIGIT,
600            unescaped_sequences=self.dialect.UNESCAPED_SEQUENCES,
601            numeric_escapes=self.NUMERIC_ESCAPES,
602            drop_unknown_escapes=self.DROP_UNKNOWN_ESCAPES,
603            numeric_escapes_are_bytes=self.NUMERIC_ESCAPES_ARE_BYTES,
604            byte_strings_are_bytes=self.dialect.BYTE_STRING_IS_BYTES_TYPE,
605            lone_surrogate_replacement=self.LONE_SURROGATE_REPLACEMENT,
606        )
607
608    def tokenize(self, sql: str) -> list[Token]:
609        """Returns a list of tokens corresponding to the SQL string `sql`."""
610        return self._core.tokenize(sql)  # type: ignore
611
612    @property
613    def sql(self) -> str:
614        """The SQL string being tokenized."""
615        return self._core.sql
616
617    @property
618    def size(self) -> int:
619        """Length of the SQL string."""
620        return self._core.size
621
622    @property
623    def tokens(self) -> list[Token]:
624        """The list of tokens produced by tokenization."""
625        return self._core.tokens
Tokenizer( dialect: Union[str, sqlglot.dialects.Dialect, type[sqlglot.dialects.Dialect], NoneType] = None)
565    def __init__(self, dialect: DialectType = None) -> None:
566        from sqlglot.dialects.dialect import Dialect
567
568        self.dialect = Dialect.get_or_raise(dialect)
569        self._core = self._init_core()
SINGLE_TOKENS = {'(': <TokenType.L_PAREN: 1>, ')': <TokenType.R_PAREN: 2>, '[': <TokenType.L_BRACKET: 3>, ']': <TokenType.R_BRACKET: 4>, '{': <TokenType.L_BRACE: 5>, '}': <TokenType.R_BRACE: 6>, '&': <TokenType.AMP: 36>, '^': <TokenType.CARET: 42>, ':': <TokenType.COLON: 11>, ',': <TokenType.COMMA: 7>, '.': <TokenType.DOT: 8>, '-': <TokenType.DASH: 9>, '=': <TokenType.EQ: 28>, '>': <TokenType.GT: 25>, '<': <TokenType.LT: 23>, '%': <TokenType.MOD: 329>, '!': <TokenType.NOT: 27>, '|': <TokenType.PIPE: 39>, '+': <TokenType.PLUS: 10>, ';': <TokenType.SEMICOLON: 19>, '/': <TokenType.SLASH: 22>, '\\': <TokenType.BACKSLASH: 21>, '*': <TokenType.STAR: 20>, '~': <TokenType.TILDE: 44>, '?': <TokenType.PLACEHOLDER: 356>, '@': <TokenType.PARAMETER: 58>, '#': <TokenType.HASH: 48>, "'": <TokenType.UNKNOWN: 214>, '`': <TokenType.UNKNOWN: 214>, '"': <TokenType.UNKNOWN: 214>}
BIT_STRINGS: ClassVar[list[tuple[str, str] | str]] = []
BYTE_STRINGS: ClassVar[list[tuple[str, str] | str]] = []
HEX_STRINGS: ClassVar[list[tuple[str, str] | str]] = []
RAW_STRINGS: ClassVar[list[tuple[str, str] | str]] = []
HEREDOC_STRINGS: ClassVar[list[tuple[str, str] | str]] = []
UNICODE_STRINGS: ClassVar[list[tuple[str, str] | str]] = []
IDENTIFIERS: ClassVar[list[tuple[str, str] | str]] = ['"']
QUOTES: ClassVar[list[tuple[str, str] | str]] = ["'"]
STRING_ESCAPES: ClassVar[list[str]] = ["'"]
BYTE_STRING_ESCAPES: ClassVar[list[str]] = ["'"]
VAR_SINGLE_TOKENS: ClassVar[set[str]] = set()
IDENTIFIER_ESCAPES: ClassVar[list[str]] = []
HEREDOC_TAG_IS_IDENTIFIER = False
HEREDOC_STRING_ALTERNATIVE = <TokenType.VAR: 89>
STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS = True
NUMERIC_ESCAPES: ClassVar[dict[str, tuple[int, int, int, int]]] = {}
DROP_UNKNOWN_ESCAPES = False
NUMERIC_ESCAPES_ARE_BYTES = False
LONE_SURROGATE_REPLACEMENT = ''
NESTED_COMMENTS = True
DASH_COMMENT_REQUIRES_BOUNDARY = False
COMMENTS_TERMINATE_AT_NEWLINE_ONLY = False
HINT_START = '/*+'
TOKENS_PRECEDING_HINT = {<TokenType.DELETE: 257>, <TokenType.SELECT: 387>, <TokenType.INSERT: 300>, <TokenType.UPDATE: 419>}
KEYWORDS: ClassVar[dict[str, sqlglot.tokenizer_core.TokenType]] = {'{%': <TokenType.BLOCK_START: 73>, '{%+': <TokenType.BLOCK_START: 73>, '{%-': <TokenType.BLOCK_START: 73>, '%}': <TokenType.BLOCK_END: 74>, '+%}': <TokenType.BLOCK_END: 74>, '-%}': <TokenType.BLOCK_END: 74>, '{{+': <TokenType.BLOCK_START: 73>, '{{-': <TokenType.BLOCK_START: 73>, '+}}': <TokenType.BLOCK_END: 74>, '-}}': <TokenType.BLOCK_END: 74>, '/*+': <TokenType.HINT: 293>, '&<': <TokenType.AMP_LT: 63>, '&>': <TokenType.AMP_GT: 64>, '==': <TokenType.EQ: 28>, '::': <TokenType.DCOLON: 14>, '?::': <TokenType.QDCOLON: 370>, '||': <TokenType.DPIPE: 37>, '|>': <TokenType.PIPE_GT: 38>, '>=': <TokenType.GTE: 26>, '<=': <TokenType.LTE: 24>, '<>': <TokenType.NEQ: 29>, '!=': <TokenType.NEQ: 29>, ':=': <TokenType.COLON_EQ: 31>, '<=>': <TokenType.NULLSAFE_EQ: 30>, '->': <TokenType.ARROW: 45>, '->>': <TokenType.DARROW: 46>, '=>': <TokenType.FARROW: 47>, '#>': <TokenType.HASH_ARROW: 49>, '#>>': <TokenType.DHASH_ARROW: 50>, '<->': <TokenType.LR_ARROW: 51>, '<<->>': <TokenType.LLRR_ARROW: 52>, '&&': <TokenType.DAMP: 62>, '??': <TokenType.DQMARK: 18>, '~~~': <TokenType.GLOB: 287>, '~~': <TokenType.LIKE: 318>, '~~*': <TokenType.ILIKE: 295>, '~*': <TokenType.IRLIKE: 307>, '-|-': <TokenType.ADJACENT: 65>, 'ALL': <TokenType.ALL: 220>, 'AND': <TokenType.AND: 34>, 'ANTI': <TokenType.ANTI: 221>, 'ANY': <TokenType.ANY: 222>, 'ASC': <TokenType.ASC: 225>, 'AS': <TokenType.ALIAS: 218>, 'ASOF': <TokenType.ASOF: 226>, 'AUTOINCREMENT': <TokenType.AUTO_INCREMENT: 228>, 'AUTO_INCREMENT': <TokenType.AUTO_INCREMENT: 228>, 'BEGIN': <TokenType.BEGIN: 229>, 'BETWEEN': <TokenType.BETWEEN: 230>, 'CACHE': <TokenType.CACHE: 232>, 'UNCACHE': <TokenType.UNCACHE: 414>, 'CASE': <TokenType.CASE: 233>, 'CLUSTER BY': <TokenType.CLUSTER_BY: 235>, 'COLLATE': <TokenType.COLLATE: 236>, 'COLUMN': <TokenType.COLUMN: 81>, 'COMMIT': <TokenType.COMMIT: 239>, 'CONNECT BY': <TokenType.CONNECT_BY: 240>, 'CONSTRAINT': <TokenType.CONSTRAINT: 241>, 'COPY': <TokenType.COPY: 242>, 'CREATE': <TokenType.CREATE: 243>, 'CROSS': <TokenType.CROSS: 244>, 'CUBE': <TokenType.CUBE: 245>, 'CURRENT_DATE': <TokenType.CURRENT_DATE: 246>, 'CURRENT_SCHEMA': <TokenType.CURRENT_SCHEMA: 248>, 'CURRENT_TIME': <TokenType.CURRENT_TIME: 249>, 'CURRENT_TIMESTAMP': <TokenType.CURRENT_TIMESTAMP: 250>, 'CURRENT_USER': <TokenType.CURRENT_USER: 251>, 'CURRENT_CATALOG': <TokenType.CURRENT_CATALOG: 254>, 'DATABASE': <TokenType.DATABASE: 80>, 'DEFAULT': <TokenType.DEFAULT: 256>, 'DELETE': <TokenType.DELETE: 257>, 'DESC': <TokenType.DESC: 258>, 'DESCRIBE': <TokenType.DESCRIBE: 259>, 'DISTINCT': <TokenType.DISTINCT: 262>, 'DISTRIBUTE BY': <TokenType.DISTRIBUTE_BY: 263>, 'DIV': <TokenType.DIV: 264>, 'DROP': <TokenType.DROP: 265>, 'ELSE': <TokenType.ELSE: 266>, 'END': <TokenType.END: 267>, 'ENUM': <TokenType.ENUM: 205>, 'ESCAPE': <TokenType.ESCAPE: 268>, 'EXCEPT': <TokenType.EXCEPT: 269>, 'EXECUTE': <TokenType.EXECUTE: 270>, 'EXISTS': <TokenType.EXISTS: 271>, 'FALSE': <TokenType.FALSE: 272>, 'FETCH': <TokenType.FETCH: 273>, 'FILTER': <TokenType.FILTER: 276>, 'FILE': <TokenType.FILE: 274>, 'FIRST': <TokenType.FIRST: 278>, 'FULL': <TokenType.FULL: 284>, 'FUNCTION': <TokenType.FUNCTION: 285>, 'FOR': <TokenType.FOR: 279>, 'FOREIGN KEY': <TokenType.FOREIGN_KEY: 281>, 'FORMAT': <TokenType.FORMAT: 282>, 'FROM': <TokenType.FROM: 283>, 'GEOGRAPHY': <TokenType.GEOGRAPHY: 172>, 'GEOMETRY': <TokenType.GEOMETRY: 175>, 'GLOB': <TokenType.GLOB: 287>, 'GROUP BY': <TokenType.GROUP_BY: 290>, 'GROUPING SETS': <TokenType.GROUPING_SETS: 291>, 'HAVING': <TokenType.HAVING: 292>, 'ILIKE': <TokenType.ILIKE: 295>, 'IN': <TokenType.IN: 296>, 'INDEX': <TokenType.INDEX: 297>, 'INET': <TokenType.INET: 200>, 'INNER': <TokenType.INNER: 299>, 'INSERT': <TokenType.INSERT: 300>, 'INTERVAL': <TokenType.INTERVAL: 304>, 'INTERSECT': <TokenType.INTERSECT: 303>, 'INTO': <TokenType.INTO: 305>, 'IS': <TokenType.IS: 308>, 'ISNULL': <TokenType.ISNULL: 309>, 'JOIN': <TokenType.JOIN: 310>, 'KEEP': <TokenType.KEEP: 312>, 'KILL': <TokenType.KILL: 314>, 'LATERAL': <TokenType.LATERAL: 316>, 'LEFT': <TokenType.LEFT: 317>, 'LIKE': <TokenType.LIKE: 318>, 'LIMIT': <TokenType.LIMIT: 319>, 'LOAD': <TokenType.LOAD: 321>, 'LOCALTIME': <TokenType.LOCALTIME: 179>, 'LOCALTIMESTAMP': <TokenType.LOCALTIMESTAMP: 180>, 'LOCK': <TokenType.LOCK: 322>, 'MERGE': <TokenType.MERGE: 328>, 'NAMESPACE': <TokenType.NAMESPACE: 440>, 'NATURAL': <TokenType.NATURAL: 331>, 'NEXT': <TokenType.NEXT: 332>, 'NOT': <TokenType.NOT: 27>, 'NOTNULL': <TokenType.NOTNULL: 334>, 'NULL': <TokenType.NULL: 335>, 'OBJECT': <TokenType.OBJECT: 199>, 'OFFSET': <TokenType.OFFSET: 337>, 'ON': <TokenType.ON: 338>, 'OR': <TokenType.OR: 35>, 'XOR': <TokenType.XOR: 66>, 'ORDER BY': <TokenType.ORDER_BY: 341>, 'ORDINALITY': <TokenType.ORDINALITY: 344>, 'OUT': <TokenType.OUT: 345>, 'OUTER': <TokenType.OUTER: 347>, 'OVER': <TokenType.OVER: 348>, 'OVERLAPS': <TokenType.OVERLAPS: 349>, 'OVERWRITE': <TokenType.OVERWRITE: 350>, 'PARTITION': <TokenType.PARTITION: 352>, 'PARTITION BY': <TokenType.PARTITION_BY: 353>, 'PARTITIONED BY': <TokenType.PARTITION_BY: 353>, 'PARTITIONED_BY': <TokenType.PARTITION_BY: 353>, 'PERCENT': <TokenType.PERCENT: 354>, 'PIVOT': <TokenType.PIVOT: 355>, 'PRAGMA': <TokenType.PRAGMA: 360>, 'PRIMARY KEY': <TokenType.PRIMARY_KEY: 362>, 'PROCEDURE': <TokenType.PROCEDURE: 363>, 'OPERATOR': <TokenType.OPERATOR: 340>, 'QUALIFY': <TokenType.QUALIFY: 368>, 'RANGE': <TokenType.RANGE: 371>, 'RECURSIVE': <TokenType.RECURSIVE: 372>, 'REGEXP': <TokenType.RLIKE: 380>, 'RENAME': <TokenType.RENAME: 374>, 'REPLACE': <TokenType.REPLACE: 375>, 'RETURNING': <TokenType.RETURNING: 376>, 'REFERENCES': <TokenType.REFERENCES: 378>, 'RIGHT': <TokenType.RIGHT: 379>, 'RLIKE': <TokenType.RLIKE: 380>, 'ROLLBACK': <TokenType.ROLLBACK: 382>, 'ROLLUP': <TokenType.ROLLUP: 383>, 'ROW': <TokenType.ROW: 384>, 'ROWS': <TokenType.ROWS: 385>, 'SCHEMA': <TokenType.SCHEMA: 83>, 'SELECT': <TokenType.SELECT: 387>, 'SEMI': <TokenType.SEMI: 388>, 'SESSION': <TokenType.SESSION: 59>, 'SESSION_USER': <TokenType.SESSION_USER: 61>, 'SET': <TokenType.SET: 392>, 'SETTINGS': <TokenType.SETTINGS: 393>, 'SHOW': <TokenType.SHOW: 394>, 'SIMILAR TO': <TokenType.SIMILAR_TO: 395>, 'SOME': <TokenType.SOME: 396>, 'SORT BY': <TokenType.SORT_BY: 397>, 'SQL SECURITY': <TokenType.SQL_SECURITY: 399>, 'STRAIGHT_JOIN': <TokenType.STRAIGHT_JOIN: 402>, 'TABLE': <TokenType.TABLE: 84>, 'TABLESAMPLE': <TokenType.TABLE_SAMPLE: 405>, 'TEMP': <TokenType.TEMPORARY: 407>, 'TEMPORARY': <TokenType.TEMPORARY: 407>, 'THEN': <TokenType.THEN: 409>, 'TRUE': <TokenType.TRUE: 410>, 'TRUNCATE': <TokenType.TRUNCATE: 411>, 'TRIGGER': <TokenType.TRIGGER: 412>, 'UNION': <TokenType.UNION: 416>, 'UNKNOWN': <TokenType.UNKNOWN: 214>, 'UNNEST': <TokenType.UNNEST: 417>, 'UNPIVOT': <TokenType.UNPIVOT: 418>, 'UPDATE': <TokenType.UPDATE: 419>, 'USE': <TokenType.USE: 420>, 'USING': <TokenType.USING: 421>, 'UUID': <TokenType.UUID: 171>, 'VALUES': <TokenType.VALUES: 422>, 'VIEW': <TokenType.VIEW: 424>, 'VOLATILE': <TokenType.VOLATILE: 426>, 'WHEN': <TokenType.WHEN: 428>, 'WHERE': <TokenType.WHERE: 429>, 'WINDOW': <TokenType.WINDOW: 430>, 'WITH': <TokenType.WITH: 431>, 'APPLY': <TokenType.APPLY: 223>, 'ARRAY': <TokenType.ARRAY: 224>, 'BIT': <TokenType.BIT: 97>, 'BOOL': <TokenType.BOOLEAN: 98>, 'BOOLEAN': <TokenType.BOOLEAN: 98>, 'BYTE': <TokenType.TINYINT: 99>, 'MEDIUMINT': <TokenType.MEDIUMINT: 103>, 'INT1': <TokenType.TINYINT: 99>, 'TINYINT': <TokenType.TINYINT: 99>, 'INT16': <TokenType.SMALLINT: 101>, 'SHORT': <TokenType.SMALLINT: 101>, 'SMALLINT': <TokenType.SMALLINT: 101>, 'HUGEINT': <TokenType.INT128: 110>, 'UHUGEINT': <TokenType.UINT128: 111>, 'INT2': <TokenType.SMALLINT: 101>, 'INTEGER': <TokenType.INT: 105>, 'INT': <TokenType.INT: 105>, 'INT4': <TokenType.INT: 105>, 'INT32': <TokenType.INT: 105>, 'INT64': <TokenType.BIGINT: 107>, 'INT128': <TokenType.INT128: 110>, 'INT256': <TokenType.INT256: 112>, 'LONG': <TokenType.BIGINT: 107>, 'BIGINT': <TokenType.BIGINT: 107>, 'INT8': <TokenType.TINYINT: 99>, 'UINT': <TokenType.UINT: 106>, 'UINT128': <TokenType.UINT128: 111>, 'UINT256': <TokenType.UINT256: 113>, 'DEC': <TokenType.DECIMAL: 117>, 'DECIMAL': <TokenType.DECIMAL: 117>, 'DECIMAL32': <TokenType.DECIMAL32: 118>, 'DECIMAL64': <TokenType.DECIMAL64: 119>, 'DECIMAL128': <TokenType.DECIMAL128: 120>, 'DECIMAL256': <TokenType.DECIMAL256: 121>, 'DECFLOAT': <TokenType.DECFLOAT: 122>, 'BIGDECIMAL': <TokenType.BIGDECIMAL: 124>, 'BIGNUMERIC': <TokenType.BIGDECIMAL: 124>, 'BIGNUM': <TokenType.BIGNUM: 109>, 'LIST': <TokenType.LIST: 320>, 'MAP': <TokenType.MAP: 323>, 'NULLABLE': <TokenType.NULLABLE: 174>, 'NUMBER': <TokenType.DECIMAL: 117>, 'NUMERIC': <TokenType.DECIMAL: 117>, 'FIXED': <TokenType.DECIMAL: 117>, 'REAL': <TokenType.FLOAT: 114>, 'FLOAT': <TokenType.FLOAT: 114>, 'FLOAT4': <TokenType.FLOAT: 114>, 'FLOAT8': <TokenType.DOUBLE: 115>, 'DOUBLE': <TokenType.DOUBLE: 115>, 'DOUBLE PRECISION': <TokenType.DOUBLE: 115>, 'JSON': <TokenType.JSON: 141>, 'JSONB': <TokenType.JSONB: 142>, 'CHAR': <TokenType.CHAR: 125>, 'CHARACTER': <TokenType.CHAR: 125>, 'CHAR VARYING': <TokenType.VARCHAR: 127>, 'CHARACTER VARYING': <TokenType.VARCHAR: 127>, 'NCHAR': <TokenType.NCHAR: 126>, 'VARCHAR': <TokenType.VARCHAR: 127>, 'VARCHAR2': <TokenType.VARCHAR: 127>, 'NVARCHAR': <TokenType.NVARCHAR: 128>, 'NVARCHAR2': <TokenType.NVARCHAR: 128>, 'BPCHAR': <TokenType.BPCHAR: 129>, 'STR': <TokenType.TEXT: 130>, 'STRING': <TokenType.TEXT: 130>, 'TEXT': <TokenType.TEXT: 130>, 'LONGTEXT': <TokenType.LONGTEXT: 132>, 'MEDIUMTEXT': <TokenType.MEDIUMTEXT: 131>, 'TINYTEXT': <TokenType.TINYTEXT: 137>, 'CLOB': <TokenType.TEXT: 130>, 'LONGVARCHAR': <TokenType.TEXT: 130>, 'BINARY': <TokenType.BINARY: 139>, 'BLOB': <TokenType.VARBINARY: 140>, 'LONGBLOB': <TokenType.LONGBLOB: 135>, 'MEDIUMBLOB': <TokenType.MEDIUMBLOB: 134>, 'TINYBLOB': <TokenType.TINYBLOB: 136>, 'BYTEA': <TokenType.VARBINARY: 140>, 'VARBINARY': <TokenType.VARBINARY: 140>, 'TIME': <TokenType.TIME: 143>, 'TIMETZ': <TokenType.TIMETZ: 144>, 'TIME_NS': <TokenType.TIME_NS: 145>, 'TIMESTAMP': <TokenType.TIMESTAMP: 146>, 'TIMESTAMPTZ': <TokenType.TIMESTAMPTZ: 147>, 'TIMESTAMPLTZ': <TokenType.TIMESTAMPLTZ: 148>, 'TIMESTAMP_LTZ': <TokenType.TIMESTAMPLTZ: 148>, 'TIMESTAMPNTZ': <TokenType.TIMESTAMPNTZ: 149>, 'TIMESTAMP_NTZ': <TokenType.TIMESTAMPNTZ: 149>, 'DATE': <TokenType.DATE: 157>, 'DATETIME': <TokenType.DATETIME: 153>, 'INT4RANGE': <TokenType.INT4RANGE: 159>, 'INT4MULTIRANGE': <TokenType.INT4MULTIRANGE: 160>, 'INT8RANGE': <TokenType.INT8RANGE: 161>, 'INT8MULTIRANGE': <TokenType.INT8MULTIRANGE: 162>, 'NUMRANGE': <TokenType.NUMRANGE: 163>, 'NUMMULTIRANGE': <TokenType.NUMMULTIRANGE: 164>, 'TSRANGE': <TokenType.TSRANGE: 165>, 'TSMULTIRANGE': <TokenType.TSMULTIRANGE: 166>, 'TSTZRANGE': <TokenType.TSTZRANGE: 167>, 'TSTZMULTIRANGE': <TokenType.TSTZMULTIRANGE: 168>, 'DATERANGE': <TokenType.DATERANGE: 169>, 'DATEMULTIRANGE': <TokenType.DATEMULTIRANGE: 170>, 'UNIQUE': <TokenType.UNIQUE: 432>, 'VECTOR': <TokenType.VECTOR: 215>, 'STRUCT': <TokenType.STRUCT: 403>, 'SEQUENCE': <TokenType.SEQUENCE: 390>, 'VARIANT': <TokenType.VARIANT: 198>, 'ALTER': <TokenType.ALTER: 219>, 'ANALYZE': <TokenType.ANALYZE: 439>, 'CALL': <TokenType.COMMAND: 237>, 'COMMENT': <TokenType.COMMENT: 238>, 'EXPLAIN': <TokenType.COMMAND: 237>, 'GRANT': <TokenType.GRANT: 289>, 'REVOKE': <TokenType.REVOKE: 377>, 'OPTIMIZE': <TokenType.COMMAND: 237>, 'PREPARE': <TokenType.COMMAND: 237>, 'VACUUM': <TokenType.COMMAND: 237>, 'USER-DEFINED': <TokenType.USERDEFINED: 193>}
COMMANDS = {<TokenType.SHOW: 394>, <TokenType.COMMAND: 237>, <TokenType.EXECUTE: 270>, <TokenType.FETCH: 273>, <TokenType.RENAME: 374>}
COMMAND_PREFIX_TOKENS = {<TokenType.SEMICOLON: 19>, <TokenType.BEGIN: 229>}
NUMERIC_LITERALS: ClassVar[dict[str, str]] = {}
NUMBERS_CAN_HAVE_DECIMALS: ClassVar[bool] = True
COMMENTS = ['--', ('/*', '*/')]
dialect
def tokenize(self, sql: str) -> list[sqlglot.tokenizer_core.Token]:
608    def tokenize(self, sql: str) -> list[Token]:
609        """Returns a list of tokens corresponding to the SQL string `sql`."""
610        return self._core.tokenize(sql)  # type: ignore

Returns a list of tokens corresponding to the SQL string sql.

sql: str
612    @property
613    def sql(self) -> str:
614        """The SQL string being tokenized."""
615        return self._core.sql

The SQL string being tokenized.

size: int
617    @property
618    def size(self) -> int:
619        """Length of the SQL string."""
620        return self._core.size

Length of the SQL string.

tokens: list[sqlglot.tokenizer_core.Token]
622    @property
623    def tokens(self) -> list[Token]:
624        """The list of tokens produced by tokenization."""
625        return self._core.tokens

The list of tokens produced by tokenization.