Edit on GitHub

sqlglot.parsers.bigquery

  1from __future__ import annotations
  2
  3import re
  4import typing as t
  5
  6from sqlglot import exp, parser
  7from sqlglot.dialects.dialect import (
  8    binary_from_function,
  9    build_date_delta_with_interval,
 10    build_formatted_time,
 11)
 12from sqlglot.helper import seq_get, split_num_words
 13from sqlglot.tokens import TokenType
 14
 15if t.TYPE_CHECKING:
 16    from sqlglot._typing import E
 17
 18
 19def _build_contains_substring(args: list) -> exp.Contains:
 20    this = exp.Lower(this=seq_get(args, 0))
 21    expr = exp.Lower(this=seq_get(args, 1))
 22    return exp.Contains(this=this, expression=expr, json_scope=seq_get(args, 2))
 23
 24
 25def _build_date(args: list) -> exp.Date | exp.DateFromParts:
 26    expr_type = exp.DateFromParts if len(args) == 3 else exp.Date
 27    return expr_type.from_arg_list(args)
 28
 29
 30def build_date_diff(args: list) -> exp.Expr:
 31    expr = exp.DateDiff(
 32        this=seq_get(args, 0),
 33        expression=seq_get(args, 1),
 34        unit=seq_get(args, 2),
 35        date_part_boundary=True,
 36    )
 37
 38    unit = expr.args.get("unit")
 39    if isinstance(unit, exp.Var) and unit.name.upper() == "WEEK":
 40        expr.set("unit", exp.WeekStart(this=exp.var("SUNDAY")))
 41
 42    return expr
 43
 44
 45def _build_datetime(args: list) -> exp.Func:
 46    if len(args) == 1:
 47        return exp.TsOrDsToDatetime.from_arg_list(args)
 48    if len(args) == 2:
 49        return exp.Datetime.from_arg_list(args)
 50    return exp.TimestampFromParts.from_arg_list(args)
 51
 52
 53def _build_extract_json_with_default_path(
 54    expr_type: type[E],
 55) -> t.Callable:
 56    def _builder(args: list, dialect: t.Any) -> E:
 57        if len(args) == 1:
 58            args.append(exp.Literal.string("$"))
 59        return parser.build_extract_json_with_path(expr_type)(args, dialect)
 60
 61    return _builder
 62
 63
 64def _build_format_time(expr_type: type[exp.Expr]) -> t.Callable[[list], exp.TimeToStr]:
 65    def _builder(args: list) -> exp.TimeToStr:
 66        formatted_time = build_formatted_time(exp.TimeToStr, "bigquery")(
 67            [expr_type(this=seq_get(args, 1)), seq_get(args, 0)]
 68        )
 69        formatted_time.set("zone", seq_get(args, 2))
 70        return formatted_time
 71
 72    return _builder
 73
 74
 75def _build_json_strip_nulls(args: list) -> exp.JSONStripNulls:
 76    expression = exp.JSONStripNulls(this=seq_get(args, 0))
 77    for arg in args[1:]:
 78        if isinstance(arg, exp.Kwarg):
 79            expression.set(arg.this.name.lower(), arg)
 80        else:
 81            expression.set("expression", arg)
 82    return expression
 83
 84
 85def _build_levenshtein(args: list) -> exp.Levenshtein:
 86    max_dist = seq_get(args, 2)
 87    return exp.Levenshtein(
 88        this=seq_get(args, 0),
 89        expression=seq_get(args, 1),
 90        max_dist=max_dist.expression if max_dist else None,
 91    )
 92
 93
 94def _build_parse_timestamp(args: list) -> exp.StrToTime:
 95    this = build_formatted_time(exp.StrToTime, "bigquery")([seq_get(args, 1), seq_get(args, 0)])
 96    this.set("zone", seq_get(args, 2))
 97    return this
 98
 99
100def _build_regexp_extract(expr_type: type[E], default_group: exp.Expr | None = None) -> t.Callable:
101    def _builder(args: list, dialect: t.Any) -> E:
102        try:
103            group = re.compile(args[1].name).groups == 1
104        except re.error:
105            group = False
106
107        return expr_type(
108            this=seq_get(args, 0),
109            expression=seq_get(args, 1),
110            position=seq_get(args, 2),
111            occurrence=seq_get(args, 3),
112            group=exp.Literal.number(1) if group else default_group,
113            **(
114                {"null_if_pos_overflow": dialect.REGEXP_EXTRACT_POSITION_OVERFLOW_RETURNS_NULL}
115                if expr_type is exp.RegexpExtract
116                else {}
117            ),
118        )
119
120    return _builder
121
122
123def _build_time(args: list) -> exp.Func:
124    if len(args) == 1:
125        return exp.TsOrDsToTime(this=args[0])
126    if len(args) == 2:
127        return exp.Time.from_arg_list(args)
128    return exp.TimeFromParts.from_arg_list(args)
129
130
131def _build_timestamp(args: list) -> exp.Timestamp:
132    timestamp = exp.Timestamp.from_arg_list(args)
133    timestamp.set("with_tz", True)
134    return timestamp
135
136
137def _build_to_hex(args: list) -> exp.Hex | exp.MD5:
138    arg = seq_get(args, 0)
139    return exp.MD5(this=arg.this) if isinstance(arg, exp.MD5Digest) else exp.LowerHex(this=arg)
140
141
142MAKE_INTERVAL_KWARGS = ["year", "month", "day", "hour", "minute", "second"]
143
144
145class BigQueryParser(parser.Parser):
146    PREFIXED_PIVOT_COLUMNS: t.ClassVar = True
147    LOG_DEFAULTS_TO_LN: t.ClassVar = True
148    SUPPORTS_IMPLICIT_UNNEST: t.ClassVar = True
149    JOINS_HAVE_EQUAL_PRECEDENCE: t.ClassVar = True
150
151    # BigQuery does not allow ASC/DESC to be used as an identifier, allows GRANT as an identifier
152    ID_VAR_TOKENS: t.ClassVar = {
153        *parser.Parser.ID_VAR_TOKENS,
154        TokenType.GRANT,
155    } - {TokenType.ASC, TokenType.DESC}
156
157    ALIAS_TOKENS: t.ClassVar = {
158        *parser.Parser.ALIAS_TOKENS,
159        TokenType.GRANT,
160    } - {TokenType.ASC, TokenType.DESC}
161
162    TABLE_ALIAS_TOKENS: t.ClassVar = {
163        *parser.Parser.TABLE_ALIAS_TOKENS,
164        TokenType.ANTI,
165        TokenType.GRANT,
166        TokenType.SEMI,
167    } - {TokenType.ASC, TokenType.DESC}
168
169    COMMENT_TABLE_ALIAS_TOKENS: t.ClassVar = {
170        *parser.Parser.COMMENT_TABLE_ALIAS_TOKENS,
171        TokenType.GRANT,
172    } - {TokenType.ASC, TokenType.DESC}
173
174    UPDATE_ALIAS_TOKENS: t.ClassVar = {
175        *parser.Parser.UPDATE_ALIAS_TOKENS,
176        TokenType.GRANT,
177    } - {TokenType.ASC, TokenType.DESC}
178
179    FUNCTIONS: t.ClassVar[dict[str, t.Callable]] = {
180        **{k: v for k, v in parser.Parser.FUNCTIONS.items() if k != "SEARCH"},
181        "APPROX_TOP_COUNT": exp.ApproxTopK.from_arg_list,
182        "BIT_AND": exp.BitwiseAndAgg.from_arg_list,
183        "BIT_OR": exp.BitwiseOrAgg.from_arg_list,
184        "BIT_XOR": exp.BitwiseXorAgg.from_arg_list,
185        "BIT_COUNT": exp.BitwiseCount.from_arg_list,
186        "BOOL": exp.JSONBool.from_arg_list,
187        "CONTAINS_SUBSTR": _build_contains_substring,
188        "DATE": _build_date,
189        "DATE_ADD": build_date_delta_with_interval(exp.DateAdd),
190        "DATE_DIFF": build_date_diff,
191        "DATE_SUB": build_date_delta_with_interval(exp.DateSub),
192        "DATE_TRUNC": lambda args: exp.DateTrunc(
193            unit=seq_get(args, 1),
194            this=seq_get(args, 0),
195            zone=seq_get(args, 2),
196        ),
197        "DATETIME": _build_datetime,
198        "DATETIME_ADD": build_date_delta_with_interval(exp.DatetimeAdd),
199        "DATETIME_SUB": build_date_delta_with_interval(exp.DatetimeSub),
200        "DIV": binary_from_function(exp.IntDiv),
201        "EDIT_DISTANCE": _build_levenshtein,
202        "EMBED": exp.AIEmbed.from_arg_list,
203        "FORMAT_DATE": _build_format_time(exp.TsOrDsToDate),
204        "GENERATE": exp.AIGenerate.from_arg_list,
205        "GENERATE_ARRAY": exp.GenerateSeries.from_arg_list,
206        "JSON_EXTRACT_SCALAR": _build_extract_json_with_default_path(exp.JSONExtractScalar),
207        "JSON_EXTRACT_ARRAY": _build_extract_json_with_default_path(exp.JSONExtractArray),
208        "JSON_EXTRACT_STRING_ARRAY": _build_extract_json_with_default_path(exp.JSONValueArray),
209        "JSON_KEYS": exp.JSONKeysAtDepth.from_arg_list,
210        "JSON_QUERY": parser.build_extract_json_with_path(exp.JSONExtract),
211        "JSON_QUERY_ARRAY": _build_extract_json_with_default_path(exp.JSONExtractArray),
212        "JSON_STRIP_NULLS": _build_json_strip_nulls,
213        "JSON_VALUE": _build_extract_json_with_default_path(exp.JSONExtractScalar),
214        "JSON_VALUE_ARRAY": _build_extract_json_with_default_path(exp.JSONValueArray),
215        "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True),
216        "MD5": exp.MD5Digest.from_arg_list,
217        "SHA1": exp.SHA1Digest.from_arg_list,
218        "NORMALIZE_AND_CASEFOLD": lambda args: exp.Normalize(
219            this=seq_get(args, 0), form=seq_get(args, 1), is_casefold=True
220        ),
221        "OCTET_LENGTH": exp.ByteLength.from_arg_list,
222        "TO_HEX": _build_to_hex,
223        "PARSE_DATE": lambda args: build_formatted_time(exp.StrToDate, "bigquery")(
224            [seq_get(args, 1), seq_get(args, 0)]
225        ),
226        "PARSE_TIME": lambda args: build_formatted_time(exp.ParseTime, "bigquery")(
227            [seq_get(args, 1), seq_get(args, 0)]
228        ),
229        "PARSE_TIMESTAMP": _build_parse_timestamp,
230        "PARSE_DATETIME": lambda args: build_formatted_time(exp.ParseDatetime, "bigquery")(
231            [seq_get(args, 1), seq_get(args, 0)]
232        ),
233        "REGEXP_CONTAINS": exp.RegexpLike.from_arg_list,
234        "REGEXP_EXTRACT": _build_regexp_extract(exp.RegexpExtract),
235        "REGEXP_SUBSTR": _build_regexp_extract(exp.RegexpExtract),
236        "REGEXP_EXTRACT_ALL": _build_regexp_extract(
237            exp.RegexpExtractAll, default_group=exp.Literal.number(0)
238        ),
239        "SHA256": lambda args: exp.SHA2Digest(
240            this=seq_get(args, 0), length=exp.Literal.number(256)
241        ),
242        "SHA512": lambda args: exp.SHA2(this=seq_get(args, 0), length=exp.Literal.number(512)),
243        "SIMILARITY": exp.AISimilarity.from_arg_list,
244        "SPLIT": lambda args: exp.Split(
245            # https://cloud.google.com/bigquery/docs/reference/standard-sql/string_functions#split
246            this=seq_get(args, 0),
247            expression=seq_get(args, 1) or exp.Literal.string(","),
248        ),
249        "STRPOS": exp.StrPosition.from_arg_list,
250        "TIME": _build_time,
251        "TIME_ADD": build_date_delta_with_interval(exp.TimeAdd),
252        "TIME_SUB": build_date_delta_with_interval(exp.TimeSub),
253        "TIMESTAMP": _build_timestamp,
254        "TIMESTAMP_ADD": build_date_delta_with_interval(exp.TimestampAdd),
255        "TIMESTAMP_SUB": build_date_delta_with_interval(exp.TimestampSub),
256        "TIMESTAMP_MICROS": lambda args: exp.UnixToTime(
257            this=seq_get(args, 0), scale=exp.UnixToTime.MICROS
258        ),
259        "TIMESTAMP_MILLIS": lambda args: exp.UnixToTime(
260            this=seq_get(args, 0), scale=exp.UnixToTime.MILLIS
261        ),
262        "TIMESTAMP_SECONDS": lambda args: exp.UnixToTime(this=seq_get(args, 0)),
263        "TO_JSON": lambda args: exp.JSONFormat(
264            this=seq_get(args, 0), options=seq_get(args, 1), to_json=True
265        ),
266        "TO_JSON_STRING": exp.JSONFormat.from_arg_list,
267        "FORMAT_DATETIME": _build_format_time(exp.TsOrDsToDatetime),
268        "FORMAT_TIMESTAMP": _build_format_time(exp.TsOrDsToTimestamp),
269        "FORMAT_TIME": _build_format_time(exp.TsOrDsToTime),
270        "FROM_HEX": exp.Unhex.from_arg_list,
271        "WEEK": lambda args: exp.WeekStart(this=exp.var(seq_get(args, 0))),
272    }
273
274    FUNCTION_PARSERS = {
275        **{k: v for k, v in parser.Parser.FUNCTION_PARSERS.items() if k != "TRIM"},
276        "ARRAY": lambda self: self.expression(
277            exp.Array(expressions=[self._parse_statement()], struct_name_inheritance=True)
278        ),
279        "JSON_ARRAY": lambda self: self.expression(
280            exp.JSONArray(expressions=self._parse_csv(self._parse_bitwise))
281        ),
282        "MAKE_INTERVAL": lambda self: self._parse_make_interval(),
283        "PREDICT": lambda self: self._parse_ml(exp.Predict),
284        "TRANSLATE": lambda self: self._parse_translate(),
285        "FEATURES_AT_TIME": lambda self: self._parse_features_at_time(),
286        "GENERATE_EMBEDDING": lambda self: self._parse_ml(exp.GenerateEmbedding),
287        "GENERATE_TEXT_EMBEDDING": lambda self: self._parse_ml(exp.GenerateEmbedding, is_text=True),
288        "GENERATE_TEXT": lambda self: self._parse_generate(exp.GenerateText),
289        "GENERATE_TABLE": lambda self: self._parse_generate(exp.GenerateTable),
290        "GENERATE_BOOL": lambda self: self._parse_generate(exp.GenerateBool),
291        "GENERATE_INT": lambda self: self._parse_generate(exp.GenerateInt),
292        "GENERATE_DOUBLE": lambda self: self._parse_generate(exp.GenerateDouble),
293        "VECTOR_SEARCH": lambda self: self._parse_vector_search(),
294        "FORECAST": lambda self: self._parse_forecast(),
295    }
296
297    NO_PAREN_FUNCTIONS: t.ClassVar = {
298        **parser.Parser.NO_PAREN_FUNCTIONS,
299        TokenType.CURRENT_DATETIME: exp.CurrentDatetime,
300    }
301
302    NESTED_TYPE_TOKENS: t.ClassVar = {
303        *parser.Parser.NESTED_TYPE_TOKENS,
304        TokenType.TABLE,
305    }
306
307    PROPERTY_PARSERS: t.ClassVar = {
308        **parser.Parser.PROPERTY_PARSERS,
309        "NOT DETERMINISTIC": lambda self: self.expression(
310            exp.StabilityProperty(this=exp.Literal.string("VOLATILE"))
311        ),
312        "OPTIONS": lambda self: self._parse_with_property(),
313    }
314
315    CONSTRAINT_PARSERS: t.ClassVar = {
316        **parser.Parser.CONSTRAINT_PARSERS,
317        "OPTIONS": lambda self: exp.Properties(expressions=self._parse_with_property()),
318    }
319
320    RANGE_PARSERS: t.ClassVar = {
321        k: v for k, v in parser.Parser.RANGE_PARSERS.items() if k != TokenType.OVERLAPS
322    }
323
324    DASHED_TABLE_PART_FOLLOW_TOKENS: t.ClassVar = {
325        TokenType.DOT,
326        TokenType.L_PAREN,
327        TokenType.R_PAREN,
328    }
329
330    STATEMENT_PARSERS: t.ClassVar = {
331        **parser.Parser.STATEMENT_PARSERS,
332        TokenType.ELSE: lambda self: self._parse_as_command(self._prev),
333        TokenType.END: lambda self: self._parse_as_command(self._prev),
334        TokenType.FOR: lambda self: self._parse_for_in(),
335        TokenType.EXPORT: lambda self: self._parse_export_data(),
336        TokenType.DECLARE: lambda self: self._parse_declare(),
337    }
338
339    BRACKET_OFFSETS: t.ClassVar = {
340        "OFFSET": (0, False),
341        "ORDINAL": (1, False),
342        "SAFE_OFFSET": (0, True),
343        "SAFE_ORDINAL": (1, True),
344    }
345
346    def _parse_for_in(self) -> exp.ForIn | exp.Command:
347        index = self._index
348        this = self._parse_range()
349        self._match_text_seq("DO")
350        if self._match(TokenType.COMMAND):
351            self._retreat(index)
352            return self._parse_as_command(self._prev)
353        return self.expression(exp.ForIn(this=this, expression=self._parse_statement()))
354
355    def _parse_table_part(self, schema: bool = False) -> exp.Expr | None:
356        this = super()._parse_table_part(schema=schema) or self._parse_number()
357
358        # https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#table_names
359        if isinstance(this, exp.Identifier):
360            table_name = this.name
361            while self._match(TokenType.DASH, advance=False) and self._next:
362                start = self._curr
363                while self._is_connected() and not self._match_set(
364                    self.DASHED_TABLE_PART_FOLLOW_TOKENS, advance=False
365                ):
366                    self._advance()
367
368                if start == self._curr:
369                    break
370
371                table_name += self._find_sql(start, self._prev)
372
373            this = exp.Identifier(this=table_name, quoted=this.args.get("quoted")).update_positions(
374                this
375            )
376        elif isinstance(this, exp.Literal):
377            table_name = this.name
378
379            if self._is_connected() and self._parse_var(any_token=True):
380                table_name += self._prev.text
381
382            this = exp.Identifier(this=table_name, quoted=True).update_positions(this)
383
384        return this
385
386    def _parse_table_parts(
387        self,
388        schema: bool = False,
389        is_db_reference: bool = False,
390        wildcard: bool = False,
391        fast: bool = False,
392    ) -> exp.Table | exp.Dot | None:
393        table = super()._parse_table_parts(
394            schema=schema, is_db_reference=is_db_reference, wildcard=True, fast=fast
395        )
396
397        if not isinstance(table, exp.Table):
398            return table
399
400        # proj-1.db.tbl -- `1.` is tokenized as a float so we need to unravel it here
401        if not table.catalog:
402            if table.db:
403                previous_db = table.args["db"]
404                parts = table.db.split(".")
405                if len(parts) == 2 and not table.args["db"].quoted:
406                    table.set(
407                        "catalog", exp.Identifier(this=parts[0]).update_positions(previous_db)
408                    )
409                    table.set("db", exp.Identifier(this=parts[1]).update_positions(previous_db))
410            else:
411                previous_this = table.this
412                parts = table.name.split(".")
413                if len(parts) == 2 and not table.this.quoted:
414                    table.set("db", exp.Identifier(this=parts[0]).update_positions(previous_this))
415                    table.set("this", exp.Identifier(this=parts[1]).update_positions(previous_this))
416
417        if isinstance(table.this, exp.Identifier) and any("." in p.name for p in table.parts):
418            alias = table.this
419            catalog, db, this_id, *rest = (
420                exp.to_identifier(p, quoted=True)
421                for p in split_num_words(".".join(p.name for p in table.parts), ".", 3)
422            )
423
424            for part in (catalog, db, this_id):
425                if part:
426                    part.update_positions(table.this)
427
428            this: exp.Expr | None = this_id
429            if rest and this:
430                this = exp.Dot.build([this, *rest])  # type: ignore[list-item]
431
432            table = exp.Table(this=this, db=db, catalog=catalog, pivots=table.args.get("pivots"))
433            table.meta["quoted_table"] = True
434        else:
435            alias = None
436
437        # The `INFORMATION_SCHEMA` views in BigQuery need to be qualified by a region or
438        # dataset, so if the project identifier is omitted we need to fix the ast so that
439        # the `INFORMATION_SCHEMA.X` bit is represented as a single (quoted) Identifier.
440        # Otherwise, we wouldn't correctly qualify a `Table` node that references these
441        # views, because it would seem like the "catalog" part is set, when it'd actually
442        # be the region/dataset. Merging the two identifiers into a single one is done to
443        # avoid producing a 4-part Table reference, which would cause issues in the schema
444        # module, when there are 3-part table names mixed with information schema views.
445        #
446        # See: https://cloud.google.com/bigquery/docs/information-schema-intro#syntax
447        table_parts = table.parts
448        if len(table_parts) > 1 and table_parts[-2].name.upper() == "INFORMATION_SCHEMA":
449            # We need to alias the table here to avoid breaking existing qualified columns.
450            # This is expected to be safe, because if there's an actual alias coming up in
451            # the token stream, it will overwrite this one. If there isn't one, we are only
452            # exposing the name that can be used to reference the view explicitly (a no-op).
453            exp.alias_(
454                table,
455                t.cast(exp.Identifier, alias or table_parts[-1]),
456                table=True,
457                copy=False,
458            )
459
460            info_schema_view = f"{table_parts[-2].name}.{table_parts[-1].name}"
461            new_this = exp.Identifier(this=info_schema_view, quoted=True).update_positions(
462                line=table_parts[-2].meta.get("line"),
463                col=table_parts[-1].meta.get("col"),
464                start=table_parts[-2].meta.get("start"),
465                end=table_parts[-1].meta.get("end"),
466            )
467            table.set("this", new_this)
468            table.set("db", seq_get(table_parts, -3))
469            table.set("catalog", seq_get(table_parts, -4))
470
471        return table
472
473    def _parse_column(self) -> exp.Expr | None:
474        column = super()._parse_column()
475        if isinstance(column, exp.Column):
476            parts = column.parts
477            if any("." in p.name for p in parts):
478                catalog, db, table, this, *rest = (
479                    exp.to_identifier(p, quoted=True)
480                    for p in split_num_words(".".join(p.name for p in parts), ".", 4)
481                )
482
483                if rest and this:
484                    this = exp.Dot.build([this, *rest])  # type: ignore
485
486                column = exp.Column(this=this, table=table, db=db, catalog=catalog)
487                column.meta["quoted_column"] = True
488
489        return column
490
491    @t.overload
492    def _parse_json_object(self, agg: t.Literal[False]) -> exp.JSONObject: ...
493
494    @t.overload
495    def _parse_json_object(self, agg: t.Literal[True]) -> exp.JSONObjectAgg: ...
496
497    def _parse_json_object(self, agg=False):
498        json_object = super()._parse_json_object()
499        array_kv_pair = seq_get(json_object.expressions, 0)
500
501        # Converts BQ's "signature 2" of JSON_OBJECT into SQLGlot's canonical representation
502        # https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#json_object_signature2
503        if (
504            array_kv_pair
505            and isinstance(array_kv_pair.this, exp.Array)
506            and isinstance(array_kv_pair.expression, exp.Array)
507        ):
508            keys = array_kv_pair.this.expressions
509            values = array_kv_pair.expression.expressions
510
511            json_object.set(
512                "expressions",
513                [exp.JSONKeyValue(this=k, expression=v) for k, v in zip(keys, values)],
514            )
515
516        return json_object
517
518    def _parse_bracket(self, this: exp.Expr | None = None) -> exp.Expr | None:
519        bracket = super()._parse_bracket(this)
520
521        if isinstance(bracket, exp.Array):
522            bracket.set("struct_name_inheritance", True)
523
524        if this is bracket:
525            return bracket
526
527        if isinstance(bracket, exp.Bracket):
528            for expression in bracket.expressions:
529                name = expression.name.upper()
530
531                expressions = expression.expressions
532
533                if name not in self.BRACKET_OFFSETS or not expressions:
534                    break
535
536                offset, safe = self.BRACKET_OFFSETS[name]
537                bracket.set("offset", offset)
538                bracket.set("safe", safe)
539                expression.replace(expressions[0])
540
541        return bracket
542
543    def _parse_unnest(self, with_alias: bool = True) -> exp.Unnest | None:
544        unnest = super()._parse_unnest(with_alias=with_alias)
545
546        if not unnest:
547            return None
548
549        unnest_expr = seq_get(unnest.expressions, 0)
550        if unnest_expr:
551            from sqlglot.optimizer.annotate_types import annotate_types
552
553            unnest_expr = annotate_types(unnest_expr, dialect=self.dialect)
554
555            # Unnesting a nested array (i.e array of structs) explodes the top-level struct fields,
556            # in contrast to other dialects such as DuckDB which flattens only the array by default
557            if unnest_expr.is_type(exp.DType.ARRAY) and any(
558                array_elem.is_type(exp.DType.STRUCT) for array_elem in unnest_expr._type.expressions
559            ):
560                unnest.set("explode_array", True)
561
562        return unnest
563
564    def _parse_make_interval(self) -> exp.MakeInterval:
565        expr = exp.MakeInterval()
566
567        for arg_key in MAKE_INTERVAL_KWARGS:
568            value = self._parse_lambda()
569
570            if not value:
571                break
572
573            # Non-named arguments are filled sequentially, (optionally) followed by named arguments
574            # that can appear in any order e.g MAKE_INTERVAL(1, minute => 5, day => 2)
575            if isinstance(value, exp.Kwarg):
576                arg_key = value.this.name
577
578            expr.set(arg_key, value)
579
580            self._match(TokenType.COMMA)
581
582        return expr
583
584    def _parse_ml(self, expr_type: type[E], **kwargs: t.Any) -> E:
585        self._match_text_seq("MODEL")
586        this = self._parse_table()
587
588        self._match(TokenType.COMMA)
589        self._match_text_seq("TABLE")
590
591        # Certain functions like ML.FORECAST require a STRUCT argument but not a TABLE/SELECT one
592        expression = (
593            self._parse_table() if not self._match(TokenType.STRUCT, advance=False) else None
594        )
595
596        self._match(TokenType.COMMA)
597
598        return self.expression(
599            expr_type(
600                this=this, expression=expression, params_struct=self._parse_bitwise(), **kwargs
601            )
602        )
603
604    def _parse_generate(self, expr_type: type[E], **kwargs: t.Any) -> E:
605        self._match_text_seq("MODEL")
606        this = self._parse_table()
607
608        self._match(TokenType.COMMA)
609
610        if self._match_text_seq("TABLE"):
611            expression = self._parse_table()
612        elif self._match(TokenType.L_PAREN, advance=False):
613            expression = self._parse_table()
614        else:
615            expression = self._parse_bitwise()
616
617        params_struct = self._match(TokenType.COMMA) and self._parse_bitwise()
618
619        return self.expression(
620            expr_type(this=this, expression=expression, params_struct=params_struct, **kwargs)
621        )
622
623    def _parse_translate(self) -> exp.Translate | exp.MLTranslate:
624        # Check if this is ML.TRANSLATE by looking at previous tokens
625        token = seq_get(self._tokens, self._index - 4)
626        if token and token.text.upper() == "ML":
627            return self._parse_ml(exp.MLTranslate)
628
629        return exp.Translate.from_arg_list(self._parse_function_args())
630
631    def _parse_forecast(self) -> exp.AIForecast | exp.MLForecast:
632        # Check if this is ML.FORECAST by looking at previous tokens.
633        token = seq_get(self._tokens, self._index - 4)
634        if token and token.text.upper() == "ML":
635            return self._parse_ml(exp.MLForecast)
636
637        # AI.FORECAST is a TVF, where the first argument is either TABLE <table>
638        # or a parenthesized query statement, followed by named arguments.
639        self._match(TokenType.TABLE)
640        this = self._parse_table()
641        if not this:
642            self.raise_error("Expected table or query statement")
643
644        expr = self.expression(exp.AIForecast(this=this))
645        while self._match(TokenType.COMMA):
646            arg = self._parse_lambda()
647            if isinstance(arg, exp.Kwarg):
648                expr.set(arg.this.name, arg)
649            else:
650                self.raise_error(f"Expected key => value syntax for AI.FORECAST, got {arg}")
651                break
652
653        return expr
654
655    def _parse_features_at_time(self) -> exp.FeaturesAtTime:
656        self._match(TokenType.TABLE)
657        this = self._parse_table()
658
659        expr = self.expression(exp.FeaturesAtTime(this=this))
660
661        while self._match(TokenType.COMMA):
662            arg = self._parse_lambda()
663
664            # Get the LHS of the Kwarg and set the arg to that value, e.g
665            # "num_rows => 1" sets the expr's `num_rows` arg
666            if arg:
667                expr.set(arg.this.name, arg)
668
669        return expr
670
671    def _parse_vector_search(self) -> exp.VectorSearch:
672        self._match(TokenType.TABLE)
673        base_table = self._parse_table()
674
675        self._match(TokenType.COMMA)
676
677        column_to_search = self._parse_bitwise()
678        self._match(TokenType.COMMA)
679
680        self._match(TokenType.TABLE)
681        query_table = self._parse_table()
682
683        expr = self.expression(
684            exp.VectorSearch(
685                this=base_table, column_to_search=column_to_search, query_table=query_table
686            )
687        )
688
689        while self._match(TokenType.COMMA):
690            # query_column_to_search can be named argument or positional
691            if self._match(TokenType.STRING, advance=False):
692                query_column = self._parse_string()
693                expr.set("query_column_to_search", query_column)
694            else:
695                arg = self._parse_lambda()
696                if arg:
697                    expr.set(arg.this.name, arg)
698
699        return expr
700
701    def _parse_export_data(self) -> exp.Export:
702        self._match_text_seq("DATA")
703
704        return self.expression(
705            exp.Export(
706                connection=self._match_text_seq("WITH", "CONNECTION") and self._parse_table_parts(),
707                options=self._parse_properties(),
708                this=self._match_text_seq("AS") and self._parse_select(nested=True),
709            )
710        )
711
712    def _parse_column_ops(self, this: exp.Expr | None) -> exp.Expr | None:
713        func_index = self._index + 1
714        this = super()._parse_column_ops(this)
715
716        if isinstance(this, exp.Dot) and isinstance(this.expression, exp.Func):
717            prefix = this.this.name.upper()
718
719            func: type[exp.Func] | None = None
720            if prefix == "NET":
721                func = exp.NetFunc
722            elif prefix == "SAFE":
723                func = exp.SafeFunc
724
725            if func:
726                # Retreat to try and parse a known function instead of an anonymous one,
727                # which is parsed by the base column ops parser due to anonymous_func=true
728                self._retreat(func_index)
729                this = func(this=self._parse_function(any_token=True))
730            elif prefix in ("AI", "ML"):
731                # AI.* and ML.* function calls can use custom BigQuery signatures that rely on
732                # function parsers, so re-parse the function in non-anonymous mode.
733                self._retreat(func_index)
734                parsed = self._parse_function(any_token=True)
735                if parsed:
736                    this = self.expression(exp.Dot(this=this.this, expression=parsed))
737
738        return this
def build_date_diff(args: list) -> sqlglot.expressions.core.Expr:
31def build_date_diff(args: list) -> exp.Expr:
32    expr = exp.DateDiff(
33        this=seq_get(args, 0),
34        expression=seq_get(args, 1),
35        unit=seq_get(args, 2),
36        date_part_boundary=True,
37    )
38
39    unit = expr.args.get("unit")
40    if isinstance(unit, exp.Var) and unit.name.upper() == "WEEK":
41        expr.set("unit", exp.WeekStart(this=exp.var("SUNDAY")))
42
43    return expr
MAKE_INTERVAL_KWARGS = ['year', 'month', 'day', 'hour', 'minute', 'second']
class BigQueryParser(sqlglot.parser.Parser):
146class BigQueryParser(parser.Parser):
147    PREFIXED_PIVOT_COLUMNS: t.ClassVar = True
148    LOG_DEFAULTS_TO_LN: t.ClassVar = True
149    SUPPORTS_IMPLICIT_UNNEST: t.ClassVar = True
150    JOINS_HAVE_EQUAL_PRECEDENCE: t.ClassVar = True
151
152    # BigQuery does not allow ASC/DESC to be used as an identifier, allows GRANT as an identifier
153    ID_VAR_TOKENS: t.ClassVar = {
154        *parser.Parser.ID_VAR_TOKENS,
155        TokenType.GRANT,
156    } - {TokenType.ASC, TokenType.DESC}
157
158    ALIAS_TOKENS: t.ClassVar = {
159        *parser.Parser.ALIAS_TOKENS,
160        TokenType.GRANT,
161    } - {TokenType.ASC, TokenType.DESC}
162
163    TABLE_ALIAS_TOKENS: t.ClassVar = {
164        *parser.Parser.TABLE_ALIAS_TOKENS,
165        TokenType.ANTI,
166        TokenType.GRANT,
167        TokenType.SEMI,
168    } - {TokenType.ASC, TokenType.DESC}
169
170    COMMENT_TABLE_ALIAS_TOKENS: t.ClassVar = {
171        *parser.Parser.COMMENT_TABLE_ALIAS_TOKENS,
172        TokenType.GRANT,
173    } - {TokenType.ASC, TokenType.DESC}
174
175    UPDATE_ALIAS_TOKENS: t.ClassVar = {
176        *parser.Parser.UPDATE_ALIAS_TOKENS,
177        TokenType.GRANT,
178    } - {TokenType.ASC, TokenType.DESC}
179
180    FUNCTIONS: t.ClassVar[dict[str, t.Callable]] = {
181        **{k: v for k, v in parser.Parser.FUNCTIONS.items() if k != "SEARCH"},
182        "APPROX_TOP_COUNT": exp.ApproxTopK.from_arg_list,
183        "BIT_AND": exp.BitwiseAndAgg.from_arg_list,
184        "BIT_OR": exp.BitwiseOrAgg.from_arg_list,
185        "BIT_XOR": exp.BitwiseXorAgg.from_arg_list,
186        "BIT_COUNT": exp.BitwiseCount.from_arg_list,
187        "BOOL": exp.JSONBool.from_arg_list,
188        "CONTAINS_SUBSTR": _build_contains_substring,
189        "DATE": _build_date,
190        "DATE_ADD": build_date_delta_with_interval(exp.DateAdd),
191        "DATE_DIFF": build_date_diff,
192        "DATE_SUB": build_date_delta_with_interval(exp.DateSub),
193        "DATE_TRUNC": lambda args: exp.DateTrunc(
194            unit=seq_get(args, 1),
195            this=seq_get(args, 0),
196            zone=seq_get(args, 2),
197        ),
198        "DATETIME": _build_datetime,
199        "DATETIME_ADD": build_date_delta_with_interval(exp.DatetimeAdd),
200        "DATETIME_SUB": build_date_delta_with_interval(exp.DatetimeSub),
201        "DIV": binary_from_function(exp.IntDiv),
202        "EDIT_DISTANCE": _build_levenshtein,
203        "EMBED": exp.AIEmbed.from_arg_list,
204        "FORMAT_DATE": _build_format_time(exp.TsOrDsToDate),
205        "GENERATE": exp.AIGenerate.from_arg_list,
206        "GENERATE_ARRAY": exp.GenerateSeries.from_arg_list,
207        "JSON_EXTRACT_SCALAR": _build_extract_json_with_default_path(exp.JSONExtractScalar),
208        "JSON_EXTRACT_ARRAY": _build_extract_json_with_default_path(exp.JSONExtractArray),
209        "JSON_EXTRACT_STRING_ARRAY": _build_extract_json_with_default_path(exp.JSONValueArray),
210        "JSON_KEYS": exp.JSONKeysAtDepth.from_arg_list,
211        "JSON_QUERY": parser.build_extract_json_with_path(exp.JSONExtract),
212        "JSON_QUERY_ARRAY": _build_extract_json_with_default_path(exp.JSONExtractArray),
213        "JSON_STRIP_NULLS": _build_json_strip_nulls,
214        "JSON_VALUE": _build_extract_json_with_default_path(exp.JSONExtractScalar),
215        "JSON_VALUE_ARRAY": _build_extract_json_with_default_path(exp.JSONValueArray),
216        "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True),
217        "MD5": exp.MD5Digest.from_arg_list,
218        "SHA1": exp.SHA1Digest.from_arg_list,
219        "NORMALIZE_AND_CASEFOLD": lambda args: exp.Normalize(
220            this=seq_get(args, 0), form=seq_get(args, 1), is_casefold=True
221        ),
222        "OCTET_LENGTH": exp.ByteLength.from_arg_list,
223        "TO_HEX": _build_to_hex,
224        "PARSE_DATE": lambda args: build_formatted_time(exp.StrToDate, "bigquery")(
225            [seq_get(args, 1), seq_get(args, 0)]
226        ),
227        "PARSE_TIME": lambda args: build_formatted_time(exp.ParseTime, "bigquery")(
228            [seq_get(args, 1), seq_get(args, 0)]
229        ),
230        "PARSE_TIMESTAMP": _build_parse_timestamp,
231        "PARSE_DATETIME": lambda args: build_formatted_time(exp.ParseDatetime, "bigquery")(
232            [seq_get(args, 1), seq_get(args, 0)]
233        ),
234        "REGEXP_CONTAINS": exp.RegexpLike.from_arg_list,
235        "REGEXP_EXTRACT": _build_regexp_extract(exp.RegexpExtract),
236        "REGEXP_SUBSTR": _build_regexp_extract(exp.RegexpExtract),
237        "REGEXP_EXTRACT_ALL": _build_regexp_extract(
238            exp.RegexpExtractAll, default_group=exp.Literal.number(0)
239        ),
240        "SHA256": lambda args: exp.SHA2Digest(
241            this=seq_get(args, 0), length=exp.Literal.number(256)
242        ),
243        "SHA512": lambda args: exp.SHA2(this=seq_get(args, 0), length=exp.Literal.number(512)),
244        "SIMILARITY": exp.AISimilarity.from_arg_list,
245        "SPLIT": lambda args: exp.Split(
246            # https://cloud.google.com/bigquery/docs/reference/standard-sql/string_functions#split
247            this=seq_get(args, 0),
248            expression=seq_get(args, 1) or exp.Literal.string(","),
249        ),
250        "STRPOS": exp.StrPosition.from_arg_list,
251        "TIME": _build_time,
252        "TIME_ADD": build_date_delta_with_interval(exp.TimeAdd),
253        "TIME_SUB": build_date_delta_with_interval(exp.TimeSub),
254        "TIMESTAMP": _build_timestamp,
255        "TIMESTAMP_ADD": build_date_delta_with_interval(exp.TimestampAdd),
256        "TIMESTAMP_SUB": build_date_delta_with_interval(exp.TimestampSub),
257        "TIMESTAMP_MICROS": lambda args: exp.UnixToTime(
258            this=seq_get(args, 0), scale=exp.UnixToTime.MICROS
259        ),
260        "TIMESTAMP_MILLIS": lambda args: exp.UnixToTime(
261            this=seq_get(args, 0), scale=exp.UnixToTime.MILLIS
262        ),
263        "TIMESTAMP_SECONDS": lambda args: exp.UnixToTime(this=seq_get(args, 0)),
264        "TO_JSON": lambda args: exp.JSONFormat(
265            this=seq_get(args, 0), options=seq_get(args, 1), to_json=True
266        ),
267        "TO_JSON_STRING": exp.JSONFormat.from_arg_list,
268        "FORMAT_DATETIME": _build_format_time(exp.TsOrDsToDatetime),
269        "FORMAT_TIMESTAMP": _build_format_time(exp.TsOrDsToTimestamp),
270        "FORMAT_TIME": _build_format_time(exp.TsOrDsToTime),
271        "FROM_HEX": exp.Unhex.from_arg_list,
272        "WEEK": lambda args: exp.WeekStart(this=exp.var(seq_get(args, 0))),
273    }
274
275    FUNCTION_PARSERS = {
276        **{k: v for k, v in parser.Parser.FUNCTION_PARSERS.items() if k != "TRIM"},
277        "ARRAY": lambda self: self.expression(
278            exp.Array(expressions=[self._parse_statement()], struct_name_inheritance=True)
279        ),
280        "JSON_ARRAY": lambda self: self.expression(
281            exp.JSONArray(expressions=self._parse_csv(self._parse_bitwise))
282        ),
283        "MAKE_INTERVAL": lambda self: self._parse_make_interval(),
284        "PREDICT": lambda self: self._parse_ml(exp.Predict),
285        "TRANSLATE": lambda self: self._parse_translate(),
286        "FEATURES_AT_TIME": lambda self: self._parse_features_at_time(),
287        "GENERATE_EMBEDDING": lambda self: self._parse_ml(exp.GenerateEmbedding),
288        "GENERATE_TEXT_EMBEDDING": lambda self: self._parse_ml(exp.GenerateEmbedding, is_text=True),
289        "GENERATE_TEXT": lambda self: self._parse_generate(exp.GenerateText),
290        "GENERATE_TABLE": lambda self: self._parse_generate(exp.GenerateTable),
291        "GENERATE_BOOL": lambda self: self._parse_generate(exp.GenerateBool),
292        "GENERATE_INT": lambda self: self._parse_generate(exp.GenerateInt),
293        "GENERATE_DOUBLE": lambda self: self._parse_generate(exp.GenerateDouble),
294        "VECTOR_SEARCH": lambda self: self._parse_vector_search(),
295        "FORECAST": lambda self: self._parse_forecast(),
296    }
297
298    NO_PAREN_FUNCTIONS: t.ClassVar = {
299        **parser.Parser.NO_PAREN_FUNCTIONS,
300        TokenType.CURRENT_DATETIME: exp.CurrentDatetime,
301    }
302
303    NESTED_TYPE_TOKENS: t.ClassVar = {
304        *parser.Parser.NESTED_TYPE_TOKENS,
305        TokenType.TABLE,
306    }
307
308    PROPERTY_PARSERS: t.ClassVar = {
309        **parser.Parser.PROPERTY_PARSERS,
310        "NOT DETERMINISTIC": lambda self: self.expression(
311            exp.StabilityProperty(this=exp.Literal.string("VOLATILE"))
312        ),
313        "OPTIONS": lambda self: self._parse_with_property(),
314    }
315
316    CONSTRAINT_PARSERS: t.ClassVar = {
317        **parser.Parser.CONSTRAINT_PARSERS,
318        "OPTIONS": lambda self: exp.Properties(expressions=self._parse_with_property()),
319    }
320
321    RANGE_PARSERS: t.ClassVar = {
322        k: v for k, v in parser.Parser.RANGE_PARSERS.items() if k != TokenType.OVERLAPS
323    }
324
325    DASHED_TABLE_PART_FOLLOW_TOKENS: t.ClassVar = {
326        TokenType.DOT,
327        TokenType.L_PAREN,
328        TokenType.R_PAREN,
329    }
330
331    STATEMENT_PARSERS: t.ClassVar = {
332        **parser.Parser.STATEMENT_PARSERS,
333        TokenType.ELSE: lambda self: self._parse_as_command(self._prev),
334        TokenType.END: lambda self: self._parse_as_command(self._prev),
335        TokenType.FOR: lambda self: self._parse_for_in(),
336        TokenType.EXPORT: lambda self: self._parse_export_data(),
337        TokenType.DECLARE: lambda self: self._parse_declare(),
338    }
339
340    BRACKET_OFFSETS: t.ClassVar = {
341        "OFFSET": (0, False),
342        "ORDINAL": (1, False),
343        "SAFE_OFFSET": (0, True),
344        "SAFE_ORDINAL": (1, True),
345    }
346
347    def _parse_for_in(self) -> exp.ForIn | exp.Command:
348        index = self._index
349        this = self._parse_range()
350        self._match_text_seq("DO")
351        if self._match(TokenType.COMMAND):
352            self._retreat(index)
353            return self._parse_as_command(self._prev)
354        return self.expression(exp.ForIn(this=this, expression=self._parse_statement()))
355
356    def _parse_table_part(self, schema: bool = False) -> exp.Expr | None:
357        this = super()._parse_table_part(schema=schema) or self._parse_number()
358
359        # https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#table_names
360        if isinstance(this, exp.Identifier):
361            table_name = this.name
362            while self._match(TokenType.DASH, advance=False) and self._next:
363                start = self._curr
364                while self._is_connected() and not self._match_set(
365                    self.DASHED_TABLE_PART_FOLLOW_TOKENS, advance=False
366                ):
367                    self._advance()
368
369                if start == self._curr:
370                    break
371
372                table_name += self._find_sql(start, self._prev)
373
374            this = exp.Identifier(this=table_name, quoted=this.args.get("quoted")).update_positions(
375                this
376            )
377        elif isinstance(this, exp.Literal):
378            table_name = this.name
379
380            if self._is_connected() and self._parse_var(any_token=True):
381                table_name += self._prev.text
382
383            this = exp.Identifier(this=table_name, quoted=True).update_positions(this)
384
385        return this
386
387    def _parse_table_parts(
388        self,
389        schema: bool = False,
390        is_db_reference: bool = False,
391        wildcard: bool = False,
392        fast: bool = False,
393    ) -> exp.Table | exp.Dot | None:
394        table = super()._parse_table_parts(
395            schema=schema, is_db_reference=is_db_reference, wildcard=True, fast=fast
396        )
397
398        if not isinstance(table, exp.Table):
399            return table
400
401        # proj-1.db.tbl -- `1.` is tokenized as a float so we need to unravel it here
402        if not table.catalog:
403            if table.db:
404                previous_db = table.args["db"]
405                parts = table.db.split(".")
406                if len(parts) == 2 and not table.args["db"].quoted:
407                    table.set(
408                        "catalog", exp.Identifier(this=parts[0]).update_positions(previous_db)
409                    )
410                    table.set("db", exp.Identifier(this=parts[1]).update_positions(previous_db))
411            else:
412                previous_this = table.this
413                parts = table.name.split(".")
414                if len(parts) == 2 and not table.this.quoted:
415                    table.set("db", exp.Identifier(this=parts[0]).update_positions(previous_this))
416                    table.set("this", exp.Identifier(this=parts[1]).update_positions(previous_this))
417
418        if isinstance(table.this, exp.Identifier) and any("." in p.name for p in table.parts):
419            alias = table.this
420            catalog, db, this_id, *rest = (
421                exp.to_identifier(p, quoted=True)
422                for p in split_num_words(".".join(p.name for p in table.parts), ".", 3)
423            )
424
425            for part in (catalog, db, this_id):
426                if part:
427                    part.update_positions(table.this)
428
429            this: exp.Expr | None = this_id
430            if rest and this:
431                this = exp.Dot.build([this, *rest])  # type: ignore[list-item]
432
433            table = exp.Table(this=this, db=db, catalog=catalog, pivots=table.args.get("pivots"))
434            table.meta["quoted_table"] = True
435        else:
436            alias = None
437
438        # The `INFORMATION_SCHEMA` views in BigQuery need to be qualified by a region or
439        # dataset, so if the project identifier is omitted we need to fix the ast so that
440        # the `INFORMATION_SCHEMA.X` bit is represented as a single (quoted) Identifier.
441        # Otherwise, we wouldn't correctly qualify a `Table` node that references these
442        # views, because it would seem like the "catalog" part is set, when it'd actually
443        # be the region/dataset. Merging the two identifiers into a single one is done to
444        # avoid producing a 4-part Table reference, which would cause issues in the schema
445        # module, when there are 3-part table names mixed with information schema views.
446        #
447        # See: https://cloud.google.com/bigquery/docs/information-schema-intro#syntax
448        table_parts = table.parts
449        if len(table_parts) > 1 and table_parts[-2].name.upper() == "INFORMATION_SCHEMA":
450            # We need to alias the table here to avoid breaking existing qualified columns.
451            # This is expected to be safe, because if there's an actual alias coming up in
452            # the token stream, it will overwrite this one. If there isn't one, we are only
453            # exposing the name that can be used to reference the view explicitly (a no-op).
454            exp.alias_(
455                table,
456                t.cast(exp.Identifier, alias or table_parts[-1]),
457                table=True,
458                copy=False,
459            )
460
461            info_schema_view = f"{table_parts[-2].name}.{table_parts[-1].name}"
462            new_this = exp.Identifier(this=info_schema_view, quoted=True).update_positions(
463                line=table_parts[-2].meta.get("line"),
464                col=table_parts[-1].meta.get("col"),
465                start=table_parts[-2].meta.get("start"),
466                end=table_parts[-1].meta.get("end"),
467            )
468            table.set("this", new_this)
469            table.set("db", seq_get(table_parts, -3))
470            table.set("catalog", seq_get(table_parts, -4))
471
472        return table
473
474    def _parse_column(self) -> exp.Expr | None:
475        column = super()._parse_column()
476        if isinstance(column, exp.Column):
477            parts = column.parts
478            if any("." in p.name for p in parts):
479                catalog, db, table, this, *rest = (
480                    exp.to_identifier(p, quoted=True)
481                    for p in split_num_words(".".join(p.name for p in parts), ".", 4)
482                )
483
484                if rest and this:
485                    this = exp.Dot.build([this, *rest])  # type: ignore
486
487                column = exp.Column(this=this, table=table, db=db, catalog=catalog)
488                column.meta["quoted_column"] = True
489
490        return column
491
492    @t.overload
493    def _parse_json_object(self, agg: t.Literal[False]) -> exp.JSONObject: ...
494
495    @t.overload
496    def _parse_json_object(self, agg: t.Literal[True]) -> exp.JSONObjectAgg: ...
497
498    def _parse_json_object(self, agg=False):
499        json_object = super()._parse_json_object()
500        array_kv_pair = seq_get(json_object.expressions, 0)
501
502        # Converts BQ's "signature 2" of JSON_OBJECT into SQLGlot's canonical representation
503        # https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#json_object_signature2
504        if (
505            array_kv_pair
506            and isinstance(array_kv_pair.this, exp.Array)
507            and isinstance(array_kv_pair.expression, exp.Array)
508        ):
509            keys = array_kv_pair.this.expressions
510            values = array_kv_pair.expression.expressions
511
512            json_object.set(
513                "expressions",
514                [exp.JSONKeyValue(this=k, expression=v) for k, v in zip(keys, values)],
515            )
516
517        return json_object
518
519    def _parse_bracket(self, this: exp.Expr | None = None) -> exp.Expr | None:
520        bracket = super()._parse_bracket(this)
521
522        if isinstance(bracket, exp.Array):
523            bracket.set("struct_name_inheritance", True)
524
525        if this is bracket:
526            return bracket
527
528        if isinstance(bracket, exp.Bracket):
529            for expression in bracket.expressions:
530                name = expression.name.upper()
531
532                expressions = expression.expressions
533
534                if name not in self.BRACKET_OFFSETS or not expressions:
535                    break
536
537                offset, safe = self.BRACKET_OFFSETS[name]
538                bracket.set("offset", offset)
539                bracket.set("safe", safe)
540                expression.replace(expressions[0])
541
542        return bracket
543
544    def _parse_unnest(self, with_alias: bool = True) -> exp.Unnest | None:
545        unnest = super()._parse_unnest(with_alias=with_alias)
546
547        if not unnest:
548            return None
549
550        unnest_expr = seq_get(unnest.expressions, 0)
551        if unnest_expr:
552            from sqlglot.optimizer.annotate_types import annotate_types
553
554            unnest_expr = annotate_types(unnest_expr, dialect=self.dialect)
555
556            # Unnesting a nested array (i.e array of structs) explodes the top-level struct fields,
557            # in contrast to other dialects such as DuckDB which flattens only the array by default
558            if unnest_expr.is_type(exp.DType.ARRAY) and any(
559                array_elem.is_type(exp.DType.STRUCT) for array_elem in unnest_expr._type.expressions
560            ):
561                unnest.set("explode_array", True)
562
563        return unnest
564
565    def _parse_make_interval(self) -> exp.MakeInterval:
566        expr = exp.MakeInterval()
567
568        for arg_key in MAKE_INTERVAL_KWARGS:
569            value = self._parse_lambda()
570
571            if not value:
572                break
573
574            # Non-named arguments are filled sequentially, (optionally) followed by named arguments
575            # that can appear in any order e.g MAKE_INTERVAL(1, minute => 5, day => 2)
576            if isinstance(value, exp.Kwarg):
577                arg_key = value.this.name
578
579            expr.set(arg_key, value)
580
581            self._match(TokenType.COMMA)
582
583        return expr
584
585    def _parse_ml(self, expr_type: type[E], **kwargs: t.Any) -> E:
586        self._match_text_seq("MODEL")
587        this = self._parse_table()
588
589        self._match(TokenType.COMMA)
590        self._match_text_seq("TABLE")
591
592        # Certain functions like ML.FORECAST require a STRUCT argument but not a TABLE/SELECT one
593        expression = (
594            self._parse_table() if not self._match(TokenType.STRUCT, advance=False) else None
595        )
596
597        self._match(TokenType.COMMA)
598
599        return self.expression(
600            expr_type(
601                this=this, expression=expression, params_struct=self._parse_bitwise(), **kwargs
602            )
603        )
604
605    def _parse_generate(self, expr_type: type[E], **kwargs: t.Any) -> E:
606        self._match_text_seq("MODEL")
607        this = self._parse_table()
608
609        self._match(TokenType.COMMA)
610
611        if self._match_text_seq("TABLE"):
612            expression = self._parse_table()
613        elif self._match(TokenType.L_PAREN, advance=False):
614            expression = self._parse_table()
615        else:
616            expression = self._parse_bitwise()
617
618        params_struct = self._match(TokenType.COMMA) and self._parse_bitwise()
619
620        return self.expression(
621            expr_type(this=this, expression=expression, params_struct=params_struct, **kwargs)
622        )
623
624    def _parse_translate(self) -> exp.Translate | exp.MLTranslate:
625        # Check if this is ML.TRANSLATE by looking at previous tokens
626        token = seq_get(self._tokens, self._index - 4)
627        if token and token.text.upper() == "ML":
628            return self._parse_ml(exp.MLTranslate)
629
630        return exp.Translate.from_arg_list(self._parse_function_args())
631
632    def _parse_forecast(self) -> exp.AIForecast | exp.MLForecast:
633        # Check if this is ML.FORECAST by looking at previous tokens.
634        token = seq_get(self._tokens, self._index - 4)
635        if token and token.text.upper() == "ML":
636            return self._parse_ml(exp.MLForecast)
637
638        # AI.FORECAST is a TVF, where the first argument is either TABLE <table>
639        # or a parenthesized query statement, followed by named arguments.
640        self._match(TokenType.TABLE)
641        this = self._parse_table()
642        if not this:
643            self.raise_error("Expected table or query statement")
644
645        expr = self.expression(exp.AIForecast(this=this))
646        while self._match(TokenType.COMMA):
647            arg = self._parse_lambda()
648            if isinstance(arg, exp.Kwarg):
649                expr.set(arg.this.name, arg)
650            else:
651                self.raise_error(f"Expected key => value syntax for AI.FORECAST, got {arg}")
652                break
653
654        return expr
655
656    def _parse_features_at_time(self) -> exp.FeaturesAtTime:
657        self._match(TokenType.TABLE)
658        this = self._parse_table()
659
660        expr = self.expression(exp.FeaturesAtTime(this=this))
661
662        while self._match(TokenType.COMMA):
663            arg = self._parse_lambda()
664
665            # Get the LHS of the Kwarg and set the arg to that value, e.g
666            # "num_rows => 1" sets the expr's `num_rows` arg
667            if arg:
668                expr.set(arg.this.name, arg)
669
670        return expr
671
672    def _parse_vector_search(self) -> exp.VectorSearch:
673        self._match(TokenType.TABLE)
674        base_table = self._parse_table()
675
676        self._match(TokenType.COMMA)
677
678        column_to_search = self._parse_bitwise()
679        self._match(TokenType.COMMA)
680
681        self._match(TokenType.TABLE)
682        query_table = self._parse_table()
683
684        expr = self.expression(
685            exp.VectorSearch(
686                this=base_table, column_to_search=column_to_search, query_table=query_table
687            )
688        )
689
690        while self._match(TokenType.COMMA):
691            # query_column_to_search can be named argument or positional
692            if self._match(TokenType.STRING, advance=False):
693                query_column = self._parse_string()
694                expr.set("query_column_to_search", query_column)
695            else:
696                arg = self._parse_lambda()
697                if arg:
698                    expr.set(arg.this.name, arg)
699
700        return expr
701
702    def _parse_export_data(self) -> exp.Export:
703        self._match_text_seq("DATA")
704
705        return self.expression(
706            exp.Export(
707                connection=self._match_text_seq("WITH", "CONNECTION") and self._parse_table_parts(),
708                options=self._parse_properties(),
709                this=self._match_text_seq("AS") and self._parse_select(nested=True),
710            )
711        )
712
713    def _parse_column_ops(self, this: exp.Expr | None) -> exp.Expr | None:
714        func_index = self._index + 1
715        this = super()._parse_column_ops(this)
716
717        if isinstance(this, exp.Dot) and isinstance(this.expression, exp.Func):
718            prefix = this.this.name.upper()
719
720            func: type[exp.Func] | None = None
721            if prefix == "NET":
722                func = exp.NetFunc
723            elif prefix == "SAFE":
724                func = exp.SafeFunc
725
726            if func:
727                # Retreat to try and parse a known function instead of an anonymous one,
728                # which is parsed by the base column ops parser due to anonymous_func=true
729                self._retreat(func_index)
730                this = func(this=self._parse_function(any_token=True))
731            elif prefix in ("AI", "ML"):
732                # AI.* and ML.* function calls can use custom BigQuery signatures that rely on
733                # function parsers, so re-parse the function in non-anonymous mode.
734                self._retreat(func_index)
735                parsed = self._parse_function(any_token=True)
736                if parsed:
737                    this = self.expression(exp.Dot(this=this.this, expression=parsed))
738
739        return this

Parser consumes a list of tokens produced by the Tokenizer and produces a parsed syntax tree.

Arguments:
  • error_level: The desired error level. Default: ErrorLevel.IMMEDIATE
  • error_message_context: The amount of context to capture from a query string when displaying the error message (in number of characters). Default: 100
  • max_errors: Maximum number of error messages to include in a raised ParseError. This is only relevant if error_level is ErrorLevel.RAISE. Default: 3
  • max_nodes: Maximum number of AST nodes to prevent memory exhaustion. Set to -1 (default) to disable the check.
PREFIXED_PIVOT_COLUMNS: ClassVar = True
LOG_DEFAULTS_TO_LN: ClassVar = True
SUPPORTS_IMPLICIT_UNNEST: ClassVar = True
JOINS_HAVE_EQUAL_PRECEDENCE: ClassVar = True
ID_VAR_TOKENS: ClassVar = {<TokenType.SESSION: 57>, <TokenType.SESSION_USER: 59>, <TokenType.IDENTIFIER: 77>, <TokenType.DATABASE: 78>, <TokenType.COLUMN: 79>, <TokenType.SCHEMA: 81>, <TokenType.TABLE: 82>, <TokenType.WAREHOUSE: 83>, <TokenType.STAGE: 84>, <TokenType.STREAM: 85>, <TokenType.STREAMLIT: 86>, <TokenType.VAR: 87>, <TokenType.BIT: 95>, <TokenType.BOOLEAN: 96>, <TokenType.TINYINT: 97>, <TokenType.UTINYINT: 98>, <TokenType.SMALLINT: 99>, <TokenType.USMALLINT: 100>, <TokenType.MEDIUMINT: 101>, <TokenType.UMEDIUMINT: 102>, <TokenType.INT: 103>, <TokenType.UINT: 104>, <TokenType.BIGINT: 105>, <TokenType.UBIGINT: 106>, <TokenType.BIGNUM: 107>, <TokenType.INT128: 108>, <TokenType.UINT128: 109>, <TokenType.INT256: 110>, <TokenType.UINT256: 111>, <TokenType.FLOAT: 112>, <TokenType.DOUBLE: 113>, <TokenType.UDOUBLE: 114>, <TokenType.DECIMAL: 115>, <TokenType.DECIMAL32: 116>, <TokenType.DECIMAL64: 117>, <TokenType.DECIMAL128: 118>, <TokenType.DECIMAL256: 119>, <TokenType.DECFLOAT: 120>, <TokenType.UDECIMAL: 121>, <TokenType.BIGDECIMAL: 122>, <TokenType.CHAR: 123>, <TokenType.NCHAR: 124>, <TokenType.VARCHAR: 125>, <TokenType.NVARCHAR: 126>, <TokenType.BPCHAR: 127>, <TokenType.TEXT: 128>, <TokenType.MEDIUMTEXT: 129>, <TokenType.LONGTEXT: 130>, <TokenType.BLOB: 131>, <TokenType.MEDIUMBLOB: 132>, <TokenType.LONGBLOB: 133>, <TokenType.TINYBLOB: 134>, <TokenType.TINYTEXT: 135>, <TokenType.NAME: 136>, <TokenType.BINARY: 137>, <TokenType.VARBINARY: 138>, <TokenType.JSON: 139>, <TokenType.JSONB: 140>, <TokenType.TIME: 141>, <TokenType.TIMETZ: 142>, <TokenType.TIME_NS: 143>, <TokenType.TIMESTAMP: 144>, <TokenType.TIMESTAMPTZ: 145>, <TokenType.TIMESTAMPLTZ: 146>, <TokenType.TIMESTAMPNTZ: 147>, <TokenType.TIMESTAMP_S: 148>, <TokenType.TIMESTAMP_MS: 149>, <TokenType.TIMESTAMP_NS: 150>, <TokenType.DATETIME: 151>, <TokenType.DATETIME2: 152>, <TokenType.DATETIME64: 153>, <TokenType.SMALLDATETIME: 154>, <TokenType.DATE: 155>, <TokenType.DATE32: 156>, <TokenType.INT4RANGE: 157>, <TokenType.INT4MULTIRANGE: 158>, <TokenType.INT8RANGE: 159>, <TokenType.INT8MULTIRANGE: 160>, <TokenType.NUMRANGE: 161>, <TokenType.NUMMULTIRANGE: 162>, <TokenType.TSRANGE: 163>, <TokenType.TSMULTIRANGE: 164>, <TokenType.TSTZRANGE: 165>, <TokenType.TSTZMULTIRANGE: 166>, <TokenType.DATERANGE: 167>, <TokenType.DATEMULTIRANGE: 168>, <TokenType.UUID: 169>, <TokenType.GEOGRAPHY: 170>, <TokenType.GEOGRAPHYPOINT: 171>, <TokenType.NULLABLE: 172>, <TokenType.GEOMETRY: 173>, <TokenType.POINT: 174>, <TokenType.RING: 175>, <TokenType.LINESTRING: 176>, <TokenType.LOCALTIME: 177>, <TokenType.LOCALTIMESTAMP: 178>, <TokenType.MULTILINESTRING: 180>, <TokenType.POLYGON: 181>, <TokenType.MULTIPOLYGON: 182>, <TokenType.HLLSKETCH: 183>, <TokenType.HSTORE: 184>, <TokenType.SUPER: 185>, <TokenType.SERIAL: 186>, <TokenType.SMALLSERIAL: 187>, <TokenType.BIGSERIAL: 188>, <TokenType.XML: 189>, <TokenType.YEAR: 190>, <TokenType.USERDEFINED: 191>, <TokenType.MONEY: 192>, <TokenType.SMALLMONEY: 193>, <TokenType.ROWVERSION: 194>, <TokenType.IMAGE: 195>, <TokenType.VARIANT: 196>, <TokenType.OBJECT: 197>, <TokenType.INET: 198>, <TokenType.IPADDRESS: 199>, <TokenType.IPPREFIX: 200>, <TokenType.IPV4: 201>, <TokenType.IPV6: 202>, <TokenType.ENUM: 203>, <TokenType.ENUM8: 204>, <TokenType.ENUM16: 205>, <TokenType.FIXEDSTRING: 206>, <TokenType.LOWCARDINALITY: 207>, <TokenType.NESTED: 208>, <TokenType.AGGREGATEFUNCTION: 209>, <TokenType.SIMPLEAGGREGATEFUNCTION: 210>, <TokenType.TDIGEST: 211>, <TokenType.UNKNOWN: 212>, <TokenType.VECTOR: 213>, <TokenType.DYNAMIC: 214>, <TokenType.VOID: 215>, <TokenType.ALL: 218>, <TokenType.ANTI: 219>, <TokenType.ANY: 220>, <TokenType.APPLY: 221>, <TokenType.ARRAY: 222>, <TokenType.ASOF: 224>, <TokenType.ATTACH: 225>, <TokenType.AUTO_INCREMENT: 226>, <TokenType.BEGIN: 227>, <TokenType.CACHE: 230>, <TokenType.CASE: 231>, <TokenType.COLLATE: 234>, <TokenType.COMMAND: 235>, <TokenType.COMMENT: 236>, <TokenType.COMMIT: 237>, <TokenType.CONSTRAINT: 239>, <TokenType.COPY: 240>, <TokenType.CUBE: 243>, <TokenType.CURRENT_DATE: 244>, <TokenType.CURRENT_DATETIME: 245>, <TokenType.CURRENT_SCHEMA: 246>, <TokenType.CURRENT_TIME: 247>, <TokenType.CURRENT_TIMESTAMP: 248>, <TokenType.CURRENT_USER: 249>, <TokenType.CURRENT_ROLE: 250>, <TokenType.CURRENT_CATALOG: 251>, <TokenType.DEFAULT: 253>, <TokenType.DELETE: 254>, <TokenType.DESCRIBE: 256>, <TokenType.DETACH: 257>, <TokenType.DICTIONARY: 258>, <TokenType.DIV: 261>, <TokenType.END: 264>, <TokenType.ESCAPE: 265>, <TokenType.EXECUTE: 267>, <TokenType.EXISTS: 268>, <TokenType.FALSE: 269>, <TokenType.FILE: 271>, <TokenType.FILE_FORMAT: 272>, <TokenType.FILTER: 273>, <TokenType.FINAL: 274>, <TokenType.FIRST: 275>, <TokenType.FOREIGN_KEY: 278>, <TokenType.FORMAT: 279>, <TokenType.FULL: 281>, <TokenType.FUNCTION: 282>, <TokenType.GET: 283>, <TokenType.GRANT: 286>, <TokenType.INDEX: 294>, <TokenType.INTERVAL: 301>, <TokenType.IS: 305>, <TokenType.ISNULL: 306>, <TokenType.KEEP: 309>, <TokenType.KILL: 311>, <TokenType.LEFT: 314>, <TokenType.LIMIT: 316>, <TokenType.LIST: 317>, <TokenType.LOAD: 318>, <TokenType.LOCK: 319>, <TokenType.MAP: 320>, <TokenType.MATCH: 321>, <TokenType.MERGE: 325>, <TokenType.MODEL: 327>, <TokenType.NATURAL: 328>, <TokenType.NEXT: 329>, <TokenType.NOTHING: 330>, <TokenType.NULL: 332>, <TokenType.OBJECT_IDENTIFIER: 333>, <TokenType.OFFSET: 334>, <TokenType.OPERATOR: 337>, <TokenType.ORDINALITY: 341>, <TokenType.INOUT: 343>, <TokenType.OVER: 345>, <TokenType.OVERLAPS: 346>, <TokenType.OVERWRITE: 347>, <TokenType.PARTITION: 349>, <TokenType.PERCENT: 351>, <TokenType.PIVOT: 352>, <TokenType.PRAGMA: 357>, <TokenType.PROCEDURE: 360>, <TokenType.PSEUDO_TYPE: 362>, <TokenType.PUT: 363>, <TokenType.RANGE: 367>, <TokenType.RECURSIVE: 368>, <TokenType.REFRESH: 369>, <TokenType.RENAME: 370>, <TokenType.REPLACE: 371>, <TokenType.REFERENCES: 374>, <TokenType.RIGHT: 375>, <TokenType.ROLLUP: 379>, <TokenType.ROW: 380>, <TokenType.ROWS: 381>, <TokenType.SEMI: 384>, <TokenType.SEQUENCE: 386>, <TokenType.SET: 388>, <TokenType.SETTINGS: 389>, <TokenType.SHOW: 390>, <TokenType.SOME: 392>, <TokenType.STORAGE_INTEGRATION: 397>, <TokenType.STRAIGHT_JOIN: 398>, <TokenType.STRUCT: 399>, <TokenType.TAG: 402>, <TokenType.TEMPORARY: 403>, <TokenType.TOP: 404>, <TokenType.TRUE: 406>, <TokenType.TRUNCATE: 407>, <TokenType.TRIGGER: 408>, <TokenType.UNNEST: 411>, <TokenType.UNPIVOT: 412>, <TokenType.UPDATE: 413>, <TokenType.USE: 414>, <TokenType.VIEW: 418>, <TokenType.SEMANTIC_VIEW: 419>, <TokenType.VOLATILE: 420>, <TokenType.WINDOW: 424>, <TokenType.UNIQUE: 426>, <TokenType.SINK: 433>, <TokenType.SOURCE: 434>, <TokenType.ANALYZE: 435>, <TokenType.NAMESPACE: 436>, <TokenType.EXPORT: 437>}
ALIAS_TOKENS: ClassVar = {<TokenType.SESSION: 57>, <TokenType.SESSION_USER: 59>, <TokenType.IDENTIFIER: 77>, <TokenType.DATABASE: 78>, <TokenType.COLUMN: 79>, <TokenType.SCHEMA: 81>, <TokenType.TABLE: 82>, <TokenType.WAREHOUSE: 83>, <TokenType.STAGE: 84>, <TokenType.STREAM: 85>, <TokenType.STREAMLIT: 86>, <TokenType.VAR: 87>, <TokenType.BIT: 95>, <TokenType.BOOLEAN: 96>, <TokenType.TINYINT: 97>, <TokenType.UTINYINT: 98>, <TokenType.SMALLINT: 99>, <TokenType.USMALLINT: 100>, <TokenType.MEDIUMINT: 101>, <TokenType.UMEDIUMINT: 102>, <TokenType.INT: 103>, <TokenType.UINT: 104>, <TokenType.BIGINT: 105>, <TokenType.UBIGINT: 106>, <TokenType.BIGNUM: 107>, <TokenType.INT128: 108>, <TokenType.UINT128: 109>, <TokenType.INT256: 110>, <TokenType.UINT256: 111>, <TokenType.FLOAT: 112>, <TokenType.DOUBLE: 113>, <TokenType.UDOUBLE: 114>, <TokenType.DECIMAL: 115>, <TokenType.DECIMAL32: 116>, <TokenType.DECIMAL64: 117>, <TokenType.DECIMAL128: 118>, <TokenType.DECIMAL256: 119>, <TokenType.DECFLOAT: 120>, <TokenType.UDECIMAL: 121>, <TokenType.BIGDECIMAL: 122>, <TokenType.CHAR: 123>, <TokenType.NCHAR: 124>, <TokenType.VARCHAR: 125>, <TokenType.NVARCHAR: 126>, <TokenType.BPCHAR: 127>, <TokenType.TEXT: 128>, <TokenType.MEDIUMTEXT: 129>, <TokenType.LONGTEXT: 130>, <TokenType.BLOB: 131>, <TokenType.MEDIUMBLOB: 132>, <TokenType.LONGBLOB: 133>, <TokenType.TINYBLOB: 134>, <TokenType.TINYTEXT: 135>, <TokenType.NAME: 136>, <TokenType.BINARY: 137>, <TokenType.VARBINARY: 138>, <TokenType.JSON: 139>, <TokenType.JSONB: 140>, <TokenType.TIME: 141>, <TokenType.TIMETZ: 142>, <TokenType.TIME_NS: 143>, <TokenType.TIMESTAMP: 144>, <TokenType.TIMESTAMPTZ: 145>, <TokenType.TIMESTAMPLTZ: 146>, <TokenType.TIMESTAMPNTZ: 147>, <TokenType.TIMESTAMP_S: 148>, <TokenType.TIMESTAMP_MS: 149>, <TokenType.TIMESTAMP_NS: 150>, <TokenType.DATETIME: 151>, <TokenType.DATETIME2: 152>, <TokenType.DATETIME64: 153>, <TokenType.SMALLDATETIME: 154>, <TokenType.DATE: 155>, <TokenType.DATE32: 156>, <TokenType.INT4RANGE: 157>, <TokenType.INT4MULTIRANGE: 158>, <TokenType.INT8RANGE: 159>, <TokenType.INT8MULTIRANGE: 160>, <TokenType.NUMRANGE: 161>, <TokenType.NUMMULTIRANGE: 162>, <TokenType.TSRANGE: 163>, <TokenType.TSMULTIRANGE: 164>, <TokenType.TSTZRANGE: 165>, <TokenType.TSTZMULTIRANGE: 166>, <TokenType.DATERANGE: 167>, <TokenType.DATEMULTIRANGE: 168>, <TokenType.UUID: 169>, <TokenType.GEOGRAPHY: 170>, <TokenType.GEOGRAPHYPOINT: 171>, <TokenType.NULLABLE: 172>, <TokenType.GEOMETRY: 173>, <TokenType.POINT: 174>, <TokenType.RING: 175>, <TokenType.LINESTRING: 176>, <TokenType.LOCALTIME: 177>, <TokenType.LOCALTIMESTAMP: 178>, <TokenType.MULTILINESTRING: 180>, <TokenType.POLYGON: 181>, <TokenType.MULTIPOLYGON: 182>, <TokenType.HLLSKETCH: 183>, <TokenType.HSTORE: 184>, <TokenType.SUPER: 185>, <TokenType.SERIAL: 186>, <TokenType.SMALLSERIAL: 187>, <TokenType.BIGSERIAL: 188>, <TokenType.XML: 189>, <TokenType.YEAR: 190>, <TokenType.USERDEFINED: 191>, <TokenType.MONEY: 192>, <TokenType.SMALLMONEY: 193>, <TokenType.ROWVERSION: 194>, <TokenType.IMAGE: 195>, <TokenType.VARIANT: 196>, <TokenType.OBJECT: 197>, <TokenType.INET: 198>, <TokenType.IPADDRESS: 199>, <TokenType.IPPREFIX: 200>, <TokenType.IPV4: 201>, <TokenType.IPV6: 202>, <TokenType.ENUM: 203>, <TokenType.ENUM8: 204>, <TokenType.ENUM16: 205>, <TokenType.FIXEDSTRING: 206>, <TokenType.LOWCARDINALITY: 207>, <TokenType.NESTED: 208>, <TokenType.AGGREGATEFUNCTION: 209>, <TokenType.SIMPLEAGGREGATEFUNCTION: 210>, <TokenType.TDIGEST: 211>, <TokenType.UNKNOWN: 212>, <TokenType.VECTOR: 213>, <TokenType.DYNAMIC: 214>, <TokenType.VOID: 215>, <TokenType.ALL: 218>, <TokenType.ANTI: 219>, <TokenType.ANY: 220>, <TokenType.APPLY: 221>, <TokenType.ARRAY: 222>, <TokenType.ASOF: 224>, <TokenType.ATTACH: 225>, <TokenType.AUTO_INCREMENT: 226>, <TokenType.BEGIN: 227>, <TokenType.CACHE: 230>, <TokenType.CASE: 231>, <TokenType.COLLATE: 234>, <TokenType.COMMAND: 235>, <TokenType.COMMENT: 236>, <TokenType.COMMIT: 237>, <TokenType.CONSTRAINT: 239>, <TokenType.COPY: 240>, <TokenType.CUBE: 243>, <TokenType.CURRENT_DATE: 244>, <TokenType.CURRENT_DATETIME: 245>, <TokenType.CURRENT_SCHEMA: 246>, <TokenType.CURRENT_TIME: 247>, <TokenType.CURRENT_TIMESTAMP: 248>, <TokenType.CURRENT_USER: 249>, <TokenType.CURRENT_ROLE: 250>, <TokenType.CURRENT_CATALOG: 251>, <TokenType.DEFAULT: 253>, <TokenType.DELETE: 254>, <TokenType.DESCRIBE: 256>, <TokenType.DETACH: 257>, <TokenType.DICTIONARY: 258>, <TokenType.DIV: 261>, <TokenType.END: 264>, <TokenType.ESCAPE: 265>, <TokenType.EXECUTE: 267>, <TokenType.EXISTS: 268>, <TokenType.FALSE: 269>, <TokenType.FILE: 271>, <TokenType.FILE_FORMAT: 272>, <TokenType.FILTER: 273>, <TokenType.FINAL: 274>, <TokenType.FIRST: 275>, <TokenType.FOREIGN_KEY: 278>, <TokenType.FORMAT: 279>, <TokenType.FULL: 281>, <TokenType.FUNCTION: 282>, <TokenType.GET: 283>, <TokenType.GRANT: 286>, <TokenType.INDEX: 294>, <TokenType.INTERVAL: 301>, <TokenType.IS: 305>, <TokenType.ISNULL: 306>, <TokenType.KEEP: 309>, <TokenType.KILL: 311>, <TokenType.LEFT: 314>, <TokenType.LIMIT: 316>, <TokenType.LIST: 317>, <TokenType.LOAD: 318>, <TokenType.LOCK: 319>, <TokenType.MAP: 320>, <TokenType.MATCH: 321>, <TokenType.MERGE: 325>, <TokenType.MODEL: 327>, <TokenType.NATURAL: 328>, <TokenType.NEXT: 329>, <TokenType.NOTHING: 330>, <TokenType.NULL: 332>, <TokenType.OBJECT_IDENTIFIER: 333>, <TokenType.OFFSET: 334>, <TokenType.OPERATOR: 337>, <TokenType.ORDINALITY: 341>, <TokenType.INOUT: 343>, <TokenType.OVER: 345>, <TokenType.OVERLAPS: 346>, <TokenType.OVERWRITE: 347>, <TokenType.PARTITION: 349>, <TokenType.PERCENT: 351>, <TokenType.PIVOT: 352>, <TokenType.PRAGMA: 357>, <TokenType.PROCEDURE: 360>, <TokenType.PSEUDO_TYPE: 362>, <TokenType.PUT: 363>, <TokenType.RANGE: 367>, <TokenType.RECURSIVE: 368>, <TokenType.REFRESH: 369>, <TokenType.RENAME: 370>, <TokenType.REPLACE: 371>, <TokenType.REFERENCES: 374>, <TokenType.RIGHT: 375>, <TokenType.ROLLUP: 379>, <TokenType.ROW: 380>, <TokenType.ROWS: 381>, <TokenType.SEMI: 384>, <TokenType.SEQUENCE: 386>, <TokenType.SET: 388>, <TokenType.SETTINGS: 389>, <TokenType.SHOW: 390>, <TokenType.SOME: 392>, <TokenType.STORAGE_INTEGRATION: 397>, <TokenType.STRAIGHT_JOIN: 398>, <TokenType.STRUCT: 399>, <TokenType.TAG: 402>, <TokenType.TEMPORARY: 403>, <TokenType.TOP: 404>, <TokenType.TRUE: 406>, <TokenType.TRUNCATE: 407>, <TokenType.TRIGGER: 408>, <TokenType.UNNEST: 411>, <TokenType.UNPIVOT: 412>, <TokenType.UPDATE: 413>, <TokenType.USE: 414>, <TokenType.VIEW: 418>, <TokenType.SEMANTIC_VIEW: 419>, <TokenType.VOLATILE: 420>, <TokenType.WINDOW: 424>, <TokenType.UNIQUE: 426>, <TokenType.SINK: 433>, <TokenType.SOURCE: 434>, <TokenType.ANALYZE: 435>, <TokenType.NAMESPACE: 436>, <TokenType.EXPORT: 437>}
TABLE_ALIAS_TOKENS: ClassVar = {<TokenType.SESSION: 57>, <TokenType.SESSION_USER: 59>, <TokenType.IDENTIFIER: 77>, <TokenType.DATABASE: 78>, <TokenType.COLUMN: 79>, <TokenType.SCHEMA: 81>, <TokenType.TABLE: 82>, <TokenType.WAREHOUSE: 83>, <TokenType.STAGE: 84>, <TokenType.STREAM: 85>, <TokenType.STREAMLIT: 86>, <TokenType.VAR: 87>, <TokenType.BIT: 95>, <TokenType.BOOLEAN: 96>, <TokenType.TINYINT: 97>, <TokenType.UTINYINT: 98>, <TokenType.SMALLINT: 99>, <TokenType.USMALLINT: 100>, <TokenType.MEDIUMINT: 101>, <TokenType.UMEDIUMINT: 102>, <TokenType.INT: 103>, <TokenType.UINT: 104>, <TokenType.BIGINT: 105>, <TokenType.UBIGINT: 106>, <TokenType.BIGNUM: 107>, <TokenType.INT128: 108>, <TokenType.UINT128: 109>, <TokenType.INT256: 110>, <TokenType.UINT256: 111>, <TokenType.FLOAT: 112>, <TokenType.DOUBLE: 113>, <TokenType.UDOUBLE: 114>, <TokenType.DECIMAL: 115>, <TokenType.DECIMAL32: 116>, <TokenType.DECIMAL64: 117>, <TokenType.DECIMAL128: 118>, <TokenType.DECIMAL256: 119>, <TokenType.DECFLOAT: 120>, <TokenType.UDECIMAL: 121>, <TokenType.BIGDECIMAL: 122>, <TokenType.CHAR: 123>, <TokenType.NCHAR: 124>, <TokenType.VARCHAR: 125>, <TokenType.NVARCHAR: 126>, <TokenType.BPCHAR: 127>, <TokenType.TEXT: 128>, <TokenType.MEDIUMTEXT: 129>, <TokenType.LONGTEXT: 130>, <TokenType.BLOB: 131>, <TokenType.MEDIUMBLOB: 132>, <TokenType.LONGBLOB: 133>, <TokenType.TINYBLOB: 134>, <TokenType.TINYTEXT: 135>, <TokenType.NAME: 136>, <TokenType.BINARY: 137>, <TokenType.VARBINARY: 138>, <TokenType.JSON: 139>, <TokenType.JSONB: 140>, <TokenType.TIME: 141>, <TokenType.TIMETZ: 142>, <TokenType.TIME_NS: 143>, <TokenType.TIMESTAMP: 144>, <TokenType.TIMESTAMPTZ: 145>, <TokenType.TIMESTAMPLTZ: 146>, <TokenType.TIMESTAMPNTZ: 147>, <TokenType.TIMESTAMP_S: 148>, <TokenType.TIMESTAMP_MS: 149>, <TokenType.TIMESTAMP_NS: 150>, <TokenType.DATETIME: 151>, <TokenType.DATETIME2: 152>, <TokenType.DATETIME64: 153>, <TokenType.SMALLDATETIME: 154>, <TokenType.DATE: 155>, <TokenType.DATE32: 156>, <TokenType.INT4RANGE: 157>, <TokenType.INT4MULTIRANGE: 158>, <TokenType.INT8RANGE: 159>, <TokenType.INT8MULTIRANGE: 160>, <TokenType.NUMRANGE: 161>, <TokenType.NUMMULTIRANGE: 162>, <TokenType.TSRANGE: 163>, <TokenType.TSMULTIRANGE: 164>, <TokenType.TSTZRANGE: 165>, <TokenType.TSTZMULTIRANGE: 166>, <TokenType.DATERANGE: 167>, <TokenType.DATEMULTIRANGE: 168>, <TokenType.UUID: 169>, <TokenType.GEOGRAPHY: 170>, <TokenType.GEOGRAPHYPOINT: 171>, <TokenType.NULLABLE: 172>, <TokenType.GEOMETRY: 173>, <TokenType.POINT: 174>, <TokenType.RING: 175>, <TokenType.LINESTRING: 176>, <TokenType.LOCALTIME: 177>, <TokenType.LOCALTIMESTAMP: 178>, <TokenType.MULTILINESTRING: 180>, <TokenType.POLYGON: 181>, <TokenType.MULTIPOLYGON: 182>, <TokenType.HLLSKETCH: 183>, <TokenType.HSTORE: 184>, <TokenType.SUPER: 185>, <TokenType.SERIAL: 186>, <TokenType.SMALLSERIAL: 187>, <TokenType.BIGSERIAL: 188>, <TokenType.XML: 189>, <TokenType.YEAR: 190>, <TokenType.USERDEFINED: 191>, <TokenType.MONEY: 192>, <TokenType.SMALLMONEY: 193>, <TokenType.ROWVERSION: 194>, <TokenType.IMAGE: 195>, <TokenType.VARIANT: 196>, <TokenType.OBJECT: 197>, <TokenType.INET: 198>, <TokenType.IPADDRESS: 199>, <TokenType.IPPREFIX: 200>, <TokenType.IPV4: 201>, <TokenType.IPV6: 202>, <TokenType.ENUM: 203>, <TokenType.ENUM8: 204>, <TokenType.ENUM16: 205>, <TokenType.FIXEDSTRING: 206>, <TokenType.LOWCARDINALITY: 207>, <TokenType.NESTED: 208>, <TokenType.AGGREGATEFUNCTION: 209>, <TokenType.SIMPLEAGGREGATEFUNCTION: 210>, <TokenType.TDIGEST: 211>, <TokenType.UNKNOWN: 212>, <TokenType.VECTOR: 213>, <TokenType.DYNAMIC: 214>, <TokenType.VOID: 215>, <TokenType.ALL: 218>, <TokenType.ANTI: 219>, <TokenType.ANY: 220>, <TokenType.APPLY: 221>, <TokenType.ARRAY: 222>, <TokenType.ATTACH: 225>, <TokenType.AUTO_INCREMENT: 226>, <TokenType.BEGIN: 227>, <TokenType.CACHE: 230>, <TokenType.CASE: 231>, <TokenType.COLLATE: 234>, <TokenType.COMMAND: 235>, <TokenType.COMMENT: 236>, <TokenType.COMMIT: 237>, <TokenType.CONSTRAINT: 239>, <TokenType.COPY: 240>, <TokenType.CUBE: 243>, <TokenType.CURRENT_DATE: 244>, <TokenType.CURRENT_DATETIME: 245>, <TokenType.CURRENT_SCHEMA: 246>, <TokenType.CURRENT_TIME: 247>, <TokenType.CURRENT_TIMESTAMP: 248>, <TokenType.CURRENT_USER: 249>, <TokenType.CURRENT_ROLE: 250>, <TokenType.CURRENT_CATALOG: 251>, <TokenType.DEFAULT: 253>, <TokenType.DELETE: 254>, <TokenType.DESCRIBE: 256>, <TokenType.DETACH: 257>, <TokenType.DICTIONARY: 258>, <TokenType.DIV: 261>, <TokenType.END: 264>, <TokenType.ESCAPE: 265>, <TokenType.EXECUTE: 267>, <TokenType.EXISTS: 268>, <TokenType.FALSE: 269>, <TokenType.FILE: 271>, <TokenType.FILE_FORMAT: 272>, <TokenType.FILTER: 273>, <TokenType.FINAL: 274>, <TokenType.FIRST: 275>, <TokenType.FOREIGN_KEY: 278>, <TokenType.FORMAT: 279>, <TokenType.FUNCTION: 282>, <TokenType.GET: 283>, <TokenType.GRANT: 286>, <TokenType.INDEX: 294>, <TokenType.INTERVAL: 301>, <TokenType.IS: 305>, <TokenType.ISNULL: 306>, <TokenType.KEEP: 309>, <TokenType.KILL: 311>, <TokenType.LIMIT: 316>, <TokenType.LIST: 317>, <TokenType.LOAD: 318>, <TokenType.MAP: 320>, <TokenType.MATCH: 321>, <TokenType.MERGE: 325>, <TokenType.MODEL: 327>, <TokenType.NEXT: 329>, <TokenType.NOTHING: 330>, <TokenType.NULL: 332>, <TokenType.OBJECT_IDENTIFIER: 333>, <TokenType.OFFSET: 334>, <TokenType.OPERATOR: 337>, <TokenType.ORDINALITY: 341>, <TokenType.INOUT: 343>, <TokenType.OVER: 345>, <TokenType.OVERLAPS: 346>, <TokenType.OVERWRITE: 347>, <TokenType.PARTITION: 349>, <TokenType.PERCENT: 351>, <TokenType.PIVOT: 352>, <TokenType.PRAGMA: 357>, <TokenType.PROCEDURE: 360>, <TokenType.PSEUDO_TYPE: 362>, <TokenType.PUT: 363>, <TokenType.RANGE: 367>, <TokenType.RECURSIVE: 368>, <TokenType.REFRESH: 369>, <TokenType.RENAME: 370>, <TokenType.REPLACE: 371>, <TokenType.REFERENCES: 374>, <TokenType.ROLLUP: 379>, <TokenType.ROW: 380>, <TokenType.ROWS: 381>, <TokenType.SEMI: 384>, <TokenType.SEQUENCE: 386>, <TokenType.SET: 388>, <TokenType.SETTINGS: 389>, <TokenType.SHOW: 390>, <TokenType.SOME: 392>, <TokenType.STORAGE_INTEGRATION: 397>, <TokenType.STRAIGHT_JOIN: 398>, <TokenType.STRUCT: 399>, <TokenType.TAG: 402>, <TokenType.TEMPORARY: 403>, <TokenType.TOP: 404>, <TokenType.TRUE: 406>, <TokenType.TRUNCATE: 407>, <TokenType.TRIGGER: 408>, <TokenType.UNNEST: 411>, <TokenType.UNPIVOT: 412>, <TokenType.UPDATE: 413>, <TokenType.USE: 414>, <TokenType.VIEW: 418>, <TokenType.SEMANTIC_VIEW: 419>, <TokenType.VOLATILE: 420>, <TokenType.UNIQUE: 426>, <TokenType.SINK: 433>, <TokenType.SOURCE: 434>, <TokenType.ANALYZE: 435>, <TokenType.NAMESPACE: 436>, <TokenType.EXPORT: 437>}
COMMENT_TABLE_ALIAS_TOKENS: ClassVar = {<TokenType.SESSION: 57>, <TokenType.SESSION_USER: 59>, <TokenType.IDENTIFIER: 77>, <TokenType.DATABASE: 78>, <TokenType.COLUMN: 79>, <TokenType.SCHEMA: 81>, <TokenType.TABLE: 82>, <TokenType.WAREHOUSE: 83>, <TokenType.STAGE: 84>, <TokenType.STREAM: 85>, <TokenType.STREAMLIT: 86>, <TokenType.VAR: 87>, <TokenType.BIT: 95>, <TokenType.BOOLEAN: 96>, <TokenType.TINYINT: 97>, <TokenType.UTINYINT: 98>, <TokenType.SMALLINT: 99>, <TokenType.USMALLINT: 100>, <TokenType.MEDIUMINT: 101>, <TokenType.UMEDIUMINT: 102>, <TokenType.INT: 103>, <TokenType.UINT: 104>, <TokenType.BIGINT: 105>, <TokenType.UBIGINT: 106>, <TokenType.BIGNUM: 107>, <TokenType.INT128: 108>, <TokenType.UINT128: 109>, <TokenType.INT256: 110>, <TokenType.UINT256: 111>, <TokenType.FLOAT: 112>, <TokenType.DOUBLE: 113>, <TokenType.UDOUBLE: 114>, <TokenType.DECIMAL: 115>, <TokenType.DECIMAL32: 116>, <TokenType.DECIMAL64: 117>, <TokenType.DECIMAL128: 118>, <TokenType.DECIMAL256: 119>, <TokenType.DECFLOAT: 120>, <TokenType.UDECIMAL: 121>, <TokenType.BIGDECIMAL: 122>, <TokenType.CHAR: 123>, <TokenType.NCHAR: 124>, <TokenType.VARCHAR: 125>, <TokenType.NVARCHAR: 126>, <TokenType.BPCHAR: 127>, <TokenType.TEXT: 128>, <TokenType.MEDIUMTEXT: 129>, <TokenType.LONGTEXT: 130>, <TokenType.BLOB: 131>, <TokenType.MEDIUMBLOB: 132>, <TokenType.LONGBLOB: 133>, <TokenType.TINYBLOB: 134>, <TokenType.TINYTEXT: 135>, <TokenType.NAME: 136>, <TokenType.BINARY: 137>, <TokenType.VARBINARY: 138>, <TokenType.JSON: 139>, <TokenType.JSONB: 140>, <TokenType.TIME: 141>, <TokenType.TIMETZ: 142>, <TokenType.TIME_NS: 143>, <TokenType.TIMESTAMP: 144>, <TokenType.TIMESTAMPTZ: 145>, <TokenType.TIMESTAMPLTZ: 146>, <TokenType.TIMESTAMPNTZ: 147>, <TokenType.TIMESTAMP_S: 148>, <TokenType.TIMESTAMP_MS: 149>, <TokenType.TIMESTAMP_NS: 150>, <TokenType.DATETIME: 151>, <TokenType.DATETIME2: 152>, <TokenType.DATETIME64: 153>, <TokenType.SMALLDATETIME: 154>, <TokenType.DATE: 155>, <TokenType.DATE32: 156>, <TokenType.INT4RANGE: 157>, <TokenType.INT4MULTIRANGE: 158>, <TokenType.INT8RANGE: 159>, <TokenType.INT8MULTIRANGE: 160>, <TokenType.NUMRANGE: 161>, <TokenType.NUMMULTIRANGE: 162>, <TokenType.TSRANGE: 163>, <TokenType.TSMULTIRANGE: 164>, <TokenType.TSTZRANGE: 165>, <TokenType.TSTZMULTIRANGE: 166>, <TokenType.DATERANGE: 167>, <TokenType.DATEMULTIRANGE: 168>, <TokenType.UUID: 169>, <TokenType.GEOGRAPHY: 170>, <TokenType.GEOGRAPHYPOINT: 171>, <TokenType.NULLABLE: 172>, <TokenType.GEOMETRY: 173>, <TokenType.POINT: 174>, <TokenType.RING: 175>, <TokenType.LINESTRING: 176>, <TokenType.LOCALTIME: 177>, <TokenType.LOCALTIMESTAMP: 178>, <TokenType.MULTILINESTRING: 180>, <TokenType.POLYGON: 181>, <TokenType.MULTIPOLYGON: 182>, <TokenType.HLLSKETCH: 183>, <TokenType.HSTORE: 184>, <TokenType.SUPER: 185>, <TokenType.SERIAL: 186>, <TokenType.SMALLSERIAL: 187>, <TokenType.BIGSERIAL: 188>, <TokenType.XML: 189>, <TokenType.YEAR: 190>, <TokenType.USERDEFINED: 191>, <TokenType.MONEY: 192>, <TokenType.SMALLMONEY: 193>, <TokenType.ROWVERSION: 194>, <TokenType.IMAGE: 195>, <TokenType.VARIANT: 196>, <TokenType.OBJECT: 197>, <TokenType.INET: 198>, <TokenType.IPADDRESS: 199>, <TokenType.IPPREFIX: 200>, <TokenType.IPV4: 201>, <TokenType.IPV6: 202>, <TokenType.ENUM: 203>, <TokenType.ENUM8: 204>, <TokenType.ENUM16: 205>, <TokenType.FIXEDSTRING: 206>, <TokenType.LOWCARDINALITY: 207>, <TokenType.NESTED: 208>, <TokenType.AGGREGATEFUNCTION: 209>, <TokenType.SIMPLEAGGREGATEFUNCTION: 210>, <TokenType.TDIGEST: 211>, <TokenType.UNKNOWN: 212>, <TokenType.VECTOR: 213>, <TokenType.DYNAMIC: 214>, <TokenType.VOID: 215>, <TokenType.ALL: 218>, <TokenType.ANY: 220>, <TokenType.APPLY: 221>, <TokenType.ARRAY: 222>, <TokenType.ATTACH: 225>, <TokenType.AUTO_INCREMENT: 226>, <TokenType.BEGIN: 227>, <TokenType.CACHE: 230>, <TokenType.CASE: 231>, <TokenType.COLLATE: 234>, <TokenType.COMMAND: 235>, <TokenType.COMMENT: 236>, <TokenType.COMMIT: 237>, <TokenType.CONSTRAINT: 239>, <TokenType.COPY: 240>, <TokenType.CUBE: 243>, <TokenType.CURRENT_DATE: 244>, <TokenType.CURRENT_DATETIME: 245>, <TokenType.CURRENT_SCHEMA: 246>, <TokenType.CURRENT_TIME: 247>, <TokenType.CURRENT_TIMESTAMP: 248>, <TokenType.CURRENT_USER: 249>, <TokenType.CURRENT_ROLE: 250>, <TokenType.CURRENT_CATALOG: 251>, <TokenType.DEFAULT: 253>, <TokenType.DELETE: 254>, <TokenType.DESCRIBE: 256>, <TokenType.DETACH: 257>, <TokenType.DICTIONARY: 258>, <TokenType.DIV: 261>, <TokenType.END: 264>, <TokenType.ESCAPE: 265>, <TokenType.EXECUTE: 267>, <TokenType.EXISTS: 268>, <TokenType.FALSE: 269>, <TokenType.FILE: 271>, <TokenType.FILE_FORMAT: 272>, <TokenType.FILTER: 273>, <TokenType.FINAL: 274>, <TokenType.FIRST: 275>, <TokenType.FOREIGN_KEY: 278>, <TokenType.FORMAT: 279>, <TokenType.FUNCTION: 282>, <TokenType.GET: 283>, <TokenType.GRANT: 286>, <TokenType.INDEX: 294>, <TokenType.INTERVAL: 301>, <TokenType.ISNULL: 306>, <TokenType.KEEP: 309>, <TokenType.KILL: 311>, <TokenType.LIMIT: 316>, <TokenType.LIST: 317>, <TokenType.LOAD: 318>, <TokenType.MAP: 320>, <TokenType.MATCH: 321>, <TokenType.MERGE: 325>, <TokenType.MODEL: 327>, <TokenType.NEXT: 329>, <TokenType.NOTHING: 330>, <TokenType.NULL: 332>, <TokenType.OBJECT_IDENTIFIER: 333>, <TokenType.OFFSET: 334>, <TokenType.OPERATOR: 337>, <TokenType.ORDINALITY: 341>, <TokenType.INOUT: 343>, <TokenType.OVER: 345>, <TokenType.OVERLAPS: 346>, <TokenType.OVERWRITE: 347>, <TokenType.PARTITION: 349>, <TokenType.PERCENT: 351>, <TokenType.PIVOT: 352>, <TokenType.PRAGMA: 357>, <TokenType.PROCEDURE: 360>, <TokenType.PSEUDO_TYPE: 362>, <TokenType.PUT: 363>, <TokenType.RANGE: 367>, <TokenType.RECURSIVE: 368>, <TokenType.REFRESH: 369>, <TokenType.RENAME: 370>, <TokenType.REPLACE: 371>, <TokenType.REFERENCES: 374>, <TokenType.ROLLUP: 379>, <TokenType.ROW: 380>, <TokenType.ROWS: 381>, <TokenType.SEQUENCE: 386>, <TokenType.SET: 388>, <TokenType.SETTINGS: 389>, <TokenType.SHOW: 390>, <TokenType.SOME: 392>, <TokenType.STORAGE_INTEGRATION: 397>, <TokenType.STRAIGHT_JOIN: 398>, <TokenType.STRUCT: 399>, <TokenType.TAG: 402>, <TokenType.TEMPORARY: 403>, <TokenType.TOP: 404>, <TokenType.TRUE: 406>, <TokenType.TRUNCATE: 407>, <TokenType.TRIGGER: 408>, <TokenType.UNNEST: 411>, <TokenType.UNPIVOT: 412>, <TokenType.UPDATE: 413>, <TokenType.USE: 414>, <TokenType.VIEW: 418>, <TokenType.SEMANTIC_VIEW: 419>, <TokenType.VOLATILE: 420>, <TokenType.UNIQUE: 426>, <TokenType.SINK: 433>, <TokenType.SOURCE: 434>, <TokenType.ANALYZE: 435>, <TokenType.NAMESPACE: 436>, <TokenType.EXPORT: 437>}
UPDATE_ALIAS_TOKENS: ClassVar = {<TokenType.SESSION: 57>, <TokenType.SESSION_USER: 59>, <TokenType.IDENTIFIER: 77>, <TokenType.DATABASE: 78>, <TokenType.COLUMN: 79>, <TokenType.SCHEMA: 81>, <TokenType.TABLE: 82>, <TokenType.WAREHOUSE: 83>, <TokenType.STAGE: 84>, <TokenType.STREAM: 85>, <TokenType.STREAMLIT: 86>, <TokenType.VAR: 87>, <TokenType.BIT: 95>, <TokenType.BOOLEAN: 96>, <TokenType.TINYINT: 97>, <TokenType.UTINYINT: 98>, <TokenType.SMALLINT: 99>, <TokenType.USMALLINT: 100>, <TokenType.MEDIUMINT: 101>, <TokenType.UMEDIUMINT: 102>, <TokenType.INT: 103>, <TokenType.UINT: 104>, <TokenType.BIGINT: 105>, <TokenType.UBIGINT: 106>, <TokenType.BIGNUM: 107>, <TokenType.INT128: 108>, <TokenType.UINT128: 109>, <TokenType.INT256: 110>, <TokenType.UINT256: 111>, <TokenType.FLOAT: 112>, <TokenType.DOUBLE: 113>, <TokenType.UDOUBLE: 114>, <TokenType.DECIMAL: 115>, <TokenType.DECIMAL32: 116>, <TokenType.DECIMAL64: 117>, <TokenType.DECIMAL128: 118>, <TokenType.DECIMAL256: 119>, <TokenType.DECFLOAT: 120>, <TokenType.UDECIMAL: 121>, <TokenType.BIGDECIMAL: 122>, <TokenType.CHAR: 123>, <TokenType.NCHAR: 124>, <TokenType.VARCHAR: 125>, <TokenType.NVARCHAR: 126>, <TokenType.BPCHAR: 127>, <TokenType.TEXT: 128>, <TokenType.MEDIUMTEXT: 129>, <TokenType.LONGTEXT: 130>, <TokenType.BLOB: 131>, <TokenType.MEDIUMBLOB: 132>, <TokenType.LONGBLOB: 133>, <TokenType.TINYBLOB: 134>, <TokenType.TINYTEXT: 135>, <TokenType.NAME: 136>, <TokenType.BINARY: 137>, <TokenType.VARBINARY: 138>, <TokenType.JSON: 139>, <TokenType.JSONB: 140>, <TokenType.TIME: 141>, <TokenType.TIMETZ: 142>, <TokenType.TIME_NS: 143>, <TokenType.TIMESTAMP: 144>, <TokenType.TIMESTAMPTZ: 145>, <TokenType.TIMESTAMPLTZ: 146>, <TokenType.TIMESTAMPNTZ: 147>, <TokenType.TIMESTAMP_S: 148>, <TokenType.TIMESTAMP_MS: 149>, <TokenType.TIMESTAMP_NS: 150>, <TokenType.DATETIME: 151>, <TokenType.DATETIME2: 152>, <TokenType.DATETIME64: 153>, <TokenType.SMALLDATETIME: 154>, <TokenType.DATE: 155>, <TokenType.DATE32: 156>, <TokenType.INT4RANGE: 157>, <TokenType.INT4MULTIRANGE: 158>, <TokenType.INT8RANGE: 159>, <TokenType.INT8MULTIRANGE: 160>, <TokenType.NUMRANGE: 161>, <TokenType.NUMMULTIRANGE: 162>, <TokenType.TSRANGE: 163>, <TokenType.TSMULTIRANGE: 164>, <TokenType.TSTZRANGE: 165>, <TokenType.TSTZMULTIRANGE: 166>, <TokenType.DATERANGE: 167>, <TokenType.DATEMULTIRANGE: 168>, <TokenType.UUID: 169>, <TokenType.GEOGRAPHY: 170>, <TokenType.GEOGRAPHYPOINT: 171>, <TokenType.NULLABLE: 172>, <TokenType.GEOMETRY: 173>, <TokenType.POINT: 174>, <TokenType.RING: 175>, <TokenType.LINESTRING: 176>, <TokenType.LOCALTIME: 177>, <TokenType.LOCALTIMESTAMP: 178>, <TokenType.MULTILINESTRING: 180>, <TokenType.POLYGON: 181>, <TokenType.MULTIPOLYGON: 182>, <TokenType.HLLSKETCH: 183>, <TokenType.HSTORE: 184>, <TokenType.SUPER: 185>, <TokenType.SERIAL: 186>, <TokenType.SMALLSERIAL: 187>, <TokenType.BIGSERIAL: 188>, <TokenType.XML: 189>, <TokenType.YEAR: 190>, <TokenType.USERDEFINED: 191>, <TokenType.MONEY: 192>, <TokenType.SMALLMONEY: 193>, <TokenType.ROWVERSION: 194>, <TokenType.IMAGE: 195>, <TokenType.VARIANT: 196>, <TokenType.OBJECT: 197>, <TokenType.INET: 198>, <TokenType.IPADDRESS: 199>, <TokenType.IPPREFIX: 200>, <TokenType.IPV4: 201>, <TokenType.IPV6: 202>, <TokenType.ENUM: 203>, <TokenType.ENUM8: 204>, <TokenType.ENUM16: 205>, <TokenType.FIXEDSTRING: 206>, <TokenType.LOWCARDINALITY: 207>, <TokenType.NESTED: 208>, <TokenType.AGGREGATEFUNCTION: 209>, <TokenType.SIMPLEAGGREGATEFUNCTION: 210>, <TokenType.TDIGEST: 211>, <TokenType.UNKNOWN: 212>, <TokenType.VECTOR: 213>, <TokenType.DYNAMIC: 214>, <TokenType.VOID: 215>, <TokenType.ALL: 218>, <TokenType.ANY: 220>, <TokenType.APPLY: 221>, <TokenType.ARRAY: 222>, <TokenType.ATTACH: 225>, <TokenType.AUTO_INCREMENT: 226>, <TokenType.BEGIN: 227>, <TokenType.CACHE: 230>, <TokenType.CASE: 231>, <TokenType.COLLATE: 234>, <TokenType.COMMAND: 235>, <TokenType.COMMENT: 236>, <TokenType.COMMIT: 237>, <TokenType.CONSTRAINT: 239>, <TokenType.COPY: 240>, <TokenType.CUBE: 243>, <TokenType.CURRENT_DATE: 244>, <TokenType.CURRENT_DATETIME: 245>, <TokenType.CURRENT_SCHEMA: 246>, <TokenType.CURRENT_TIME: 247>, <TokenType.CURRENT_TIMESTAMP: 248>, <TokenType.CURRENT_USER: 249>, <TokenType.CURRENT_ROLE: 250>, <TokenType.CURRENT_CATALOG: 251>, <TokenType.DEFAULT: 253>, <TokenType.DELETE: 254>, <TokenType.DESCRIBE: 256>, <TokenType.DETACH: 257>, <TokenType.DICTIONARY: 258>, <TokenType.DIV: 261>, <TokenType.END: 264>, <TokenType.ESCAPE: 265>, <TokenType.EXECUTE: 267>, <TokenType.EXISTS: 268>, <TokenType.FALSE: 269>, <TokenType.FILE: 271>, <TokenType.FILE_FORMAT: 272>, <TokenType.FILTER: 273>, <TokenType.FINAL: 274>, <TokenType.FIRST: 275>, <TokenType.FOREIGN_KEY: 278>, <TokenType.FORMAT: 279>, <TokenType.FUNCTION: 282>, <TokenType.GET: 283>, <TokenType.GRANT: 286>, <TokenType.INDEX: 294>, <TokenType.INTERVAL: 301>, <TokenType.IS: 305>, <TokenType.ISNULL: 306>, <TokenType.KEEP: 309>, <TokenType.KILL: 311>, <TokenType.LIMIT: 316>, <TokenType.LIST: 317>, <TokenType.LOAD: 318>, <TokenType.MAP: 320>, <TokenType.MATCH: 321>, <TokenType.MERGE: 325>, <TokenType.MODEL: 327>, <TokenType.NEXT: 329>, <TokenType.NOTHING: 330>, <TokenType.NULL: 332>, <TokenType.OBJECT_IDENTIFIER: 333>, <TokenType.OFFSET: 334>, <TokenType.OPERATOR: 337>, <TokenType.ORDINALITY: 341>, <TokenType.INOUT: 343>, <TokenType.OVER: 345>, <TokenType.OVERLAPS: 346>, <TokenType.OVERWRITE: 347>, <TokenType.PARTITION: 349>, <TokenType.PERCENT: 351>, <TokenType.PIVOT: 352>, <TokenType.PRAGMA: 357>, <TokenType.PROCEDURE: 360>, <TokenType.PSEUDO_TYPE: 362>, <TokenType.PUT: 363>, <TokenType.RANGE: 367>, <TokenType.RECURSIVE: 368>, <TokenType.REFRESH: 369>, <TokenType.RENAME: 370>, <TokenType.REPLACE: 371>, <TokenType.REFERENCES: 374>, <TokenType.ROLLUP: 379>, <TokenType.ROW: 380>, <TokenType.ROWS: 381>, <TokenType.SEQUENCE: 386>, <TokenType.SETTINGS: 389>, <TokenType.SHOW: 390>, <TokenType.SOME: 392>, <TokenType.STORAGE_INTEGRATION: 397>, <TokenType.STRAIGHT_JOIN: 398>, <TokenType.STRUCT: 399>, <TokenType.TAG: 402>, <TokenType.TEMPORARY: 403>, <TokenType.TOP: 404>, <TokenType.TRUE: 406>, <TokenType.TRUNCATE: 407>, <TokenType.TRIGGER: 408>, <TokenType.UNNEST: 411>, <TokenType.UNPIVOT: 412>, <TokenType.UPDATE: 413>, <TokenType.USE: 414>, <TokenType.VIEW: 418>, <TokenType.SEMANTIC_VIEW: 419>, <TokenType.VOLATILE: 420>, <TokenType.UNIQUE: 426>, <TokenType.SINK: 433>, <TokenType.SOURCE: 434>, <TokenType.ANALYZE: 435>, <TokenType.NAMESPACE: 436>, <TokenType.EXPORT: 437>}
FUNCTIONS: ClassVar[dict[str, Callable]] = {'AI_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.AIAgg'>>, 'AI_CLASSIFY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIClassify'>>, 'AI_EMBED': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIEmbed'>>, 'A_I_FORECAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIForecast'>>, 'AI_GENERATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIGenerate'>>, 'AI_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AISimilarity'>>, 'AI_SUMMARIZE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.AISummarizeAgg'>>, 'ABS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Abs'>>, 'ACOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Acos'>>, 'ACOSH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Acosh'>>, 'ADD_MONTHS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.AddMonths'>>, 'AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.And'>>, 'ANONYMOUS_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.AnonymousAggFunc'>>, 'ANY_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.AnyValue'>>, 'APPLY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Apply'>>, 'APPROX_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.ApproxDistinct'>>, 'APPROX_COUNT_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.ApproxDistinct'>>, 'APPROX_PERCENTILE_ACCUMULATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxPercentileAccumulate'>>, 'APPROX_PERCENTILE_COMBINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxPercentileCombine'>>, 'APPROX_PERCENTILE_ESTIMATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxPercentileEstimate'>>, 'APPROX_QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxQuantile'>>, 'APPROX_QUANTILES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxQuantiles'>>, 'APPROX_TOP_K': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopK'>>, 'APPROX_TOP_K_ACCUMULATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopKAccumulate'>>, 'APPROX_TOP_K_COMBINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopKCombine'>>, 'APPROX_TOP_K_ESTIMATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopKEstimate'>>, 'APPROX_TOP_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopSum'>>, 'APPROXIMATE_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproximateSimilarity'>>, 'APPROXIMATE_JACCARD_INDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproximateSimilarity'>>, 'ARG_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMax'>>, 'ARGMAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMax'>>, 'MAX_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMax'>>, 'ARG_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMin'>>, 'ARGMIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMin'>>, 'MIN_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMin'>>, 'ARRAY': <function Parser.<lambda>>, 'ARRAY_AGG': <function Parser.<lambda>>, 'ARRAY_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayAll'>>, 'ARRAY_ANY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayAny'>>, 'ARRAY_APPEND': <function build_array_append>, 'ARRAY_COMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayCompact'>>, 'ARRAY_CONCAT': <function build_array_concat>, 'ARRAY_CAT': <function build_array_concat>, 'ARRAY_CONCAT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArrayConcatAgg'>>, 'ARRAY_CONSTRUCT_COMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayConstructCompact'>>, 'ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContains'>>, 'ARRAY_HAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContains'>>, 'ARRAY_CONTAINS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContainsAll'>>, 'ARRAY_HAS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContainsAll'>>, 'ARRAY_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayDistinct'>>, 'ARRAY_EXCEPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayExcept'>>, 'FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayFilter'>>, 'ARRAY_FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayFilter'>>, 'ARRAY_FIRST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayFirst'>>, 'ARRAY_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayInsert'>>, 'ARRAY_INTERSECT': <function Parser.<lambda>>, 'ARRAY_INTERSECTION': <function Parser.<lambda>>, 'ARRAY_LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayLast'>>, 'ARRAY_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayMax'>>, 'ARRAY_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayMin'>>, 'ARRAY_OVERLAPS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayOverlaps'>>, 'ARRAY_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayPosition'>>, 'ARRAY_PREPEND': <function build_array_prepend>, 'ARRAY_REMOVE': <function build_array_remove>, 'ARRAY_REMOVE_AT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayRemoveAt'>>, 'ARRAY_REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayReverse'>>, 'ARRAY_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySize'>>, 'ARRAY_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySize'>>, 'ARRAY_SLICE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySlice'>>, 'ARRAY_SORT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySort'>>, 'ARRAY_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySum'>>, 'ARRAY_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayToString'>>, 'ARRAY_JOIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayToString'>>, 'ARRAY_UNION_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArrayUnionAgg'>>, 'ARRAY_UNIQUE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArrayUniqueAgg'>>, 'ARRAYS_ZIP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraysZip'>>, 'ASCII': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Ascii'>>, 'ASIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Asin'>>, 'ASINH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Asinh'>>, 'ATAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Atan'>>, 'ATAN2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Atan2'>>, 'ATANH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Atanh'>>, 'AVG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Avg'>>, 'BASE64_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Base64DecodeBinary'>>, 'BASE64_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Base64DecodeString'>>, 'BASE64_ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Base64Encode'>>, 'BIT_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.BitLength'>>, 'BITMAP_BIT_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapBitPosition'>>, 'BITMAP_BUCKET_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapBucketNumber'>>, 'BITMAP_CONSTRUCT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapConstructAgg'>>, 'BITMAP_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapCount'>>, 'BITMAP_OR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapOrAgg'>>, 'BITWISE_AND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseAndAgg'>>, 'BITWISE_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseCount'>>, 'BITWISE_OR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseOrAgg'>>, 'BITWISE_XOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseXorAgg'>>, 'BOOLAND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Booland'>>, 'BOOLNOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Boolnot'>>, 'BOOLOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Boolor'>>, 'BOOLXOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BoolxorAgg'>>, 'BYTE_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ByteLength'>>, 'CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Case'>>, 'CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Cast'>>, 'CAST_TO_STR_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CastToStrType'>>, 'CBRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cbrt'>>, 'CEIL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Ceil'>>, 'CEILING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Ceil'>>, 'CHECK_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.CheckJson'>>, 'CHECK_XML': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CheckXml'>>, 'CHR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Chr'>>, 'CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Chr'>>, 'CITY_HASH64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.CityHash64'>>, 'COALESCE': <function build_coalesce>, 'IFNULL': <function build_coalesce>, 'NVL': <function build_coalesce>, 'CODE_POINTS_TO_BYTES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.CodePointsToBytes'>>, 'CODE_POINTS_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.CodePointsToString'>>, 'COLLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Collate'>>, 'COLLATION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Collation'>>, 'COLUMNS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Columns'>>, 'COMBINED_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.CombinedAggFunc'>>, 'COMBINED_PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.CombinedParameterizedAgg'>>, 'COMPRESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Compress'>>, 'CONCAT': <function Parser.<lambda>>, 'CONCAT_WS': <function Parser.<lambda>>, 'CONNECT_BY_ROOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ConnectByRoot'>>, 'CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Contains'>>, 'CONVERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Convert'>>, 'CONVERT_TIMEZONE': <function build_convert_timezone>, 'CONVERT_TO_CHARSET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ConvertToCharset'>>, 'CORR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Corr'>>, 'COS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cos'>>, 'COSH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cosh'>>, 'COSINE_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.CosineDistance'>>, 'COT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cot'>>, 'COTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Coth'>>, 'COUNT': <function Parser.<lambda>>, 'COUNT_IF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CountIf'>>, 'COUNTIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CountIf'>>, 'COVAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CovarPop'>>, 'COVAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CovarSamp'>>, 'CSC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Csc'>>, 'CSCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Csch'>>, 'CUME_DIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CumeDist'>>, 'CURRENT_ACCOUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentAccount'>>, 'CURRENT_ACCOUNT_NAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentAccountName'>>, 'CURRENT_AVAILABLE_ROLES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentAvailableRoles'>>, 'CURRENT_CATALOG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentCatalog'>>, 'CURRENT_CLIENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentClient'>>, 'CURRENT_DATABASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentDatabase'>>, 'CURRENT_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentDate'>>, 'CURRENT_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentDatetime'>>, 'CURRENT_IP_ADDRESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentIpAddress'>>, 'CURRENT_ORGANIZATION_NAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentOrganizationName'>>, 'CURRENT_ORGANIZATION_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentOrganizationUser'>>, 'CURRENT_REGION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentRegion'>>, 'CURRENT_ROLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentRole'>>, 'CURRENT_ROLE_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentRoleType'>>, 'CURRENT_SCHEMA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSchema'>>, 'CURRENT_SCHEMAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSchemas'>>, 'CURRENT_SECONDARY_ROLES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSecondaryRoles'>>, 'CURRENT_SESSION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSession'>>, 'CURRENT_STATEMENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentStatement'>>, 'CURRENT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTime'>>, 'CURRENT_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimestamp'>>, 'CURRENT_TIMESTAMP_L_T_Z': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimestampLTZ'>>, 'CURRENT_TIMEZONE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimezone'>>, 'CURRENT_TRANSACTION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentTransaction'>>, 'CURRENT_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentUser'>>, 'CURRENT_VERSION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentVersion'>>, 'CURRENT_WAREHOUSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentWarehouse'>>, 'DATE': <function _build_date>, 'DATE_ADD': <function build_date_delta_with_interval.<locals>._builder>, 'DATE_BIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateBin'>>, 'DATEDIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateDiff'>>, 'DATE_DIFF': <function build_date_diff>, 'DATE_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateFromParts'>>, 'DATEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateFromParts'>>, 'DATE_FROM_UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateFromUnixDate'>>, 'DATE_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateStrToDate'>>, 'DATE_SUB': <function build_date_delta_with_interval.<locals>._builder>, 'DATE_TO_DATE_STR': <function Parser.<lambda>>, 'DATE_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateToDi'>>, 'DATE_TRUNC': <function BigQueryParser.<lambda>>, 'DATETIME': <function _build_datetime>, 'DATETIME_ADD': <function build_date_delta_with_interval.<locals>._builder>, 'DATETIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DatetimeDiff'>>, 'DATETIME_SUB': <function build_date_delta_with_interval.<locals>._builder>, 'DATETIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DatetimeTrunc'>>, 'DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Day'>>, 'DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfMonth'>>, 'DAYOFMONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfMonth'>>, 'DAY_OF_WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeek'>>, 'DAYOFWEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeek'>>, 'DAYOFWEEK_ISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeekIso'>>, 'ISODOW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeekIso'>>, 'DAY_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfYear'>>, 'DAYOFYEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfYear'>>, 'DAYNAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Dayname'>>, 'DECODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Decode'>>, 'DECODE_CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.DecodeCase'>>, 'DECOMPRESS_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.DecompressBinary'>>, 'DECOMPRESS_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.DecompressString'>>, 'DECRYPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Decrypt'>>, 'DECRYPT_RAW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.DecryptRaw'>>, 'DEGREES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Degrees'>>, 'DENSE_RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.DenseRank'>>, 'DI_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DiToDate'>>, 'DOT_PRODUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.DotProduct'>>, 'ELT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Elt'>>, 'ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Encode'>>, 'ENCRYPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Encrypt'>>, 'ENCRYPT_RAW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.EncryptRaw'>>, 'ENDS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.EndsWith'>>, 'ENDSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.EndsWith'>>, 'EQUAL_NULL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.EqualNull'>>, 'EUCLIDEAN_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.EuclideanDistance'>>, 'EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Exists'>>, 'EXP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Exp'>>, 'EXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Explode'>>, 'EXPLODING_GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ExplodingGenerateSeries'>>, 'EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Extract'>>, 'FACTORIAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Factorial'>>, 'FARM_FINGERPRINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FarmFingerprint'>>, 'FARMFINGERPRINT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FarmFingerprint'>>, 'FEATURES_AT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.FeaturesAtTime'>>, 'FIRST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.First'>>, 'FIRST_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.FirstValue'>>, 'FLATTEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Flatten'>>, 'FLOAT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Float64'>>, 'FLOOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Floor'>>, 'FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Format'>>, 'FROM_BASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FromBase'>>, 'FROM_BASE32': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FromBase32'>>, 'FROM_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FromBase64'>>, 'FROM_ISO8601_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.FromISO8601Timestamp'>>, 'GAP_FILL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.GapFill'>>, 'GENERATE_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateBool'>>, 'GENERATE_DATE_ARRAY': <function Parser.<lambda>>, 'GENERATE_DOUBLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateDouble'>>, 'GENERATE_EMBEDDING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateEmbedding'>>, 'GENERATE_INT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateInt'>>, 'GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.GenerateSeries'>>, 'GENERATE_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateTable'>>, 'GENERATE_TEXT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateText'>>, 'GENERATE_TIMESTAMP_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.GenerateTimestampArray'>>, 'GENERATOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Generator'>>, 'GET_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.GetExtract'>>, 'GETBIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Getbit'>>, 'GET_BIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Getbit'>>, 'GREATEST': <function Parser.<lambda>>, 'GROUP_CONCAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.GroupConcat'>>, 'GROUPING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Grouping'>>, 'GROUPING_ID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.GroupingId'>>, 'HASH_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.HashAgg'>>, 'HEX': <function build_hex>, 'HEX_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.HexDecodeString'>>, 'HEX_ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.HexEncode'>>, 'HLL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Hll'>>, 'HOST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Host'>>, 'HOUR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Hour'>>, 'IF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.If'>>, 'IIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.If'>>, 'INITCAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Initcap'>>, 'INLINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Inline'>>, 'INT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Int64'>>, 'IS_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.IsArray'>>, 'IS_ASCII': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.IsAscii'>>, 'IS_INF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.IsInf'>>, 'ISINF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.IsInf'>>, 'IS_NAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.IsNan'>>, 'ISNAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.IsNan'>>, 'IS_NULL_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.IsNullValue'>>, 'J_S_O_N_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArray'>>, 'J_S_O_N_ARRAY_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArrayAgg'>>, 'JSON_ARRAY_APPEND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArrayAppend'>>, 'JSON_ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArrayContains'>>, 'JSON_ARRAY_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArrayInsert'>>, 'JSONB_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBContains'>>, 'J_S_O_N_B_CONTAINS_ALL_TOP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBContainsAllTopKeys'>>, 'J_S_O_N_B_CONTAINS_ANY_TOP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBContainsAnyTopKeys'>>, 'J_S_O_N_B_DELETE_AT_PATH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBDeleteAtPath'>>, 'JSONB_EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBExists'>>, 'JSONB_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBExtract'>>, 'JSONB_EXTRACT_SCALAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBExtractScalar'>>, 'J_S_O_N_B_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBObjectAgg'>>, 'J_S_O_N_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBool'>>, 'J_S_O_N_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.JSONCast'>>, 'J_S_O_N_EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONExists'>>, 'JSON_EXTRACT': <function build_extract_json_with_path.<locals>._builder>, 'JSON_EXTRACT_ARRAY': <function _build_extract_json_with_default_path.<locals>._builder>, 'JSON_EXTRACT_SCALAR': <function _build_extract_json_with_default_path.<locals>._builder>, 'JSON_FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONFormat'>>, 'JSON_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONKeysAtDepth'>>, 'J_S_O_N_KEYS_AT_DEPTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONKeysAtDepth'>>, 'J_S_O_N_OBJECT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONObject'>>, 'J_S_O_N_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONObjectAgg'>>, 'JSON_REMOVE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONRemove'>>, 'JSON_SET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONSet'>>, 'JSON_STRIP_NULLS': <function _build_json_strip_nulls>, 'J_S_O_N_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONTable'>>, 'JSON_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONType'>>, 'J_S_O_N_VALUE_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.query.JSONValueArray'>>, 'JAROWINKLER_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.JarowinklerSimilarity'>>, 'JUSTIFY_DAYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.JustifyDays'>>, 'JUSTIFY_HOURS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.JustifyHours'>>, 'JUSTIFY_INTERVAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.JustifyInterval'>>, 'KURTOSIS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Kurtosis'>>, 'LAG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Lag'>>, 'LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Last'>>, 'LAST_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.LastDay'>>, 'LAST_DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.LastDay'>>, 'LAST_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LastValue'>>, 'LAX_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.LaxBool'>>, 'LAX_FLOAT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.LaxFloat64'>>, 'LAX_INT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.LaxInt64'>>, 'LAX_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.LaxString'>>, 'LEAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Lead'>>, 'LEAST': <function Parser.<lambda>>, 'LEFT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Left'>>, 'LENGTH': <function BigQueryParser.<lambda>>, 'LEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Length'>>, 'CHAR_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Length'>>, 'CHARACTER_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Length'>>, 'LEVENSHTEIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Levenshtein'>>, 'LIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.List'>>, 'LN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Ln'>>, 'LOCALTIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Localtime'>>, 'LOCALTIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Localtimestamp'>>, 'LOG': <function build_logarithm>, 'LOGICAL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalAnd'>>, 'BOOL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalAnd'>>, 'BOOLAND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalAnd'>>, 'LOGICAL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalOr'>>, 'BOOL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalOr'>>, 'BOOLOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalOr'>>, 'LOWER': <function build_lower>, 'LCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Lower'>>, 'LOWER_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.LowerHex'>>, 'MD5': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5Digest'>>, 'MD5_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5Digest'>>, 'M_D5_NUMBER_LOWER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5NumberLower64'>>, 'M_D5_NUMBER_UPPER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5NumberUpper64'>>, 'M_L_FORECAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.MLForecast'>>, 'M_L_TRANSLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.MLTranslate'>>, 'MAKE_INTERVAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.MakeInterval'>>, 'MANHATTAN_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.ManhattanDistance'>>, 'MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Map'>>, 'MAP_CAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapCat'>>, 'MAP_CONTAINS_KEY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapContainsKey'>>, 'MAP_DELETE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapDelete'>>, 'MAP_FROM_ENTRIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapFromEntries'>>, 'MAP_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapInsert'>>, 'MAP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapKeys'>>, 'MAP_PICK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapPick'>>, 'MAP_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapSize'>>, 'MATCH_AGAINST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MatchAgainst'>>, 'MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Max'>>, 'MEDIAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Median'>>, 'MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Min'>>, 'MINHASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Minhash'>>, 'MINHASH_COMBINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.MinhashCombine'>>, 'MINUTE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Minute'>>, 'MODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Mode'>>, 'MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Month'>>, 'MONTHNAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Monthname'>>, 'MONTHS_BETWEEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.MonthsBetween'>>, 'NET_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.NetFunc'>>, 'NEXT_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.NextDay'>>, 'NEXT_VALUE_FOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ddl.NextValueFor'>>, 'NORMAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Normal'>>, 'NORMALIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Normalize'>>, 'NTH_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.NthValue'>>, 'NTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Ntile'>>, 'NULLIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Nullif'>>, 'NUMBER_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.NumberToStr'>>, 'NVL2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Nvl2'>>, 'OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ObjectAgg'>>, 'OBJECT_ID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ObjectId'>>, 'OBJECT_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ObjectInsert'>>, 'OPEN_J_S_O_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.OpenJSON'>>, 'OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Or'>>, 'OVERLAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Overlay'>>, 'PAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Pad'>>, 'PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.ParameterizedAgg'>>, 'PARSE_BIGNUMERIC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ParseBignumeric'>>, 'PARSE_DATETIME': <function BigQueryParser.<lambda>>, 'PARSE_IP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ParseIp'>>, 'PARSE_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ParseJSON'>>, 'JSON_PARSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ParseJSON'>>, 'PARSE_NUMERIC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ParseNumeric'>>, 'PARSE_TIME': <function BigQueryParser.<lambda>>, 'PARSE_URL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ParseUrl'>>, 'PERCENT_RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.PercentRank'>>, 'PERCENTILE_CONT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.PercentileCont'>>, 'PERCENTILE_DISC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.PercentileDisc'>>, 'PI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Pi'>>, 'POSEXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Posexplode'>>, 'POSEXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.PosexplodeOuter'>>, 'POWER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Pow'>>, 'POW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Pow'>>, 'PREDICT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Predict'>>, 'PREVIOUS_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.PreviousDay'>>, 'QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Quantile'>>, 'QUARTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Quarter'>>, 'RADIANS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Radians'>>, 'RAND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Rand'>>, 'RANDOM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Rand'>>, 'RANDN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Randn'>>, 'RANDSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Randstr'>>, 'RANGE_BUCKET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.RangeBucket'>>, 'RANGE_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.RangeN'>>, 'RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Rank'>>, 'READ_CSV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ReadCSV'>>, 'READ_PARQUET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ReadParquet'>>, 'REDUCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Reduce'>>, 'REG_DOMAIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.RegDomain'>>, 'REGEXP_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpCount'>>, 'REGEXP_EXTRACT': <function _build_regexp_extract.<locals>._builder>, 'REGEXP_EXTRACT_ALL': <function _build_regexp_extract.<locals>._builder>, 'REGEXP_FULL_MATCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpFullMatch'>>, 'REGEXP_I_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpILike'>>, 'REGEXP_INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpInstr'>>, 'REGEXP_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.RegexpLike'>>, 'REGEXP_REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpReplace'>>, 'REGEXP_SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpSplit'>>, 'REGR_AVGX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrAvgx'>>, 'REGR_AVGY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrAvgy'>>, 'REGR_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrCount'>>, 'REGR_INTERCEPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrIntercept'>>, 'REGR_R2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrR2'>>, 'REGR_SLOPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrSlope'>>, 'REGR_SXX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrSxx'>>, 'REGR_SXY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrSxy'>>, 'REGR_SYY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrSyy'>>, 'REGR_VALX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrValx'>>, 'REGR_VALY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrValy'>>, 'REPEAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Repeat'>>, 'REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Replace'>>, 'REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Reverse'>>, 'RIGHT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Right'>>, 'ROUND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Round'>>, 'ROW_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RowNumber'>>, 'RTRIMMED_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RtrimmedLength'>>, 'SHA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA'>>, 'SHA1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA1Digest'>>, 'S_H_A1_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA1Digest'>>, 'SHA2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA2'>>, 'S_H_A2_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA2Digest'>>, 'SAFE_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeAdd'>>, 'SAFE_CONVERT_BYTES_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SafeConvertBytesToString'>>, 'SAFE_DIVIDE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeDivide'>>, 'SAFE_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.SafeFunc'>>, 'SAFE_MULTIPLY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeMultiply'>>, 'SAFE_NEGATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeNegate'>>, 'SAFE_SUBTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeSubtract'>>, 'SEARCH_IP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SearchIp'>>, 'SEC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sec'>>, 'SECH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sech'>>, 'SECOND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Second'>>, 'SEQ1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Seq1'>>, 'SEQ2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Seq2'>>, 'SEQ4': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Seq4'>>, 'SEQ8': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Seq8'>>, 'SESSION_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.SessionUser'>>, 'SIGN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sign'>>, 'SIGNUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sign'>>, 'SIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sin'>>, 'SINH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sinh'>>, 'SKEWNESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Skewness'>>, 'SORT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.SortArray'>>, 'SOUNDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Soundex'>>, 'SOUNDEX_P123': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SoundexP123'>>, 'SPACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Space'>>, 'SPLIT': <function BigQueryParser.<lambda>>, 'SPLIT_PART': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SplitPart'>>, 'SQRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sqrt'>>, 'ST_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StDistance'>>, 'ST_POINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StPoint'>>, 'ST_MAKEPOINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StPoint'>>, 'STANDARD_HASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StandardHash'>>, 'STAR_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StarMap'>>, 'STARTS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StartsWith'>>, 'STARTSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StartsWith'>>, 'STDDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Stddev'>>, 'STDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Stddev'>>, 'STDDEV_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.StddevPop'>>, 'STDDEV_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.StddevSamp'>>, 'STR_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrPosition'>>, 'STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.StrToDate'>>, 'STR_TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrToMap'>>, 'STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.StrToTime'>>, 'STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.StrToUnix'>>, 'STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.String'>>, 'STRING_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StringToArray'>>, 'SPLIT_BY_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StringToArray'>>, 'STRTOK_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StringToArray'>>, 'STRIP_NULL_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.StripNullValue'>>, 'STRTOK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Strtok'>>, 'STRUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Struct'>>, 'STRUCT_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StructExtract'>>, 'STUFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Stuff'>>, 'INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Stuff'>>, 'SUBSTRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Substring'>>, 'SUBSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Substring'>>, 'SUBSTRING_INDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SubstringIndex'>>, 'SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Sum'>>, 'SYSTIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Systimestamp'>>, 'TAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Tan'>>, 'TANH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Tanh'>>, 'TIME': <function _build_time>, 'TIME_ADD': <function build_date_delta_with_interval.<locals>._builder>, 'TIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeDiff'>>, 'TIME_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeFromParts'>>, 'TIMEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeFromParts'>>, 'TIME_SLICE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeSlice'>>, 'TIME_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeStrToDate'>>, 'TIME_STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeStrToTime'>>, 'TIME_STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeStrToUnix'>>, 'TIME_SUB': <function build_date_delta_with_interval.<locals>._builder>, 'TIME_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeToStr'>>, 'TIME_TO_TIME_STR': <function Parser.<lambda>>, 'TIME_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeToUnix'>>, 'TIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeTrunc'>>, 'TIMESTAMP': <function _build_timestamp>, 'TIMESTAMP_ADD': <function build_date_delta_with_interval.<locals>._builder>, 'TIMESTAMPDIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampDiff'>>, 'TIMESTAMP_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampDiff'>>, 'TIMESTAMP_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampFromParts'>>, 'TIMESTAMPFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampFromParts'>>, 'TIMESTAMP_LTZ_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampLtzFromParts'>>, 'TIMESTAMPLTZFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampLtzFromParts'>>, 'TIMESTAMP_SUB': <function build_date_delta_with_interval.<locals>._builder>, 'TIMESTAMP_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampTrunc'>>, 'TIMESTAMP_TZ_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampTzFromParts'>>, 'TIMESTAMPTZFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampTzFromParts'>>, 'TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ToArray'>>, 'TO_BASE32': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToBase32'>>, 'TO_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToBase64'>>, 'TO_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToBinary'>>, 'TO_BOOLEAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ToBoolean'>>, 'TO_CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToChar'>>, 'TO_CODE_POINTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToCodePoints'>>, 'TO_DAYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.ToDays'>>, 'TO_DECFLOAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToDecfloat'>>, 'TO_DOUBLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToDouble'>>, 'TO_FILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToFile'>>, 'TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ToMap'>>, 'TO_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToNumber'>>, 'TO_VARIANT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ToVariant'>>, 'TRANSFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Transform'>>, 'TRANSLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Translate'>>, 'TRIM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Trim'>>, 'TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Trunc'>>, 'TRUNCATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Trunc'>>, 'TRY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Try'>>, 'TRY_BASE64_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryBase64DecodeBinary'>>, 'TRY_BASE64_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryBase64DecodeString'>>, 'TRY_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.TryCast'>>, 'TRY_HEX_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryHexDecodeBinary'>>, 'TRY_HEX_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryHexDecodeString'>>, 'TRY_TO_DECFLOAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryToDecfloat'>>, 'TS_OR_DI_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDiToDi'>>, 'TS_OR_DS_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsAdd'>>, 'TS_OR_DS_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsDiff'>>, 'TS_OR_DS_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsToDate'>>, 'TS_OR_DS_TO_DATE_STR': <function Parser.<lambda>>, 'TS_OR_DS_TO_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsToDatetime'>>, 'TS_OR_DS_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsToTime'>>, 'TS_OR_DS_TO_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsToTimestamp'>>, 'TYPEOF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Typeof'>>, 'UNHEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Unhex'>>, 'UNICODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Unicode'>>, 'UNIFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Uniform'>>, 'UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixDate'>>, 'UNIX_MICROS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixMicros'>>, 'UNIX_MILLIS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixMillis'>>, 'UNIX_SECONDS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixSeconds'>>, 'UNIX_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixToStr'>>, 'UNIX_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixToTime'>>, 'UNIX_TO_TIME_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixToTimeStr'>>, 'UNNEST': <function Parser.<lambda>>, 'UPPER': <function build_upper>, 'UCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Upper'>>, 'UTC_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UtcDate'>>, 'UTC_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UtcTime'>>, 'UTC_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UtcTimestamp'>>, 'UUID': <function Parser.<lambda>>, 'GEN_RANDOM_UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Uuid'>>, 'GENERATE_UUID': <function Parser.<lambda>>, 'UUID_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Uuid'>>, 'VAR_MAP': <function build_var_map>, 'VARIANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Variance'>>, 'VARIANCE_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Variance'>>, 'VAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Variance'>>, 'VARIANCE_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.VariancePop'>>, 'VAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.VariancePop'>>, 'VECTOR_SEARCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.VectorSearch'>>, 'WEEK': <function BigQueryParser.<lambda>>, 'WEEK_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.WeekOfYear'>>, 'WEEKOFYEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.WeekOfYear'>>, 'WEEK_START': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.WeekStart'>>, 'WIDTH_BUCKET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.WidthBucket'>>, 'XMLELEMENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.XMLElement'>>, 'XMLGET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.XMLGet'>>, 'X_M_L_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.XMLTable'>>, 'XOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Xor'>>, 'YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Year'>>, 'YEAR_OF_WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.YearOfWeek'>>, 'YEAROFWEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.YearOfWeek'>>, 'YEAR_OF_WEEK_ISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.YearOfWeekIso'>>, 'YEAROFWEEKISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.YearOfWeekIso'>>, 'ZIPF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Zipf'>>, 'EXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array._ExplodeOuter'>>, 'ARRAYAGG': <function Parser.<lambda>>, 'GLOB': <function Parser.<lambda>>, 'JSON_EXTRACT_PATH_TEXT': <function build_extract_json_with_path.<locals>._builder>, 'LIKE': <function build_like>, 'LOG2': <function Parser.<lambda>>, 'LOG10': <function Parser.<lambda>>, 'LPAD': <function Parser.<lambda>>, 'LEFTPAD': <function Parser.<lambda>>, 'LTRIM': <function Parser.<lambda>>, 'MOD': <function build_mod>, 'RIGHTPAD': <function Parser.<lambda>>, 'RPAD': <function Parser.<lambda>>, 'RTRIM': <function Parser.<lambda>>, 'SCOPE_RESOLUTION': <function Parser.<lambda>>, 'STRPOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrPosition'>>, 'CHARINDEX': <function Parser.<lambda>>, 'INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrPosition'>>, 'LOCATE': <function Parser.<lambda>>, 'TO_HEX': <function _build_to_hex>, 'APPROX_TOP_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopK'>>, 'BIT_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseAndAgg'>>, 'BIT_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseOrAgg'>>, 'BIT_XOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseXorAgg'>>, 'BIT_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseCount'>>, 'BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBool'>>, 'CONTAINS_SUBSTR': <function _build_contains_substring>, 'DIV': <function binary_from_function.<locals>.<lambda>>, 'EDIT_DISTANCE': <function _build_levenshtein>, 'EMBED': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIEmbed'>>, 'FORMAT_DATE': <function _build_format_time.<locals>._builder>, 'GENERATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIGenerate'>>, 'GENERATE_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.GenerateSeries'>>, 'JSON_EXTRACT_STRING_ARRAY': <function _build_extract_json_with_default_path.<locals>._builder>, 'JSON_QUERY': <function build_extract_json_with_path.<locals>._builder>, 'JSON_QUERY_ARRAY': <function _build_extract_json_with_default_path.<locals>._builder>, 'JSON_VALUE': <function _build_extract_json_with_default_path.<locals>._builder>, 'JSON_VALUE_ARRAY': <function _build_extract_json_with_default_path.<locals>._builder>, 'NORMALIZE_AND_CASEFOLD': <function BigQueryParser.<lambda>>, 'OCTET_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ByteLength'>>, 'PARSE_DATE': <function BigQueryParser.<lambda>>, 'PARSE_TIMESTAMP': <function _build_parse_timestamp>, 'REGEXP_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.RegexpLike'>>, 'REGEXP_SUBSTR': <function _build_regexp_extract.<locals>._builder>, 'SHA256': <function BigQueryParser.<lambda>>, 'SHA512': <function BigQueryParser.<lambda>>, 'SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AISimilarity'>>, 'TIMESTAMP_MICROS': <function BigQueryParser.<lambda>>, 'TIMESTAMP_MILLIS': <function BigQueryParser.<lambda>>, 'TIMESTAMP_SECONDS': <function BigQueryParser.<lambda>>, 'TO_JSON': <function BigQueryParser.<lambda>>, 'TO_JSON_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONFormat'>>, 'FORMAT_DATETIME': <function _build_format_time.<locals>._builder>, 'FORMAT_TIMESTAMP': <function _build_format_time.<locals>._builder>, 'FORMAT_TIME': <function _build_format_time.<locals>._builder>, 'FROM_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Unhex'>>}
FUNCTION_PARSERS = {'ARG_MAX': <function Parser.<dictcomp>.<lambda>>, 'ARGMAX': <function Parser.<dictcomp>.<lambda>>, 'MAX_BY': <function Parser.<dictcomp>.<lambda>>, 'ARG_MIN': <function Parser.<dictcomp>.<lambda>>, 'ARGMIN': <function Parser.<dictcomp>.<lambda>>, 'MIN_BY': <function Parser.<dictcomp>.<lambda>>, 'CAST': <function Parser.<lambda>>, 'CEIL': <function Parser.<lambda>>, 'CONVERT': <function Parser.<lambda>>, 'CHAR': <function Parser.<lambda>>, 'CHR': <function Parser.<lambda>>, 'DECODE': <function Parser.<lambda>>, 'EXTRACT': <function Parser.<lambda>>, 'FLOOR': <function Parser.<lambda>>, 'GAP_FILL': <function Parser.<lambda>>, 'INITCAP': <function Parser.<lambda>>, 'JSON_OBJECT': <function Parser.<lambda>>, 'JSON_OBJECTAGG': <function Parser.<lambda>>, 'JSON_TABLE': <function Parser.<lambda>>, 'MATCH': <function Parser.<lambda>>, 'NORMALIZE': <function Parser.<lambda>>, 'OPENJSON': <function Parser.<lambda>>, 'OVERLAY': <function Parser.<lambda>>, 'POSITION': <function Parser.<lambda>>, 'SAFE_CAST': <function Parser.<lambda>>, 'STRING_AGG': <function Parser.<lambda>>, 'SUBSTRING': <function Parser.<lambda>>, 'TRY_CAST': <function Parser.<lambda>>, 'TRY_CONVERT': <function Parser.<lambda>>, 'XMLELEMENT': <function Parser.<lambda>>, 'XMLTABLE': <function Parser.<lambda>>, 'ARRAY': <function BigQueryParser.<lambda>>, 'JSON_ARRAY': <function BigQueryParser.<lambda>>, 'MAKE_INTERVAL': <function BigQueryParser.<lambda>>, 'PREDICT': <function BigQueryParser.<lambda>>, 'TRANSLATE': <function BigQueryParser.<lambda>>, 'FEATURES_AT_TIME': <function BigQueryParser.<lambda>>, 'GENERATE_EMBEDDING': <function BigQueryParser.<lambda>>, 'GENERATE_TEXT_EMBEDDING': <function BigQueryParser.<lambda>>, 'GENERATE_TEXT': <function BigQueryParser.<lambda>>, 'GENERATE_TABLE': <function BigQueryParser.<lambda>>, 'GENERATE_BOOL': <function BigQueryParser.<lambda>>, 'GENERATE_INT': <function BigQueryParser.<lambda>>, 'GENERATE_DOUBLE': <function BigQueryParser.<lambda>>, 'VECTOR_SEARCH': <function BigQueryParser.<lambda>>, 'FORECAST': <function BigQueryParser.<lambda>>}
NO_PAREN_FUNCTIONS: ClassVar = {<TokenType.CURRENT_DATE: 244>: <class 'sqlglot.expressions.temporal.CurrentDate'>, <TokenType.CURRENT_DATETIME: 245>: <class 'sqlglot.expressions.temporal.CurrentDatetime'>, <TokenType.CURRENT_TIME: 247>: <class 'sqlglot.expressions.temporal.CurrentTime'>, <TokenType.CURRENT_TIMESTAMP: 248>: <class 'sqlglot.expressions.temporal.CurrentTimestamp'>, <TokenType.CURRENT_USER: 249>: <class 'sqlglot.expressions.functions.CurrentUser'>, <TokenType.CURRENT_ROLE: 250>: <class 'sqlglot.expressions.functions.CurrentRole'>}
NESTED_TYPE_TOKENS: ClassVar = {<TokenType.MAP: 320>, <TokenType.OBJECT: 197>, <TokenType.NULLABLE: 172>, <TokenType.LOWCARDINALITY: 207>, <TokenType.RANGE: 367>, <TokenType.NESTED: 208>, <TokenType.STRUCT: 399>, <TokenType.TABLE: 82>, <TokenType.UNION: 410>, <TokenType.LIST: 317>, <TokenType.ARRAY: 222>}
PROPERTY_PARSERS: ClassVar = {'ALLOWED_VALUES': <function Parser.<lambda>>, 'ALGORITHM': <function Parser.<lambda>>, 'AUTO': <function Parser.<lambda>>, 'AUTO_INCREMENT': <function Parser.<lambda>>, 'BACKUP': <function Parser.<lambda>>, 'BLOCKCOMPRESSION': <function Parser.<lambda>>, 'CHARSET': <function Parser.<lambda>>, 'CHARACTER SET': <function Parser.<lambda>>, 'CHECKSUM': <function Parser.<lambda>>, 'CLUSTER BY': <function Parser.<lambda>>, 'CLUSTERED': <function Parser.<lambda>>, 'COLLATE': <function Parser.<lambda>>, 'COMMENT': <function Parser.<lambda>>, 'CONTAINS': <function Parser.<lambda>>, 'COPY': <function Parser.<lambda>>, 'DATABLOCKSIZE': <function Parser.<lambda>>, 'DATA_DELETION': <function Parser.<lambda>>, 'DEFINER': <function Parser.<lambda>>, 'DETERMINISTIC': <function Parser.<lambda>>, 'DISTRIBUTED': <function Parser.<lambda>>, 'DUPLICATE': <function Parser.<lambda>>, 'DYNAMIC': <function Parser.<lambda>>, 'DISTKEY': <function Parser.<lambda>>, 'DISTSTYLE': <function Parser.<lambda>>, 'EMPTY': <function Parser.<lambda>>, 'ENGINE': <function Parser.<lambda>>, 'ENVIRONMENT': <function Parser.<lambda>>, 'HANDLER': <function Parser.<lambda>>, 'EXECUTE': <function Parser.<lambda>>, 'EXTERNAL': <function Parser.<lambda>>, 'FALLBACK': <function Parser.<lambda>>, 'FORMAT': <function Parser.<lambda>>, 'FREESPACE': <function Parser.<lambda>>, 'GLOBAL': <function Parser.<lambda>>, 'HEAP': <function Parser.<lambda>>, 'ICEBERG': <function Parser.<lambda>>, 'IMMUTABLE': <function Parser.<lambda>>, 'INHERITS': <function Parser.<lambda>>, 'INPUT': <function Parser.<lambda>>, 'JOURNAL': <function Parser.<lambda>>, 'LANGUAGE': <function Parser.<lambda>>, 'LAYOUT': <function Parser.<lambda>>, 'LIFETIME': <function Parser.<lambda>>, 'LIKE': <function Parser.<lambda>>, 'LOCATION': <function Parser.<lambda>>, 'LOCK': <function Parser.<lambda>>, 'LOCKING': <function Parser.<lambda>>, 'LOG': <function Parser.<lambda>>, 'MATERIALIZED': <function Parser.<lambda>>, 'MERGEBLOCKRATIO': <function Parser.<lambda>>, 'MODIFIES': <function Parser.<lambda>>, 'MULTISET': <function Parser.<lambda>>, 'NO': <function Parser.<lambda>>, 'ON': <function Parser.<lambda>>, 'ORDER BY': <function Parser.<lambda>>, 'OUTPUT': <function Parser.<lambda>>, 'PARTITION': <function Parser.<lambda>>, 'PARTITION BY': <function Parser.<lambda>>, 'PARTITIONED BY': <function Parser.<lambda>>, 'PARTITIONED_BY': <function Parser.<lambda>>, 'PRIMARY KEY': <function Parser.<lambda>>, 'RANGE': <function Parser.<lambda>>, 'READS': <function Parser.<lambda>>, 'REMOTE': <function Parser.<lambda>>, 'RETURNS': <function Parser.<lambda>>, 'STRICT': <function Parser.<lambda>>, 'STREAMING': <function Parser.<lambda>>, 'ROW': <function Parser.<lambda>>, 'ROW_FORMAT': <function Parser.<lambda>>, 'SAMPLE': <function Parser.<lambda>>, 'SECURE': <function Parser.<lambda>>, 'SECURITY': <function Parser.<lambda>>, 'SQL SECURITY': <function Parser.<lambda>>, 'SET': <function Parser.<lambda>>, 'SETTINGS': <function Parser.<lambda>>, 'SHARING': <function Parser.<lambda>>, 'SORTKEY': <function Parser.<lambda>>, 'SOURCE': <function Parser.<lambda>>, 'STABLE': <function Parser.<lambda>>, 'STORED': <function Parser.<lambda>>, 'SYSTEM_VERSIONING': <function Parser.<lambda>>, 'TBLPROPERTIES': <function Parser.<lambda>>, 'TEMP': <function Parser.<lambda>>, 'TEMPORARY': <function Parser.<lambda>>, 'TO': <function Parser.<lambda>>, 'TRANSIENT': <function Parser.<lambda>>, 'TRANSFORM': <function Parser.<lambda>>, 'TTL': <function Parser.<lambda>>, 'USING': <function Parser.<lambda>>, 'UNLOGGED': <function Parser.<lambda>>, 'VOLATILE': <function Parser.<lambda>>, 'WITH': <function Parser.<lambda>>, 'NOT DETERMINISTIC': <function BigQueryParser.<lambda>>, 'OPTIONS': <function BigQueryParser.<lambda>>}
CONSTRAINT_PARSERS: ClassVar = {'AUTOINCREMENT': <function Parser.<lambda>>, 'AUTO_INCREMENT': <function Parser.<lambda>>, 'CASESPECIFIC': <function Parser.<lambda>>, 'CHARACTER SET': <function Parser.<lambda>>, 'CHECK': <function Parser.<lambda>>, 'COLLATE': <function Parser.<lambda>>, 'COMMENT': <function Parser.<lambda>>, 'COMPRESS': <function Parser.<lambda>>, 'CLUSTERED': <function Parser.<lambda>>, 'NONCLUSTERED': <function Parser.<lambda>>, 'DEFAULT': <function Parser.<lambda>>, 'ENCODE': <function Parser.<lambda>>, 'EPHEMERAL': <function Parser.<lambda>>, 'EXCLUDE': <function Parser.<lambda>>, 'FOREIGN KEY': <function Parser.<lambda>>, 'FORMAT': <function Parser.<lambda>>, 'GENERATED': <function Parser.<lambda>>, 'IDENTITY': <function Parser.<lambda>>, 'INLINE': <function Parser.<lambda>>, 'LIKE': <function Parser.<lambda>>, 'NOT': <function Parser.<lambda>>, 'NULL': <function Parser.<lambda>>, 'ON': <function Parser.<lambda>>, 'PATH': <function Parser.<lambda>>, 'PERIOD': <function Parser.<lambda>>, 'PRIMARY KEY': <function Parser.<lambda>>, 'REFERENCES': <function Parser.<lambda>>, 'TITLE': <function Parser.<lambda>>, 'TTL': <function Parser.<lambda>>, 'UNIQUE': <function Parser.<lambda>>, 'UPPERCASE': <function Parser.<lambda>>, 'WITH': <function Parser.<lambda>>, 'BUCKET': <function Parser.<lambda>>, 'TRUNCATE': <function Parser.<lambda>>, 'OPTIONS': <function BigQueryParser.<lambda>>}
RANGE_PARSERS: ClassVar = {<TokenType.AT_GT: 54>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.BETWEEN: 228>: <function Parser.<lambda>>, <TokenType.GLOB: 284>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ILIKE: 292>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IN: 293>: <function Parser.<lambda>>, <TokenType.IRLIKE: 304>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IS: 305>: <function Parser.<lambda>>, <TokenType.LIKE: 315>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.LT_AT: 53>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.RLIKE: 376>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.SIMILAR_TO: 391>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.FOR: 276>: <function Parser.<lambda>>, <TokenType.QMARK_AMP: 66>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.QMARK_PIPE: 67>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.HASH_DASH: 68>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ADJACENT: 63>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.OPERATOR: 337>: <function Parser.<lambda>>, <TokenType.AMP_LT: 61>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.AMP_GT: 62>: <function binary_range_parser.<locals>._parse_binary_range>}
DASHED_TABLE_PART_FOLLOW_TOKENS: ClassVar = {<TokenType.DOT: 8>, <TokenType.L_PAREN: 1>, <TokenType.R_PAREN: 2>}
STATEMENT_PARSERS: ClassVar = {<TokenType.ALTER: 217>: <function Parser.<lambda>>, <TokenType.ANALYZE: 435>: <function Parser.<lambda>>, <TokenType.BEGIN: 227>: <function Parser.<lambda>>, <TokenType.CACHE: 230>: <function Parser.<lambda>>, <TokenType.COMMENT: 236>: <function Parser.<lambda>>, <TokenType.COMMIT: 237>: <function Parser.<lambda>>, <TokenType.COPY: 240>: <function Parser.<lambda>>, <TokenType.CREATE: 241>: <function Parser.<lambda>>, <TokenType.DELETE: 254>: <function Parser.<lambda>>, <TokenType.DESC: 255>: <function Parser.<lambda>>, <TokenType.DESCRIBE: 256>: <function Parser.<lambda>>, <TokenType.DROP: 262>: <function Parser.<lambda>>, <TokenType.GRANT: 286>: <function Parser.<lambda>>, <TokenType.REVOKE: 373>: <function Parser.<lambda>>, <TokenType.INSERT: 297>: <function Parser.<lambda>>, <TokenType.KILL: 311>: <function Parser.<lambda>>, <TokenType.LOAD: 318>: <function Parser.<lambda>>, <TokenType.MERGE: 325>: <function Parser.<lambda>>, <TokenType.PIVOT: 352>: <function Parser.<lambda>>, <TokenType.PRAGMA: 357>: <function Parser.<lambda>>, <TokenType.REFRESH: 369>: <function Parser.<lambda>>, <TokenType.ROLLBACK: 378>: <function Parser.<lambda>>, <TokenType.SET: 388>: <function Parser.<lambda>>, <TokenType.TRUNCATE: 407>: <function Parser.<lambda>>, <TokenType.UNCACHE: 409>: <function Parser.<lambda>>, <TokenType.UNPIVOT: 412>: <function Parser.<lambda>>, <TokenType.UPDATE: 413>: <function Parser.<lambda>>, <TokenType.USE: 414>: <function Parser.<lambda>>, <TokenType.SEMICOLON: 19>: <function Parser.<lambda>>, <TokenType.ELSE: 263>: <function BigQueryParser.<lambda>>, <TokenType.END: 264>: <function BigQueryParser.<lambda>>, <TokenType.FOR: 276>: <function BigQueryParser.<lambda>>, <TokenType.EXPORT: 437>: <function BigQueryParser.<lambda>>, <TokenType.DECLARE: 252>: <function BigQueryParser.<lambda>>}
BRACKET_OFFSETS: ClassVar = {'OFFSET': (0, False), 'ORDINAL': (1, False), 'SAFE_OFFSET': (0, True), 'SAFE_ORDINAL': (1, True)}
Inherited Members
sqlglot.parser.Parser
Parser
STRUCT_TYPE_TOKENS
ENUM_TYPE_TOKENS
AGGREGATE_TYPE_TOKENS
TYPE_TOKENS
SIGNED_TO_UNSIGNED_TYPE_TOKEN
SUBQUERY_PREDICATES
SUBQUERY_TOKENS
RESERVED_TOKENS
DB_CREATABLES
CREATABLES
TRIGGER_EVENTS
ALTERABLES
COLON_PLACEHOLDER_TOKENS
ARRAY_CONSTRUCTORS
TRIM_TYPES
IDENTIFIER_TOKENS
BRACKETS
COLUMN_POSTFIX_TOKENS
TABLE_POSTFIX_TOKENS
FUNC_TOKENS
CONJUNCTION
ASSIGNMENT
DISJUNCTION
EQUALITY
COMPARISON
BITWISE
TERM
FACTOR
EXPONENT
TIMES
TIMESTAMPS
SET_OPERATIONS
JOIN_METHODS
JOIN_SIDES
JOIN_KINDS
JOIN_HINTS
TABLE_TERMINATORS
LAMBDAS
TYPED_LAMBDA_ARGS
LAMBDA_ARG_TERMINATORS
COLUMN_OPERATORS
CAST_COLUMN_OPERATORS
EXPRESSION_PARSERS
UNARY_PARSERS
STRING_PARSERS
NUMERIC_PARSERS
PRIMARY_PARSERS
PLACEHOLDER_PARSERS
PIPE_SYNTAX_TRANSFORM_PARSERS
ALTER_PARSERS
ALTER_ALTER_PARSERS
SCHEMA_UNNAMED_CONSTRAINTS
NO_PAREN_FUNCTION_PARSERS
INVALID_FUNC_NAME_TOKENS
FUNCTIONS_WITH_ALIASED_ARGS
KEY_VALUE_DEFINITIONS
QUERY_MODIFIER_PARSERS
QUERY_MODIFIER_TOKENS
SET_PARSERS
SHOW_PARSERS
TYPE_LITERAL_PARSERS
TYPE_CONVERTERS
DDL_SELECT_TOKENS
PRE_VOLATILE_TOKENS
TRANSACTION_KIND
TRANSACTION_CHARACTERISTICS
CONFLICT_ACTIONS
TRIGGER_TIMING
TRIGGER_DEFERRABLE
CREATE_SEQUENCE
ISOLATED_LOADING_OPTIONS
USABLES
CAST_ACTIONS
SCHEMA_BINDING_OPTIONS
PROCEDURE_OPTIONS
EXECUTE_AS_OPTIONS
KEY_CONSTRAINT_OPTIONS
WINDOW_EXCLUDE_OPTIONS
INSERT_ALTERNATIVES
CLONE_KEYWORDS
HISTORICAL_DATA_PREFIX
HISTORICAL_DATA_KIND
OPCLASS_FOLLOW_KEYWORDS
OPTYPE_FOLLOW_TOKENS
TABLE_INDEX_HINT_TOKENS
VIEW_ATTRIBUTES
WINDOW_ALIAS_TOKENS
WINDOW_BEFORE_PAREN_TOKENS
WINDOW_SIDES
JSON_KEY_VALUE_SEPARATOR_TOKENS
FETCH_TOKENS
ADD_CONSTRAINT_TOKENS
DISTINCT_TOKENS
UNNEST_OFFSET_ALIAS_TOKENS
SELECT_START_TOKENS
COPY_INTO_VARLEN_OPTIONS
IS_JSON_PREDICATE_KIND
ODBC_DATETIME_LITERALS
ON_CONDITION_TOKENS
PRIVILEGE_FOLLOW_TOKENS
DESCRIBE_STYLES
SET_ASSIGNMENT_DELIMITERS
ANALYZE_STYLES
ANALYZE_EXPRESSION_PARSERS
PARTITION_KEYWORDS
AMBIGUOUS_ALIAS_TOKENS
OPERATION_MODIFIERS
RECURSIVE_CTE_SEARCH_KIND
SECURITY_PROPERTY_KEYWORDS
MODIFIABLES
STRICT_CAST
IDENTIFY_PIVOT_STRINGS
TABLESAMPLE_CSV
DEFAULT_SAMPLING_METHOD
SET_REQUIRES_ASSIGNMENT_DELIMITER
TRIM_PATTERN_FIRST
STRING_ALIASES
MODIFIERS_ATTACHED_TO_SET_OP
SET_OP_MODIFIERS
NO_PAREN_IF_COMMANDS
JSON_ARROWS_REQUIRE_JSON_TYPE
COLON_IS_VARIANT_EXTRACT
VALUES_FOLLOWED_BY_PAREN
INTERVAL_SPANS
SUPPORTS_PARTITION_SELECTION
WRAPPED_TRANSFORM_COLUMN_CONSTRAINT
OPTIONAL_ALIAS_TOKEN_CTE
ALTER_RENAME_REQUIRES_COLUMN
ALTER_TABLE_PARTITIONS
ZONE_AWARE_TIMESTAMP_CONSTRUCTOR
MAP_KEYS_ARE_ARBITRARY_EXPRESSIONS
JSON_EXTRACT_REQUIRES_JSON_EXPRESSION
ADD_JOIN_ON_TRUE
SUPPORTS_OMITTED_INTERVAL_SPAN_UNIT
SHOW_TRIE
SET_TRIE
error_level
error_message_context
max_errors
max_nodes
dialect
sql
errors
reset
raise_error
validate_expression
parse
parse_into
check_errors
expression
parse_set_operation
build_cast