Edit on GitHub

sqlglot.parsers.snowflake

   1from __future__ import annotations
   2
   3import typing as t
   4
   5from sqlglot import exp, parser
   6from sqlglot.dialects.dialect import (
   7    Dialect,
   8    binary_from_function,
   9    build_default_decimal_type,
  10    build_formatted_time,
  11    build_like,
  12    build_replace_with_optional_replacement,
  13    build_timetostr_or_tochar,
  14    build_trunc,
  15    date_trunc_to_time,
  16    map_date_part,
  17)
  18from sqlglot.helper import is_int, seq_get
  19from sqlglot.tokens import TokenType
  20from sqlglot.trie import new_trie
  21
  22if t.TYPE_CHECKING:
  23    from collections.abc import Collection
  24
  25    from sqlglot._typing import B, E
  26    from sqlglot.dialects.dialect import Dialect
  27
  28
  29def _build_approx_top_k(args: list) -> exp.ApproxTopK:
  30    """
  31    Normalizes APPROX_TOP_K arguments to match Snowflake semantics.
  32
  33    Snowflake APPROX_TOP_K signature: APPROX_TOP_K(column [, k] [, counters])
  34    - k defaults to 1 if omitted (per Snowflake documentation)
  35    - counters is optional precision parameter
  36    """
  37    # Add default k=1 if only column is provided
  38    if len(args) == 1:
  39        args.append(exp.Literal.number(1))
  40
  41    return exp.ApproxTopK.from_arg_list(args)
  42
  43
  44def _build_to_number(args: list, safe: bool = False) -> exp.ToNumber:
  45    second_arg = seq_get(args, 1)
  46    if second_arg and second_arg.is_number:
  47        fmt = None
  48        precision = second_arg
  49        scale = seq_get(args, 2) or exp.Literal.number(0)
  50    else:
  51        fmt = second_arg
  52        precision = seq_get(args, 2) or exp.Literal.number(38)
  53        scale = seq_get(args, 3) or exp.Literal.number(0)
  54
  55    return exp.ToNumber(
  56        this=seq_get(args, 0),
  57        format=fmt,
  58        precision=precision,
  59        scale=scale,
  60        safe=safe,
  61    )
  62
  63
  64def _build_date_from_parts(args: list) -> exp.DateFromParts:
  65    return exp.DateFromParts(
  66        year=seq_get(args, 0),
  67        month=seq_get(args, 1),
  68        day=seq_get(args, 2),
  69        allow_overflow=True,
  70    )
  71
  72
  73# Timestamp types used in _build_datetime
  74TIMESTAMP_TYPES = {
  75    exp.DType.TIMESTAMP: "TO_TIMESTAMP",
  76    exp.DType.TIMESTAMPLTZ: "TO_TIMESTAMP_LTZ",
  77    exp.DType.TIMESTAMPNTZ: "TO_TIMESTAMP_NTZ",
  78    exp.DType.TIMESTAMPTZ: "TO_TIMESTAMP_TZ",
  79}
  80
  81
  82def _build_datetime(name: str, kind: exp.DType, safe: bool = False) -> t.Callable:
  83    def _builder(args: list, dialect: Dialect) -> exp.Func:
  84        value = seq_get(args, 0)
  85        scale_or_fmt = seq_get(args, 1)
  86
  87        int_value = value is not None and is_int(value.name)
  88        int_scale_or_fmt = scale_or_fmt is not None and scale_or_fmt.is_int
  89
  90        if isinstance(value, (exp.Literal, exp.Neg)) or (value and scale_or_fmt):
  91            # Converts calls like `TO_TIME('01:02:03')` into casts
  92            if len(args) == 1 and value.is_string and not int_value:
  93                cast = (
  94                    exp.TryCast(this=value, to=kind.into_expr(), requires_string=True)
  95                    if safe
  96                    else exp.cast(value, kind)
  97                )
  98                if safe and kind == exp.DType.DATE:
  99                    cast.set("probe_date_format", True)
 100                return cast
 101
 102            # Handles `TO_TIMESTAMP(str, fmt)` and `TO_TIMESTAMP(num, scale)` as special
 103            # cases so we can transpile them, since they're relatively common
 104            if kind in TIMESTAMP_TYPES:
 105                if not safe and (int_scale_or_fmt or (int_value and scale_or_fmt is None)):
 106                    # TRY_TO_TIMESTAMP('integer') is not parsed into exp.UnixToTime as
 107                    # it's not easily transpilable. Also, numeric-looking strings with
 108                    # format strings (e.g., TO_TIMESTAMP('20240115', 'YYYYMMDD')) should
 109                    # use StrToTime, not UnixToTime.
 110                    unix_expr = exp.UnixToTime(this=value, scale=scale_or_fmt)
 111                    unix_expr.set("target_type", kind.into_expr())
 112                    return unix_expr
 113                if scale_or_fmt and not int_scale_or_fmt:
 114                    # Format string provided (e.g., 'YYYY-MM-DD'), use StrToTime
 115                    strtotime_expr = build_formatted_time(exp.StrToTime)(args, dialect)
 116                    strtotime_expr.set("safe", safe)
 117                    strtotime_expr.set("target_type", kind.into_expr())
 118                    return strtotime_expr
 119
 120        # Handle DATE/TIME with format strings - allow int_value if a format string is provided
 121        has_format_string = scale_or_fmt and not int_scale_or_fmt
 122        if kind in (exp.DType.DATE, exp.DType.TIME) and (not int_value or has_format_string):
 123            klass = exp.TsOrDsToDate if kind == exp.DType.DATE else exp.TsOrDsToTime
 124            formatted_exp = build_formatted_time(klass)(args, dialect)
 125            formatted_exp.set("safe", safe)
 126            return formatted_exp
 127
 128        return exp.Anonymous(this=name, expressions=args)
 129
 130    return _builder
 131
 132
 133def _build_bitwise(expr_type: type[B], name: str) -> t.Callable[[list], B | exp.Anonymous]:
 134    def _builder(args: list) -> B | exp.Anonymous:
 135        if len(args) == 3:
 136            # Special handling for bitwise operations with padside argument
 137            if expr_type in (exp.BitwiseAnd, exp.BitwiseOr, exp.BitwiseXor):
 138                return expr_type(
 139                    this=seq_get(args, 0), expression=seq_get(args, 1), padside=seq_get(args, 2)
 140                )
 141            return exp.Anonymous(this=name, expressions=args)
 142
 143        result = binary_from_function(expr_type)(args)
 144
 145        # Snowflake specifies INT128 for bitwise shifts
 146        if expr_type in (exp.BitwiseLeftShift, exp.BitwiseRightShift):
 147            result.set("requires_int128", True)
 148
 149        return result
 150
 151    return _builder
 152
 153
 154# https://docs.snowflake.com/en/sql-reference/functions/div0
 155def _build_if_from_div0(args: list) -> exp.If:
 156    lhs = exp._wrap(seq_get(args, 0), exp.Binary)
 157    rhs = exp._wrap(seq_get(args, 1), exp.Binary)
 158
 159    cond = exp.EQ(this=rhs, expression=exp.Literal.number(0)).and_(
 160        exp.Is(this=lhs, expression=exp.null()).not_()
 161    )
 162    true = exp.Literal.number(0)
 163    false = exp.Div(this=lhs, expression=rhs)
 164    return exp.If(this=cond, true=true, false=false)
 165
 166
 167# https://docs.snowflake.com/en/sql-reference/functions/div0null
 168def _build_if_from_div0null(args: list) -> exp.If:
 169    lhs = exp._wrap(seq_get(args, 0), exp.Binary)
 170    rhs = exp._wrap(seq_get(args, 1), exp.Binary)
 171
 172    # Returns 0 when divisor is 0 OR NULL
 173    cond = exp.EQ(this=rhs, expression=exp.Literal.number(0)).or_(
 174        exp.Is(this=rhs, expression=exp.null())
 175    )
 176    true = exp.Literal.number(0)
 177    false = exp.Div(this=lhs, expression=rhs)
 178    return exp.If(this=cond, true=true, false=false)
 179
 180
 181# https://docs.snowflake.com/en/sql-reference/functions/zeroifnull
 182def _build_if_from_zeroifnull(args: list) -> exp.If:
 183    cond = exp.Is(this=seq_get(args, 0), expression=exp.Null())
 184    return exp.If(this=cond, true=exp.Literal.number(0), false=seq_get(args, 0))
 185
 186
 187def _build_search(args: list) -> exp.Search:
 188    kwargs = {
 189        "this": seq_get(args, 0),
 190        "expression": seq_get(args, 1),
 191        **{arg.name.lower(): arg for arg in args[2:] if isinstance(arg, exp.Kwarg)},
 192    }
 193    return exp.Search(**kwargs)
 194
 195
 196# https://docs.snowflake.com/en/sql-reference/functions/zeroifnull
 197def _build_if_from_nullifzero(args: list) -> exp.If:
 198    cond = exp.EQ(this=seq_get(args, 0), expression=exp.Literal.number(0))
 199    return exp.If(this=cond, true=exp.Null(), false=seq_get(args, 0))
 200
 201
 202def _build_regexp_replace(args: list) -> exp.RegexpReplace:
 203    regexp_replace = exp.RegexpReplace.from_arg_list(args)
 204
 205    if not regexp_replace.args.get("replacement"):
 206        regexp_replace.set("replacement", exp.Literal.string(""))
 207
 208    return regexp_replace
 209
 210
 211def _build_regexp_like(args: list) -> exp.RegexpLike:
 212    return exp.RegexpLike(
 213        this=seq_get(args, 0),
 214        expression=seq_get(args, 1),
 215        flag=seq_get(args, 2),
 216        full_match=True,
 217    )
 218
 219
 220def _date_trunc_to_time(args: list) -> exp.DateTrunc | exp.TimestampTrunc:
 221    trunc = date_trunc_to_time(args)
 222    trunc.set("unit", map_date_part(trunc.args["unit"]))
 223    trunc.set("input_type_preserved", True)
 224    return trunc
 225
 226
 227def _build_trunc(args: list, dialect: Dialect) -> exp.DateTrunc | exp.Trunc | exp.Anonymous:
 228    trunc = build_trunc(args, dialect, date_trunc_requires_part=False, fractions_supported=True)
 229    if isinstance(trunc, exp.DateTrunc):
 230        trunc.set("input_type_preserved", True)
 231    return trunc
 232
 233
 234def _build_regexp_extract(expr_type: type[E]) -> t.Callable[[list, Dialect], E]:
 235    def _builder(args: list, dialect: Dialect) -> E:
 236        return expr_type(
 237            this=seq_get(args, 0),
 238            expression=seq_get(args, 1),
 239            position=seq_get(args, 2),
 240            occurrence=seq_get(args, 3),
 241            parameters=seq_get(args, 4),
 242            group=seq_get(args, 5) or exp.Literal.number(0),
 243            **(
 244                {
 245                    "null_if_pos_overflow": dialect.REGEXP_EXTRACT_POSITION_OVERFLOW_RETURNS_NULL,
 246                    "null_if_no_match": dialect.REGEXP_EXTRACT_NO_MATCH_RETURNS_NULL,
 247                    "empty_if_group_missing": dialect.REGEXP_EXTRACT_MISSING_GROUP_RETURNS_EMPTY,
 248                }
 249                if expr_type is exp.RegexpExtract
 250                else {}
 251            ),
 252        )
 253
 254    return _builder
 255
 256
 257def _build_timestamp_from_parts(args: list) -> exp.Func:
 258    """Build TimestampFromParts with support for both syntaxes:
 259    1. TIMESTAMP_FROM_PARTS(year, month, day, hour, minute, second [, nanosecond] [, time_zone])
 260    2. TIMESTAMP_FROM_PARTS(date_expr, time_expr) - Snowflake specific
 261    """
 262    if len(args) == 2:
 263        return exp.TimestampFromParts(this=seq_get(args, 0), expression=seq_get(args, 1))
 264
 265    return exp.TimestampFromParts.from_arg_list(args)
 266
 267
 268def _build_round(args: list) -> exp.Round:
 269    """
 270    Build Round expression, unwrapping Snowflake's named parameters.
 271
 272    Maps EXPR => this, SCALE => decimals, ROUNDING_MODE => truncate.
 273
 274    Note: Snowflake does not support mixing named and positional arguments.
 275    Arguments are either all named or all positional.
 276    """
 277    kwarg_map = {"EXPR": "this", "SCALE": "decimals", "ROUNDING_MODE": "truncate"}
 278    round_args = {}
 279    positional_keys = ["this", "decimals", "truncate"]
 280    positional_idx = 0
 281
 282    for arg in args:
 283        if isinstance(arg, exp.Kwarg):
 284            key = arg.this.name.upper()
 285            round_key = kwarg_map.get(key)
 286            if round_key:
 287                round_args[round_key] = arg.expression
 288        else:
 289            if positional_idx < len(positional_keys):
 290                round_args[positional_keys[positional_idx]] = arg
 291                positional_idx += 1
 292
 293    expression = exp.Round(**round_args)
 294    expression.set("casts_non_integer_decimals", True)
 295    return expression
 296
 297
 298def _build_array_sort(args: list) -> exp.ArraySort:
 299    asc = seq_get(args, 1)
 300    nulls_first = seq_get(args, 2)
 301    if nulls_first is None and (asc is None or isinstance(asc, exp.Boolean)):
 302        nulls_first = exp.Boolean(this=asc is not None and not asc.this)
 303    return exp.ArraySort(this=seq_get(args, 0), asc=asc, nulls_first=nulls_first)
 304
 305
 306def _build_generator(args: list) -> exp.Generator:
 307    """
 308    Build Generator expression, unwrapping Snowflake's named parameters.
 309
 310    Maps ROWCOUNT => rowcount, TIMELIMIT => timelimit.
 311    """
 312    kwarg_map = {"ROWCOUNT": "rowcount", "TIMELIMIT": "timelimit"}
 313    gen_args = {}
 314
 315    positional_keys = ("rowcount", "timelimit")
 316
 317    for i, arg in enumerate(args):
 318        if isinstance(arg, exp.Kwarg):
 319            key = arg.this.name.upper()
 320            gen_key = kwarg_map.get(key)
 321            if gen_key:
 322                gen_args[gen_key] = arg.expression
 323        elif i < len(positional_keys):
 324            gen_args[positional_keys[i]] = arg
 325
 326    return exp.Generator(**gen_args)
 327
 328
 329def _show_parser(*args: t.Any, **kwargs: t.Any) -> t.Callable[[SnowflakeParser], exp.Show]:
 330    def _parse(self: SnowflakeParser) -> exp.Show:
 331        return self._parse_show_snowflake(*args, **kwargs)
 332
 333    return _parse
 334
 335
 336class SnowflakeParser(parser.Parser):
 337    IDENTIFY_PIVOT_STRINGS = True
 338    TYPED_LAMBDA_ARGS = True
 339    DEFAULT_SAMPLING_METHOD = "BERNOULLI"
 340    COLON_IS_VARIANT_EXTRACT = True
 341    JSON_EXTRACT_REQUIRES_JSON_EXPRESSION = True
 342    SUPPORTS_NTH_VALUE_FROM_MODIFIER = True
 343
 344    TYPE_TOKENS = {*parser.Parser.TYPE_TOKENS, TokenType.FILE}
 345    STRUCT_TYPE_TOKENS = {*parser.Parser.STRUCT_TYPE_TOKENS, TokenType.FILE}
 346    NESTED_TYPE_TOKENS = {*parser.Parser.NESTED_TYPE_TOKENS, TokenType.FILE}
 347
 348    ID_VAR_TOKENS = {
 349        *parser.Parser.ID_VAR_TOKENS,
 350        TokenType.EXCEPT,
 351        TokenType.INTEGRATION,
 352        TokenType.LATERAL,
 353        TokenType.MATCH_CONDITION,
 354        TokenType.PACKAGE,
 355        TokenType.POLICY,
 356        TokenType.POOL,
 357        TokenType.ROLE,
 358        TokenType.ROLLBACK,
 359        TokenType.RULE,
 360        TokenType.USING,
 361        TokenType.VOLUME,
 362    }
 363
 364    FUNC_TOKENS = parser.Parser.FUNC_TOKENS | {TokenType.ROLLBACK}
 365
 366    ALIAS_TOKENS = parser.Parser.ALIAS_TOKENS | {
 367        TokenType.INTEGRATION,
 368        TokenType.LATERAL,
 369        TokenType.PACKAGE,
 370        TokenType.POLICY,
 371        TokenType.POOL,
 372        TokenType.ROLE,
 373        TokenType.ROLLBACK,
 374        TokenType.RULE,
 375        TokenType.USING,
 376        TokenType.VOLUME,
 377    }
 378
 379    TABLE_ALIAS_TOKENS = (
 380        parser.Parser.TABLE_ALIAS_TOKENS
 381        | {
 382            TokenType.ANTI,
 383            TokenType.INTEGRATION,
 384            TokenType.PACKAGE,
 385            TokenType.POLICY,
 386            TokenType.POOL,
 387            TokenType.ROLE,
 388            TokenType.ROLLBACK,
 389            TokenType.RULE,
 390            TokenType.SEMI,
 391            TokenType.VOLUME,
 392            TokenType.WINDOW,
 393        }
 394    ) - {TokenType.MATCH_CONDITION}
 395
 396    COLON_PLACEHOLDER_TOKENS = ID_VAR_TOKENS | {TokenType.NUMBER}
 397
 398    NO_PAREN_FUNCTIONS = {
 399        **parser.Parser.NO_PAREN_FUNCTIONS,
 400        TokenType.LOCALTIME: exp.Localtime,
 401        # LOCALTIMESTAMP is a Snowflake alias of CURRENT_TIMESTAMP, like the parenthesised form in
 402        # FUNCTION_PARSERS. Only Snowflake treats it as such, so it must not map to Localtimestamp.
 403        TokenType.LOCALTIMESTAMP: exp.CurrentTimestamp,
 404        TokenType.CURRENT_TIME: exp.Localtime,
 405    }
 406
 407    RANGE_PARSERS = {
 408        **parser.Parser.RANGE_PARSERS,
 409        TokenType.RLIKE: lambda self, this: self.expression(
 410            exp.RegexpLike(this=this, expression=self._parse_bitwise(), full_match=True)
 411        ),
 412    }
 413
 414    FUNCTIONS = {
 415        **parser.Parser.FUNCTIONS,
 416        "CHARINDEX": lambda args: exp.StrPosition(
 417            this=seq_get(args, 1),
 418            substr=seq_get(args, 0),
 419            position=seq_get(args, 2),
 420            clamp_position=True,
 421        ),
 422        "ADD_MONTHS": lambda args: exp.AddMonths(
 423            this=seq_get(args, 0),
 424            expression=seq_get(args, 1),
 425            preserve_end_of_month=True,
 426        ),
 427        "APPROX_PERCENTILE": exp.ApproxQuantile.from_arg_list,
 428        "CURRENT_TIME": lambda args: exp.Localtime(this=seq_get(args, 0)),
 429        "APPROX_TOP_K": _build_approx_top_k,
 430        "ARRAY_CONSTRUCT": lambda args: exp.Array(expressions=args),
 431        "ARRAY_CONTAINS": lambda args: exp.ArrayContains(
 432            this=seq_get(args, 1),
 433            expression=seq_get(args, 0),
 434            ensure_variant=False,
 435            check_null=True,
 436        ),
 437        "ARRAY_DISTINCT": lambda args: exp.ArrayDistinct(
 438            this=seq_get(args, 0),
 439            check_null=True,
 440        ),
 441        "ARRAY_GENERATE_RANGE": lambda args: exp.GenerateSeries(
 442            # Snowflake has exclusive end semantics
 443            start=seq_get(args, 0),
 444            end=seq_get(args, 1),
 445            step=seq_get(args, 2),
 446            is_end_exclusive=True,
 447        ),
 448        "ARRAY_EXCEPT": lambda args: exp.ArrayExcept(
 449            this=seq_get(args, 0),
 450            expression=seq_get(args, 1),
 451            is_multiset=True,
 452        ),
 453        "ARRAY_INTERSECTION": lambda args: exp.ArrayIntersect(
 454            expressions=args,
 455            is_multiset=True,
 456        ),
 457        "ARRAY_POSITION": lambda args: exp.ArrayPosition(
 458            this=seq_get(args, 1),
 459            expression=seq_get(args, 0),
 460            zero_based=True,
 461        ),
 462        "ARRAY_SLICE": lambda args: exp.ArraySlice(
 463            this=seq_get(args, 0),
 464            start=seq_get(args, 1),
 465            end=seq_get(args, 2),
 466            zero_based=True,
 467        ),
 468        "ARRAY_SORT": _build_array_sort,
 469        "ARRAY_FLATTEN": exp.Flatten.from_arg_list,
 470        "ARRAY_TO_STRING": lambda args: exp.ArrayToString(
 471            this=seq_get(args, 0),
 472            expression=seq_get(args, 1),
 473            null_is_empty=True,
 474            null_delim_is_null=True,
 475        ),
 476        "ARRAYS_OVERLAP": lambda args: exp.ArrayOverlaps(
 477            this=seq_get(args, 0), expression=seq_get(args, 1), null_safe=True
 478        ),
 479        "BITAND": _build_bitwise(exp.BitwiseAnd, "BITAND"),
 480        "BIT_AND": _build_bitwise(exp.BitwiseAnd, "BITAND"),
 481        "BITNOT": lambda args: exp.BitwiseNot(this=seq_get(args, 0)),
 482        "BIT_NOT": lambda args: exp.BitwiseNot(this=seq_get(args, 0)),
 483        "BITXOR": _build_bitwise(exp.BitwiseXor, "BITXOR"),
 484        "BIT_XOR": _build_bitwise(exp.BitwiseXor, "BITXOR"),
 485        "BITOR": _build_bitwise(exp.BitwiseOr, "BITOR"),
 486        "BIT_OR": _build_bitwise(exp.BitwiseOr, "BITOR"),
 487        "BITSHIFTLEFT": _build_bitwise(exp.BitwiseLeftShift, "BITSHIFTLEFT"),
 488        "BIT_SHIFTLEFT": _build_bitwise(exp.BitwiseLeftShift, "BIT_SHIFTLEFT"),
 489        "BITSHIFTRIGHT": _build_bitwise(exp.BitwiseRightShift, "BITSHIFTRIGHT"),
 490        "BIT_SHIFTRIGHT": _build_bitwise(exp.BitwiseRightShift, "BIT_SHIFTRIGHT"),
 491        "BITANDAGG": exp.BitwiseAndAgg.from_arg_list,
 492        "BITAND_AGG": exp.BitwiseAndAgg.from_arg_list,
 493        "BIT_AND_AGG": exp.BitwiseAndAgg.from_arg_list,
 494        "BIT_ANDAGG": exp.BitwiseAndAgg.from_arg_list,
 495        "BITORAGG": exp.BitwiseOrAgg.from_arg_list,
 496        "BITOR_AGG": exp.BitwiseOrAgg.from_arg_list,
 497        "BIT_OR_AGG": exp.BitwiseOrAgg.from_arg_list,
 498        "BIT_ORAGG": exp.BitwiseOrAgg.from_arg_list,
 499        "BITXORAGG": exp.BitwiseXorAgg.from_arg_list,
 500        "BITXOR_AGG": exp.BitwiseXorAgg.from_arg_list,
 501        "BIT_XOR_AGG": exp.BitwiseXorAgg.from_arg_list,
 502        "BIT_XORAGG": exp.BitwiseXorAgg.from_arg_list,
 503        "BITMAP_OR_AGG": exp.BitmapOrAgg.from_arg_list,
 504        "BOOLAND": lambda args: exp.Booland(
 505            this=seq_get(args, 0), expression=seq_get(args, 1), round_input=True
 506        ),
 507        "BOOLOR": lambda args: exp.Boolor(
 508            this=seq_get(args, 0), expression=seq_get(args, 1), round_input=True
 509        ),
 510        "BOOLNOT": lambda args: exp.Boolnot(this=seq_get(args, 0), round_input=True),
 511        "BOOLXOR": lambda args: exp.Xor(
 512            this=seq_get(args, 0), expression=seq_get(args, 1), round_input=True
 513        ),
 514        "CORR": lambda args: exp.Corr(
 515            this=seq_get(args, 0),
 516            expression=seq_get(args, 1),
 517            null_on_zero_variance=True,
 518        ),
 519        "COUNT_IF": lambda args: exp.CountIf(this=seq_get(args, 0), zero_on_all_null=True),
 520        "DATE": _build_datetime("DATE", exp.DType.DATE),
 521        "DATEFROMPARTS": _build_date_from_parts,
 522        "DATE_FROM_PARTS": _build_date_from_parts,
 523        "DATE_TRUNC": _date_trunc_to_time,
 524        "DATEADD": lambda args: exp.DateAdd(
 525            this=seq_get(args, 2),
 526            expression=seq_get(args, 1),
 527            unit=map_date_part(seq_get(args, 0)),
 528        ),
 529        "DATEDIFF": lambda args: exp.DateDiff(
 530            this=seq_get(args, 2),
 531            expression=seq_get(args, 1),
 532            unit=map_date_part(seq_get(args, 0)),
 533            date_part_boundary=True,
 534        ),
 535        "DAYNAME": lambda args: exp.Dayname(this=seq_get(args, 0), abbreviated=True),
 536        "DAYOFWEEKISO": exp.DayOfWeekIso.from_arg_list,
 537        "DIV0": _build_if_from_div0,
 538        "DIV0NULL": _build_if_from_div0null,
 539        "EDITDISTANCE": lambda args: exp.Levenshtein(
 540            this=seq_get(args, 0), expression=seq_get(args, 1), max_dist=seq_get(args, 2)
 541        ),
 542        "FLATTEN": exp.Explode.from_arg_list,
 543        "GENERATOR": _build_generator,
 544        "GET": exp.GetExtract.from_arg_list,
 545        "GETDATE": exp.CurrentTimestamp.from_arg_list,
 546        "GET_PATH": lambda args, dialect: exp.JSONExtract(
 547            this=seq_get(args, 0),
 548            expression=dialect.to_json_path(seq_get(args, 1)),
 549            requires_json=True,
 550        ),
 551        "GREATEST_IGNORE_NULLS": lambda args: exp.Greatest(
 552            this=seq_get(args, 0), expressions=args[1:], ignore_nulls=True
 553        ),
 554        "LEAST_IGNORE_NULLS": lambda args: exp.Least(
 555            this=seq_get(args, 0), expressions=args[1:], ignore_nulls=True
 556        ),
 557        "LEFT": lambda args: exp.Left(
 558            this=seq_get(args, 0), expression=seq_get(args, 1), negative_length_returns_empty=True
 559        ),
 560        "HEX_DECODE_BINARY": exp.Unhex.from_arg_list,
 561        "HEX_ENCODE": exp.Hex.from_arg_list,
 562        "IFF": exp.If.from_arg_list,
 563        "JAROWINKLER_SIMILARITY": lambda args: exp.JarowinklerSimilarity(
 564            this=seq_get(args, 0),
 565            expression=seq_get(args, 1),
 566            case_insensitive=True,
 567            integer_scale=True,
 568        ),
 569        "MD5_HEX": exp.MD5.from_arg_list,
 570        "MD5_BINARY": exp.MD5Digest.from_arg_list,
 571        "MD5_NUMBER_LOWER64": exp.MD5NumberLower64.from_arg_list,
 572        "MD5_NUMBER_UPPER64": exp.MD5NumberUpper64.from_arg_list,
 573        "MONTHNAME": lambda args: exp.Monthname(this=seq_get(args, 0), abbreviated=True),
 574        "LAST_DAY": lambda args: exp.LastDay(
 575            this=seq_get(args, 0), unit=map_date_part(seq_get(args, 1))
 576        ),
 577        "LEN": lambda args: exp.Length(this=seq_get(args, 0), binary=True),
 578        "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True),
 579        "LOCALTIMESTAMP": exp.CurrentTimestamp.from_arg_list,
 580        "NULLIFZERO": _build_if_from_nullifzero,
 581        "OBJECT_CONSTRUCT": lambda args: build_object_construct(args),
 582        "OBJECT_KEYS": exp.JSONKeys.from_arg_list,
 583        "OCTET_LENGTH": exp.ByteLength.from_arg_list,
 584        "PARSE_URL": lambda args: exp.ParseUrl(this=seq_get(args, 0), permissive=seq_get(args, 1)),
 585        "REGEXP_EXTRACT_ALL": _build_regexp_extract(exp.RegexpExtractAll),
 586        "REGEXP_LIKE": _build_regexp_like,
 587        "REGEXP_REPLACE": _build_regexp_replace,
 588        "REGEXP_SUBSTR": _build_regexp_extract(exp.RegexpExtract),
 589        "REGEXP_SUBSTR_ALL": _build_regexp_extract(exp.RegexpExtractAll),
 590        "RANDOM": lambda args: exp.Rand(
 591            this=seq_get(args, 0),
 592            lower=exp.Literal.number(-9223372036854775808.0),  # -2^63 as float to avoid overflow
 593            upper=exp.Literal.number(9223372036854775807.0),  # 2^63-1 as float
 594        ),
 595        "REPLACE": build_replace_with_optional_replacement,
 596        "RIGHT": lambda args: exp.Right(
 597            this=seq_get(args, 0), expression=seq_get(args, 1), negative_length_returns_empty=True
 598        ),
 599        "RLIKE": _build_regexp_like,
 600        "ROUND": _build_round,
 601        "SHA1_BINARY": exp.SHA1Digest.from_arg_list,
 602        "SHA1_HEX": exp.SHA.from_arg_list,
 603        "SHA2_BINARY": exp.SHA2Digest.from_arg_list,
 604        "SHA2_HEX": exp.SHA2.from_arg_list,
 605        "SPLIT": lambda args: exp.Split(
 606            this=seq_get(args, 0),
 607            expression=seq_get(args, 1),
 608            null_returns_null=True,
 609            empty_delimiter_returns_whole=True,
 610        ),
 611        "SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)),
 612        "STDDEV_SAMP": exp.Stddev.from_arg_list,
 613        "SYSDATE": lambda args: exp.CurrentTimestamp(this=seq_get(args, 0), sysdate=True),
 614        "TABLE": lambda args: exp.TableFromRows(this=seq_get(args, 0)),
 615        "TIMEADD": lambda args: exp.TimeAdd(
 616            this=seq_get(args, 2),
 617            expression=seq_get(args, 1),
 618            unit=map_date_part(seq_get(args, 0)),
 619        ),
 620        "TIMEDIFF": lambda args: exp.DateDiff(
 621            this=seq_get(args, 2),
 622            expression=seq_get(args, 1),
 623            unit=map_date_part(seq_get(args, 0)),
 624            date_part_boundary=True,
 625        ),
 626        "TIME_FROM_PARTS": lambda args: exp.TimeFromParts(
 627            hour=seq_get(args, 0),
 628            min=seq_get(args, 1),
 629            sec=seq_get(args, 2),
 630            nano=seq_get(args, 3),
 631            overflow=True,
 632        ),
 633        "TIMESTAMPADD": lambda args: exp.DateAdd(
 634            this=seq_get(args, 2),
 635            expression=seq_get(args, 1),
 636            unit=map_date_part(seq_get(args, 0)),
 637        ),
 638        "TIMESTAMPDIFF": lambda args: exp.DateDiff(
 639            this=seq_get(args, 2),
 640            expression=seq_get(args, 1),
 641            unit=map_date_part(seq_get(args, 0)),
 642            date_part_boundary=True,
 643        ),
 644        "TIMESTAMPFROMPARTS": _build_timestamp_from_parts,
 645        "TIMESTAMP_FROM_PARTS": _build_timestamp_from_parts,
 646        "TIMESTAMPNTZFROMPARTS": _build_timestamp_from_parts,
 647        "TIMESTAMP_NTZ_FROM_PARTS": _build_timestamp_from_parts,
 648        "TRUNC": _build_trunc,
 649        "TRUNCATE": _build_trunc,
 650        "TRY_DECRYPT": lambda args: exp.Decrypt(
 651            this=seq_get(args, 0),
 652            passphrase=seq_get(args, 1),
 653            aad=seq_get(args, 2),
 654            encryption_method=seq_get(args, 3),
 655            safe=True,
 656        ),
 657        "TRY_DECRYPT_RAW": lambda args: exp.DecryptRaw(
 658            this=seq_get(args, 0),
 659            key=seq_get(args, 1),
 660            iv=seq_get(args, 2),
 661            aad=seq_get(args, 3),
 662            encryption_method=seq_get(args, 4),
 663            aead=seq_get(args, 5),
 664            safe=True,
 665        ),
 666        "TRY_PARSE_JSON": lambda args: exp.ParseJSON(this=seq_get(args, 0), safe=True),
 667        "TRY_TO_BINARY": lambda args: exp.ToBinary(
 668            this=seq_get(args, 0), format=seq_get(args, 1), safe=True
 669        ),
 670        "TRY_TO_BOOLEAN": lambda args: exp.ToBoolean(this=seq_get(args, 0), safe=True),
 671        "TRY_TO_DATE": _build_datetime("TRY_TO_DATE", exp.DType.DATE, safe=True),
 672        **dict.fromkeys(
 673            ("TRY_TO_DECIMAL", "TRY_TO_NUMBER", "TRY_TO_NUMERIC"),
 674            lambda args: _build_to_number(args, safe=True),
 675        ),
 676        "TRY_TO_DOUBLE": lambda args: exp.ToDouble(
 677            this=seq_get(args, 0), format=seq_get(args, 1), safe=True
 678        ),
 679        "TRY_TO_FILE": lambda args: exp.ToFile(
 680            this=seq_get(args, 0), path=seq_get(args, 1), safe=True
 681        ),
 682        "TRY_TO_TIME": _build_datetime("TRY_TO_TIME", exp.DType.TIME, safe=True),
 683        "TRY_TO_TIMESTAMP": _build_datetime("TRY_TO_TIMESTAMP", exp.DType.TIMESTAMP, safe=True),
 684        "TRY_TO_TIMESTAMP_LTZ": _build_datetime(
 685            "TRY_TO_TIMESTAMP_LTZ", exp.DType.TIMESTAMPLTZ, safe=True
 686        ),
 687        "TRY_TO_TIMESTAMP_NTZ": _build_datetime(
 688            "TRY_TO_TIMESTAMP_NTZ", exp.DType.TIMESTAMPNTZ, safe=True
 689        ),
 690        "TRY_TO_TIMESTAMP_TZ": _build_datetime(
 691            "TRY_TO_TIMESTAMP_TZ", exp.DType.TIMESTAMPTZ, safe=True
 692        ),
 693        "TO_CHAR": build_timetostr_or_tochar,
 694        "TO_DATE": _build_datetime("TO_DATE", exp.DType.DATE),
 695        **dict.fromkeys(
 696            ("TO_DECIMAL", "TO_NUMBER", "TO_NUMERIC"),
 697            lambda args: _build_to_number(args),
 698        ),
 699        "TO_TIME": _build_datetime("TO_TIME", exp.DType.TIME),
 700        "TO_TIMESTAMP": _build_datetime("TO_TIMESTAMP", exp.DType.TIMESTAMP),
 701        "TO_TIMESTAMP_LTZ": _build_datetime("TO_TIMESTAMP_LTZ", exp.DType.TIMESTAMPLTZ),
 702        "TO_TIMESTAMP_NTZ": _build_datetime("TO_TIMESTAMP_NTZ", exp.DType.TIMESTAMPNTZ),
 703        "TO_TIMESTAMP_TZ": _build_datetime("TO_TIMESTAMP_TZ", exp.DType.TIMESTAMPTZ),
 704        "TO_GEOGRAPHY": lambda args: (
 705            exp.cast(args[0], exp.DType.GEOGRAPHY)
 706            if len(args) == 1
 707            else exp.Anonymous(this="TO_GEOGRAPHY", expressions=args)
 708        ),
 709        "TO_GEOMETRY": lambda args: (
 710            exp.cast(args[0], exp.DType.GEOMETRY)
 711            if len(args) == 1
 712            else exp.Anonymous(this="TO_GEOMETRY", expressions=args)
 713        ),
 714        "TO_VARCHAR": build_timetostr_or_tochar,
 715        "TO_JSON": exp.JSONFormat.from_arg_list,
 716        "VECTOR_COSINE_SIMILARITY": exp.CosineDistance.from_arg_list,
 717        "VECTOR_INNER_PRODUCT": exp.DotProduct.from_arg_list,
 718        "VECTOR_L1_DISTANCE": exp.ManhattanDistance.from_arg_list,
 719        "VECTOR_L2_DISTANCE": exp.EuclideanDistance.from_arg_list,
 720        "ZEROIFNULL": _build_if_from_zeroifnull,
 721        "LIKE": build_like(exp.Like),
 722        "ILIKE": build_like(exp.ILike),
 723        "SEARCH": _build_search,
 724        "SKEW": exp.Skewness.from_arg_list,
 725        "SPLIT_PART": lambda args: exp.SplitPart(
 726            this=seq_get(args, 0),
 727            delimiter=seq_get(args, 1),
 728            part_index=seq_get(args, 2),
 729            part_index_zero_as_one=True,
 730            empty_delimiter_returns_whole=True,
 731        ),
 732        "STRTOK": lambda args: exp.Strtok(
 733            this=seq_get(args, 0),
 734            delimiter=seq_get(args, 1) or exp.Literal.string(" "),
 735            part_index=seq_get(args, 2) or exp.Literal.number("1"),
 736        ),
 737        "STRTOK_TO_ARRAY": lambda args: exp.StrtokToArray(
 738            this=seq_get(args, 0),
 739            expression=seq_get(args, 1) or exp.Literal.string(" "),
 740        ),
 741        "SYSTIMESTAMP": exp.CurrentTimestamp.from_arg_list,
 742        "IDENTIFIER": exp.DynamicIdentifier.from_arg_list,
 743        "UNICODE": lambda args: exp.Unicode(this=seq_get(args, 0), empty_is_zero=True),
 744        "WEEKISO": exp.WeekOfYear.from_arg_list,
 745        "WEEKOFYEAR": exp.Week.from_arg_list,
 746    }
 747    FUNCTIONS = {k: v for k, v in FUNCTIONS.items() if k != "PREDICT"}
 748
 749    FUNCTION_PARSERS = {
 750        **parser.Parser.FUNCTION_PARSERS,
 751        "DATE_PART": lambda self: self._parse_date_part(),
 752        "DIRECTORY": lambda self: self._parse_directory(),
 753        "OBJECT_CONSTRUCT_KEEP_NULL": lambda self: self._parse_object_construct_keep_null(),
 754        "LISTAGG": lambda self: self._parse_listagg(),
 755        "SEMANTIC_VIEW": lambda self: self._parse_semantic_view(),
 756        "SUBSTR": lambda self: self._parse_substring(),
 757    }
 758    FUNCTION_PARSERS = {k: v for k, v in FUNCTION_PARSERS.items() if k != "TRIM"}
 759
 760    TIMESTAMPS = parser.Parser.TIMESTAMPS - {TokenType.TIME}
 761
 762    ALTER_PARSERS = {
 763        **parser.Parser.ALTER_PARSERS,
 764        "MODIFY": lambda self: self._parse_alter_table_alter(),
 765        "SESSION": lambda self: self._parse_alter_session(),
 766        "UNSET": lambda self: self.expression(
 767            exp.Set(
 768                tag=self._match_text_seq("TAG"),
 769                expressions=self._parse_csv(self._parse_id_var),
 770                unset=True,
 771            )
 772        ),
 773    }
 774
 775    STATEMENT_PARSERS = {
 776        **{
 777            k: v
 778            for k, v in parser.Parser.STATEMENT_PARSERS.items()
 779            if k not in (TokenType.PIVOT, TokenType.UNPIVOT)
 780        },
 781        TokenType.GET: lambda self: self._parse_get(),
 782        TokenType.LIST: lambda self: self._parse_list_stage(),
 783        TokenType.PUT: lambda self: self._parse_put(),
 784        TokenType.SHOW: lambda self: self._parse_show(),
 785        TokenType.UNDROP: lambda self: self._parse_undrop(),
 786    }
 787
 788    PROPERTY_PARSERS = {
 789        **parser.Parser.PROPERTY_PARSERS,
 790        "CREDENTIALS": lambda self: self._parse_credentials_property(),
 791        "FILE_FORMAT": lambda self: self._parse_file_format_property(),
 792        "IGNORE": lambda self: self._parse_ignore_property(),
 793        "INTERACTIVE": lambda self: self.expression(exp.InteractiveProperty()),
 794        "LOCATION": lambda self: self._parse_location_property(),
 795        "ROW": lambda self: (
 796            self._parse_row_access_policy()
 797            if self._match_text_seq("ACCESS", "POLICY")
 798            else self._parse_row()
 799        ),
 800        "SCOPED": lambda self: (
 801            self._match_texts(("TEMP", "TEMPORARY"))
 802            and self.expression(exp.TemporaryProperty(scoped=True))
 803        ),
 804        "TAG": lambda self: self._parse_tag(),
 805        "USING": lambda self: (
 806            self._match_text_seq("TEMPLATE")
 807            and self.expression(exp.UsingTemplateProperty(this=self._parse_statement()))
 808        ),
 809    }
 810
 811    DESCRIBE_QUALIFIER_PARSERS: t.ClassVar[dict[str, t.Callable]] = {
 812        "API": lambda self: self.expression(exp.ApiProperty()),
 813        "APPLICATION": lambda self: self.expression(exp.ApplicationProperty()),
 814        "CATALOG": lambda self: self.expression(exp.CatalogProperty()),
 815        "COMPUTE": lambda self: self.expression(exp.ComputeProperty()),
 816        "DATABASE": lambda self: (
 817            self.expression(exp.DatabaseProperty())
 818            if self._curr and self._curr.text.upper() == "ROLE"
 819            else None
 820        ),
 821        "DYNAMIC": lambda self: self.expression(exp.DynamicProperty()),
 822        "EXTERNAL": lambda self: self.expression(exp.ExternalProperty()),
 823        "HYBRID": lambda self: self.expression(exp.HybridProperty()),
 824        "ICEBERG": lambda self: self.expression(exp.IcebergProperty()),
 825        "MASKING": lambda self: self.expression(exp.MaskingProperty()),
 826        "MATERIALIZED": lambda self: self.expression(exp.MaterializedProperty()),
 827        "NETWORK": lambda self: self.expression(exp.NetworkProperty()),
 828        "ROW": lambda self: (
 829            self.expression(exp.RowAccessProperty()) if self._match_text_seq("ACCESS") else None
 830        ),
 831        "SECURITY": lambda self: (
 832            self.expression(exp.SecurityIntegrationProperty())
 833            if self._curr and self._curr.text.upper() == "INTEGRATION"
 834            else None
 835        ),
 836    }
 837
 838    TYPE_CONVERTERS = {
 839        # https://docs.snowflake.com/en/sql-reference/data-types-numeric#number
 840        exp.DType.DECIMAL: build_default_decimal_type(precision=38, scale=0),
 841    }
 842
 843    SHOW_PARSERS = {
 844        "DATABASES": _show_parser("DATABASES"),
 845        "SCHEMAS": _show_parser("SCHEMAS"),
 846        "OBJECTS": _show_parser("OBJECTS"),
 847        "TABLES": _show_parser("TABLES"),
 848        "VIEWS": _show_parser("VIEWS"),
 849        "PRIMARY KEYS": _show_parser("PRIMARY KEYS"),
 850        "IMPORTED KEYS": _show_parser("IMPORTED KEYS"),
 851        "UNIQUE KEYS": _show_parser("UNIQUE KEYS"),
 852        "SEQUENCES": _show_parser("SEQUENCES"),
 853        "STAGES": _show_parser("STAGES"),
 854        "COLUMNS": _show_parser("COLUMNS"),
 855        "USERS": _show_parser("USERS"),
 856        "FILE FORMATS": _show_parser("FILE FORMATS"),
 857        "FUNCTIONS": _show_parser("FUNCTIONS"),
 858        "PROCEDURES": _show_parser("PROCEDURES"),
 859        "WAREHOUSES": _show_parser("WAREHOUSES"),
 860        "ICEBERG TABLES": _show_parser("TABLES", iceberg=True),
 861        "TERSE ICEBERG TABLES": _show_parser("TABLES", terse=True, iceberg=True),
 862        "TERSE DATABASES": _show_parser("DATABASES", terse=True),
 863        "TERSE SCHEMAS": _show_parser("SCHEMAS", terse=True),
 864        "TERSE OBJECTS": _show_parser("OBJECTS", terse=True),
 865        "TERSE TABLES": _show_parser("TABLES", terse=True),
 866        "TERSE VIEWS": _show_parser("VIEWS", terse=True),
 867        "TERSE SEQUENCES": _show_parser("SEQUENCES", terse=True),
 868        "TERSE USERS": _show_parser("USERS", terse=True),
 869        # TERSE has no semantic effect for KEYS, so we do not set the terse AST arg
 870        "TERSE PRIMARY KEYS": _show_parser("PRIMARY KEYS"),
 871        "TERSE IMPORTED KEYS": _show_parser("IMPORTED KEYS"),
 872        "TERSE UNIQUE KEYS": _show_parser("UNIQUE KEYS"),
 873    }
 874
 875    SHOW_TRIE = new_trie(key.split(" ") for key in SHOW_PARSERS)
 876
 877    SCHEMA_UNNAMED_CONSTRAINTS = parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS - {"EXCLUDE"}
 878
 879    CONSTRAINT_PARSERS = {
 880        **parser.Parser.CONSTRAINT_PARSERS,
 881        "WITH": lambda self: self._parse_with_constraint(),
 882        "MASKING": lambda self: self._parse_with_constraint(),
 883        "PROJECTION": lambda self: self._parse_with_constraint(),
 884        "TAG": lambda self: self._parse_with_constraint(),
 885    }
 886
 887    STAGED_FILE_SINGLE_TOKENS: t.ClassVar = {
 888        TokenType.DOT,
 889        TokenType.MOD,
 890        TokenType.SLASH,
 891    }
 892
 893    FLATTEN_COLUMNS: t.ClassVar = ["SEQ", "KEY", "PATH", "INDEX", "VALUE", "THIS"]
 894
 895    SCHEMA_KINDS: t.ClassVar = {
 896        "OBJECTS",
 897        "TABLES",
 898        "VIEWS",
 899        "SEQUENCES",
 900        "UNIQUE KEYS",
 901        "IMPORTED KEYS",
 902    }
 903
 904    NON_TABLE_CREATABLES: t.ClassVar = {"STORAGE INTEGRATION", "TAG", "WAREHOUSE", "STREAMLIT"}
 905
 906    UNDROP_OBJECTS: t.ClassVar[parser.OPTIONS_TYPE] = {
 907        **dict.fromkeys(
 908            (
 909                "ACCOUNT",
 910                "DATABASE",
 911                "NOTEBOOK",
 912                "SCHEMA",
 913                "SNAPSHOT",
 914                "STREAMLIT",
 915                "TABLE",
 916                "TAG",
 917                "TYPE",
 918            ),
 919            tuple(),
 920        ),
 921        "DYNAMIC": ("TABLE",),
 922        "EXTERNAL": ("VOLUME",),
 923        "ICEBERG": ("TABLE",),
 924    }
 925
 926    CREATABLES = {
 927        *parser.Parser.CREATABLES,
 928        TokenType.INTEGRATION,
 929        TokenType.PACKAGE,
 930        TokenType.POLICY,
 931        TokenType.POOL,
 932        TokenType.ROLE,
 933        TokenType.RULE,
 934        TokenType.VOLUME,
 935    }
 936
 937    LAMBDAS = {
 938        **parser.Parser.LAMBDAS,
 939        TokenType.ARROW: lambda self, expressions: self.expression(
 940            exp.Lambda(
 941                this=self._replace_lambda(
 942                    self._parse_assignment(),
 943                    expressions,
 944                ),
 945                expressions=[e.this if isinstance(e, exp.Cast) else e for e in expressions],
 946            )
 947        ),
 948    }
 949
 950    COLUMN_OPERATORS = {
 951        **parser.Parser.COLUMN_OPERATORS,
 952        TokenType.EXCLAMATION: lambda self, this, attr: self.expression(
 953            exp.ModelAttribute(this=this, expression=attr)
 954        ),
 955    }
 956
 957    def _parse_directory(self) -> exp.DirectoryStage:
 958        table = self._parse_table_parts()
 959        this = table.this if isinstance(table, exp.Table) else table
 960        return self.expression(exp.DirectoryStage(this=this))
 961
 962    def _parse_describe(self) -> exp.Describe:
 963        index = self._index
 964
 965        if self._match_texts(self.DESCRIBE_QUALIFIER_PARSERS):
 966            qualifier = self.DESCRIBE_QUALIFIER_PARSERS[self._prev.text.upper()](self)
 967
 968            if qualifier:
 969                kind = self._match_set(self.CREATABLES) and self._prev.text.upper()
 970
 971                if kind:
 972                    this = self._parse_table(schema=True)
 973                    properties = self.expression(exp.Properties(expressions=[qualifier]))
 974                    post_props = self._parse_properties()
 975                    expressions = post_props.expressions if post_props else None
 976                    return self.expression(
 977                        exp.Describe(
 978                            this=this,
 979                            kind=kind,
 980                            properties=properties,
 981                            expressions=expressions,
 982                        )
 983                    )
 984
 985        self._retreat(index)
 986        return super()._parse_describe()
 987
 988    def _parse_use(self) -> exp.Use:
 989        if self._match_text_seq("SECONDARY", "ROLES"):
 990            this = self._match_texts(("ALL", "NONE")) and exp.var(self._prev.text.upper())
 991            roles = None if this else self._parse_csv(lambda: self._parse_table(schema=False))
 992            return self.expression(exp.Use(kind="SECONDARY ROLES", this=this, expressions=roles))
 993
 994        return super()._parse_use()
 995
 996    def _negate_range(self, this: exp.Expr | None = None) -> exp.Expr | None:
 997        if not this:
 998            return this
 999
1000        query = this.args.get("query")
1001        if isinstance(this, exp.In) and isinstance(query, exp.Query):
1002            # Snowflake treats `value NOT IN (subquery)` as `VALUE <> ALL (subquery)`, so
1003            # we do this conversion here to avoid parsing it into `NOT value IN (subquery)`
1004            # which can produce different results (most likely a SnowFlake bug).
1005            #
1006            # https://docs.snowflake.com/en/sql-reference/functions/in
1007            # Context: https://github.com/tobymao/sqlglot/issues/3890
1008            return self.expression(exp.NEQ(this=this.this, expression=exp.All(this=query.unnest())))
1009
1010        return self.expression(exp.Not(this=this))
1011
1012    def _parse_copy_property(self) -> exp.Property | None:
1013        if self._match_text_seq("TAGS"):
1014            return self.expression(exp.CopyTagsProperty())
1015        return super()._parse_copy_property()
1016
1017    def _parse_ignore_property(self) -> exp.Property | None:
1018        if not self._match_text_seq("GRANTS"):
1019            self._retreat(self._index - 1)
1020            return None
1021
1022        return self.expression(exp.IgnoreGrantsProperty())
1023
1024    def _parse_tag(self) -> exp.Tags:
1025        return self.expression(exp.Tags(expressions=self._parse_wrapped_csv(self._parse_property)))
1026
1027    def _parse_property_before(self) -> exp.Expr | list[exp.Expr] | None:
1028        prop = super()._parse_property_before()
1029        if prop:
1030            return prop
1031
1032        if not self._next or self._next.token_type != TokenType.EQ:
1033            return None
1034
1035        return self._parse_sequence_properties() or self._parse_key_value_property(
1036            self._parse_primary_or_var
1037        )
1038
1039    def _parse_with_constraint(self) -> exp.Expr | None:
1040        if self._prev.token_type != TokenType.WITH:
1041            self._retreat(self._index - 1)
1042
1043        if self._match_text_seq("MASKING", "POLICY"):
1044            policy = self._parse_column()
1045            return self.expression(
1046                exp.MaskingPolicyColumnConstraint(
1047                    this=policy.to_dot() if isinstance(policy, exp.Column) else policy,
1048                    expressions=self._match(TokenType.USING)
1049                    and self._parse_wrapped_csv(self._parse_id_var),
1050                )
1051            )
1052        if self._match_text_seq("PROJECTION", "POLICY"):
1053            policy = self._parse_column()
1054            return self.expression(
1055                exp.ProjectionPolicyColumnConstraint(
1056                    this=policy.to_dot() if isinstance(policy, exp.Column) else policy
1057                )
1058            )
1059        if self._match(TokenType.TAG):
1060            return self._parse_tag()
1061
1062        return None
1063
1064    def _parse_with_property(self) -> exp.Expr | None | list[exp.Expr]:
1065        if self._match(TokenType.TAG):
1066            return self._parse_tag()
1067
1068        if self._match_text_seq("ROW", "ACCESS", "POLICY"):
1069            return self._parse_row_access_policy()
1070
1071        return super()._parse_with_property()
1072
1073    def _parse_row_access_policy(self) -> exp.RowAccessProperty:
1074        # GET_DDL outputs #unknown_policy when the user lacks privileges to see the policy name
1075        if self._match(TokenType.HASH):
1076            policy: exp.Expr | None = self._parse_var(any_token=True)
1077            if policy:
1078                policy = exp.Var(this=f"#{policy.name}")
1079            expressions = None
1080        else:
1081            policy = self._parse_column()
1082            if isinstance(policy, exp.Column):
1083                policy = policy.to_dot()
1084            if not self._match(TokenType.ON):
1085                self.raise_error("Expected ON after ROW ACCESS POLICY name")
1086            expressions = self._parse_wrapped_csv(self._parse_id_var)
1087
1088        return self.expression(exp.RowAccessProperty(this=policy, expressions=expressions))
1089
1090    def _parse_create(self) -> exp.Create | exp.Command:
1091        expression = super()._parse_create()
1092        if isinstance(expression, exp.Create) and expression.kind in self.NON_TABLE_CREATABLES:
1093            # Replace the Table node with the enclosed Identifier
1094            expression.this.replace(expression.this.this)
1095
1096        return expression
1097
1098    def _parse_listagg(self) -> exp.GroupConcat:
1099        expression = self._parse_string_agg()
1100        if expression.args.get("separator") is None:
1101            expression.set("separator", exp.Literal.string(""))
1102        return expression
1103
1104    def _parse_object_construct_keep_null(self) -> exp.JSONObject:
1105        index = self._index
1106        column = self._parse_column()
1107        if column and column.is_star:
1108            return self.expression(exp.JSONObject(expressions=[column]))
1109
1110        self._retreat(index)
1111        return self._parse_json_object(agg=False)
1112
1113    # https://docs.snowflake.com/en/sql-reference/functions/date_part.html
1114    # https://docs.snowflake.com/en/sql-reference/functions-date-time.html#label-supported-date-time-parts
1115    def _parse_date_part(self) -> exp.Expr | None:
1116        this = self._parse_var() or self._parse_type()
1117
1118        if not this:
1119            return None
1120
1121        # Handle both syntaxes: DATE_PART(part, expr) and DATE_PART(part FROM expr)
1122        expression = self._match_set((TokenType.FROM, TokenType.COMMA)) and self._parse_bitwise()
1123        return self.expression(
1124            exp.Extract(this=map_date_part(this, self.dialect), expression=expression)
1125        )
1126
1127    def _parse_bracket_key_value(self, is_map: bool = False) -> exp.Expr | None:
1128        if is_map:
1129            # Keys are strings in Snowflake's objects, see also:
1130            # - https://docs.snowflake.com/en/sql-reference/data-types-semistructured
1131            # - https://docs.snowflake.com/en/sql-reference/functions/object_construct
1132            return self._parse_slice(self._parse_string()) or self._parse_assignment()
1133
1134        return self._parse_slice(self._parse_alias(self._parse_assignment(), explicit=True))
1135
1136    def _parse_lateral(self) -> exp.Lateral | None:
1137        lateral = super()._parse_lateral()
1138        if not lateral:
1139            return lateral
1140
1141        if isinstance(lateral.this, exp.Explode):
1142            table_alias = lateral.args.get("alias")
1143            columns = [exp.to_identifier(col) for col in self.FLATTEN_COLUMNS]
1144            if table_alias and not table_alias.args.get("columns"):
1145                table_alias.set("columns", columns)
1146            elif not table_alias:
1147                exp.alias_(lateral, "_flattened", table=columns, copy=False)
1148
1149        return lateral
1150
1151    def _parse_table_parts(
1152        self,
1153        schema: bool = False,
1154        is_db_reference: bool = False,
1155        wildcard: bool = False,
1156        fast: bool = False,
1157    ) -> exp.Table | exp.Dot | None:
1158        # https://docs.snowflake.com/en/user-guide/querying-stage
1159        if self._match(TokenType.STRING, advance=False):
1160            table = self._parse_string()
1161        elif self._match_text_seq("@", advance=False):
1162            table = self._parse_location_path()
1163        else:
1164            table = None
1165
1166        if table:
1167            file_format = None
1168            pattern = None
1169
1170            wrapped = self._match(TokenType.L_PAREN)
1171            while self._curr and wrapped and not self._match(TokenType.R_PAREN):
1172                if self._match_text_seq("FILE_FORMAT", "=>"):
1173                    file_format = self._parse_string() or super()._parse_table_parts(
1174                        is_db_reference=is_db_reference
1175                    )
1176                elif self._match_text_seq("PATTERN", "=>"):
1177                    pattern = self._parse_string()
1178                else:
1179                    break
1180
1181                self._match(TokenType.COMMA)
1182
1183            table = self.expression(exp.Table(this=table, format=file_format, pattern=pattern))
1184        else:
1185            table = super()._parse_table_parts(
1186                schema=schema,
1187                is_db_reference=is_db_reference,
1188                fast=fast,
1189            )
1190
1191        return table
1192
1193    def _parse_function_call(
1194        self,
1195        functions: dict[str, t.Callable] | None = None,
1196        anonymous: bool = False,
1197        optional_parens: bool = True,
1198        any_token: bool = False,
1199    ) -> exp.Expr | None:
1200        this = super()._parse_function_call(
1201            functions=functions,
1202            anonymous=anonymous,
1203            optional_parens=optional_parens,
1204            any_token=any_token,
1205        )
1206
1207        # Snowflake can invoke a function whose name is dynamically resolved, e.g.
1208        # `IDENTIFIER('my_func')(1, 2)`. The trailing argument list is the call's arguments.
1209        #
1210        # https://docs.snowflake.com/en/sql-reference/identifier-literal
1211        if isinstance(this, exp.DynamicIdentifier) and self._match(
1212            TokenType.L_PAREN, advance=False
1213        ):
1214            this.set("expressions", self._parse_wrapped_csv(self._parse_lambda))
1215
1216        return this
1217
1218    def _parse_id_var(
1219        self,
1220        any_token: bool = True,
1221        tokens: Collection[TokenType] | None = None,
1222    ) -> exp.Expr | None:
1223        if self._match_text_seq("IDENTIFIER", "("):
1224            identifier = (
1225                super()._parse_id_var(any_token=any_token, tokens=tokens) or self._parse_string()
1226            )
1227            self._match_r_paren()
1228            return self.expression(exp.DynamicIdentifier(this=identifier))
1229
1230        return super()._parse_id_var(any_token=any_token, tokens=tokens)
1231
1232    def _parse_show_snowflake(
1233        self, this: str, terse: bool = False, iceberg: bool = False
1234    ) -> exp.Show:
1235        scope = None
1236        scope_kind = None
1237
1238        history = self._match_text_seq("HISTORY")
1239
1240        like = self._parse_string() if self._match(TokenType.LIKE) else None
1241
1242        if self._match(TokenType.IN):
1243            if self._match_text_seq("ACCOUNT"):
1244                scope_kind = "ACCOUNT"
1245            elif self._match_text_seq("CLASS"):
1246                scope_kind = "CLASS"
1247                scope = self._parse_table_parts()
1248            elif self._match_text_seq("APPLICATION"):
1249                scope_kind = "APPLICATION"
1250                if self._match_text_seq("PACKAGE"):
1251                    scope_kind += " PACKAGE"
1252                scope = self._parse_table_parts()
1253            elif self._match_set(self.DB_CREATABLES):
1254                scope_kind = self._prev.text.upper()
1255                if self._curr:
1256                    scope = self._parse_table_parts()
1257            elif self._curr:
1258                scope_kind = "SCHEMA" if this in self.SCHEMA_KINDS else "TABLE"
1259                scope = self._parse_table_parts()
1260
1261        return self.expression(
1262            exp.Show(
1263                terse=terse,
1264                iceberg=iceberg,
1265                this=this,
1266                history=history,
1267                like=like,
1268                scope=scope,
1269                scope_kind=scope_kind,
1270                starts_with=self._match_text_seq("STARTS", "WITH") and self._parse_string(),
1271                limit=self._parse_limit(),
1272                from_=self._parse_string() if self._match(TokenType.FROM) else None,
1273                privileges=self._match_text_seq("WITH", "PRIVILEGES")
1274                and self._parse_csv(lambda: self._parse_var(any_token=True, upper=True)),
1275            )
1276        )
1277
1278    def _parse_undrop(self) -> exp.Undrop | exp.Command:
1279        start = self._prev
1280        kind = self._parse_var_from_options(self.UNDROP_OBJECTS, raise_unmatched=False)
1281        if not kind:
1282            return self._parse_as_command(start)
1283
1284        this = self._parse_table_parts(
1285            is_db_reference=kind.name in ("ACCOUNT", "DATABASE", "SCHEMA")
1286        )
1287        rename = self._parse_table_parts() if self._match_text_seq("RENAME", "TO") else None
1288        return self.expression(exp.Undrop(this=this, kind=kind.name, rename=rename))
1289
1290    def _parse_put(self) -> exp.Put | exp.Command:
1291        if self._curr.token_type not in (TokenType.STRING, TokenType.URI_START):
1292            return self._parse_as_command(self._prev)
1293
1294        return self.expression(
1295            exp.Put(
1296                this=self._parse_string() or exp.Literal.string(self._parse_location_path().name),
1297                target=self._parse_location_path(),
1298                properties=self._parse_properties(),
1299            )
1300        )
1301
1302    def _parse_get(self) -> exp.Expr | None:
1303        start = self._prev
1304
1305        # If we detect GET( then we need to parse a function, not a statement
1306        if self._match(TokenType.L_PAREN):
1307            self._retreat(self._index - 2)
1308            return self._parse_expression()
1309
1310        target = self._parse_location_path()
1311
1312        # Parse as command if unquoted file path
1313        if self._curr.token_type == TokenType.URI_START:
1314            return self._parse_as_command(start)
1315
1316        return self.expression(
1317            exp.Get(this=self._parse_string(), target=target, properties=self._parse_properties())
1318        )
1319
1320    def _parse_list_stage(self) -> exp.ListStage:
1321        this = self._parse_location_path() if self._curr else None
1322        pattern = None
1323        if self._match_text_seq("PATTERN", "="):
1324            pattern = self._parse_string()
1325            if pattern is None:
1326                self.raise_error("Expected string after PATTERN =")
1327
1328        return self.expression(exp.ListStage(this=this, pattern=pattern))
1329
1330    def _parse_location_property(self) -> exp.LocationProperty:
1331        self._match(TokenType.EQ)
1332        return self.expression(exp.LocationProperty(this=self._parse_location_path()))
1333
1334    def _parse_file_location(self) -> exp.Expr | None:
1335        # Parse either a subquery or a staged file
1336        return (
1337            self._parse_select(table=True, parse_subquery_alias=False)
1338            if self._match(TokenType.L_PAREN, advance=False)
1339            else self._parse_table_parts()
1340        )
1341
1342    def _parse_location_path(self) -> exp.Var:
1343        start = self._curr
1344        self._advance_any(ignore_reserved=True)
1345
1346        # We avoid consuming a comma token because external tables like @foo and @bar
1347        # can be joined in a query with a comma separator, as well as closing paren
1348        # in case of subqueries
1349        while self._is_connected() and not self._match_set(
1350            (TokenType.COMMA, TokenType.L_PAREN, TokenType.R_PAREN), advance=False
1351        ):
1352            self._advance_any(ignore_reserved=True)
1353
1354        return exp.var(self._find_sql(start, self._prev))
1355
1356    def _parse_lambda_arg(self) -> exp.Expr | None:
1357        this = super()._parse_lambda_arg()
1358
1359        if not this:
1360            return this
1361
1362        typ = self._parse_types()
1363
1364        if typ:
1365            return self.expression(exp.Cast(this=this, to=typ))
1366
1367        return this
1368
1369    def _parse_foreign_key(self) -> exp.ForeignKey:
1370        # inlineFK, the REFERENCES columns are implied
1371        if self._match(TokenType.REFERENCES, advance=False):
1372            return self.expression(exp.ForeignKey())
1373
1374        # outoflineFK, explicitly names the columns
1375        return super()._parse_foreign_key()
1376
1377    def _parse_file_format_property(self) -> exp.FileFormatProperty:
1378        self._match(TokenType.EQ)
1379        if self._match(TokenType.L_PAREN, advance=False):
1380            expressions = self._parse_wrapped_options()
1381        else:
1382            expressions = [self._parse_format_name()]
1383
1384        return self.expression(exp.FileFormatProperty(expressions=expressions))
1385
1386    def _parse_credentials_property(self) -> exp.CredentialsProperty:
1387        return self.expression(exp.CredentialsProperty(expressions=self._parse_wrapped_options()))
1388
1389    def _parse_semantic_view(self) -> exp.SemanticView:
1390        kwargs: dict[str, t.Any] = {"this": self._parse_table_parts()}
1391
1392        while self._curr and not self._match(TokenType.R_PAREN, advance=False):
1393            if self._match_texts(("DIMENSIONS", "METRICS", "FACTS")):
1394                keyword = self._prev.text.lower()
1395                kwargs[keyword] = self._parse_csv(
1396                    lambda: self._parse_alias(self._parse_disjunction(), explicit=True)
1397                )
1398            elif self._match_text_seq("WHERE"):
1399                kwargs["where"] = self._parse_expression()
1400            else:
1401                self.raise_error("Expecting ) or encountered unexpected keyword")
1402                break
1403
1404        return self.expression(exp.SemanticView(**kwargs))
1405
1406    def _parse_set(self, unset: bool = False, tag: bool = False) -> exp.Set | exp.Command:
1407        set = super()._parse_set(unset=unset, tag=tag)
1408
1409        if isinstance(set, exp.Set):
1410            for expr in set.expressions:
1411                if isinstance(expr, exp.SetItem):
1412                    expr.set("kind", "VARIABLE")
1413        return set
1414
1415    def _parse_position(self, haystack_first: bool = False) -> exp.StrPosition:
1416        result = super()._parse_position(haystack_first)
1417        result.set("clamp_position", True)
1418        return result
1419
1420    def _parse_substring(self) -> exp.Substring:
1421        result = super()._parse_substring()
1422        result.set("zero_start", True)
1423        return result
1424
1425    def build_cast(self, strict: bool, **kwargs) -> exp.Expr:
1426        to = kwargs.get("to")
1427        if not strict and to and to.this == exp.DataType.Type.BOOLEAN:
1428            return self.expression(exp.ToBoolean(this=kwargs.get("this"), safe=True))
1429        cast = super().build_cast(strict, **kwargs)
1430        if isinstance(cast, exp.TryCast) and to:
1431            if to.this in exp.DataType.TEXT_TYPES and to.expressions:
1432                cast.set("null_on_text_overflow", True)
1433            elif to.this == exp.DType.DATE and cast.this.is_string:
1434                cast.set("probe_date_format", True)
1435        return cast
1436
1437    def _parse_window(self, this: exp.Expr | None, alias: bool = False) -> exp.Expr | None:
1438        result = super()._parse_window(this, alias)
1439
1440        # Set default window frame for ranking functions if not present
1441        if (
1442            isinstance(result, exp.Window)
1443            and isinstance(this, RANKING_WINDOW_FUNCTIONS_WITH_FRAME)
1444            and not result.args.get("spec")
1445        ):
1446            frame = exp.WindowSpec(
1447                kind="ROWS",
1448                start="UNBOUNDED",
1449                start_side="PRECEDING",
1450                end="UNBOUNDED",
1451                end_side="FOLLOWING",
1452            )
1453            result.set("spec", frame)
1454        return result
1455
1456
1457# This is imported and used by both the parser (above) and the generator in the dialect file
1458RANKING_WINDOW_FUNCTIONS_WITH_FRAME = (
1459    exp.FirstValue,
1460    exp.LastValue,
1461    exp.NthValue,
1462)
1463
1464
1465def build_object_construct(args: list) -> exp.StarMap | exp.Struct:
1466    expression = parser.build_var_map(args)
1467
1468    if isinstance(expression, exp.StarMap):
1469        return expression
1470
1471    return exp.Struct(
1472        expressions=[
1473            exp.PropertyEQ(this=k, expression=v) for k, v in zip(expression.keys, expression.values)
1474        ]
1475    )
TIMESTAMP_TYPES = {<DType.TIMESTAMP: 'TIMESTAMP'>: 'TO_TIMESTAMP', <DType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>: 'TO_TIMESTAMP_LTZ', <DType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>: 'TO_TIMESTAMP_NTZ', <DType.TIMESTAMPTZ: 'TIMESTAMPTZ'>: 'TO_TIMESTAMP_TZ'}
class SnowflakeParser(sqlglot.parser.Parser):
 337class SnowflakeParser(parser.Parser):
 338    IDENTIFY_PIVOT_STRINGS = True
 339    TYPED_LAMBDA_ARGS = True
 340    DEFAULT_SAMPLING_METHOD = "BERNOULLI"
 341    COLON_IS_VARIANT_EXTRACT = True
 342    JSON_EXTRACT_REQUIRES_JSON_EXPRESSION = True
 343    SUPPORTS_NTH_VALUE_FROM_MODIFIER = True
 344
 345    TYPE_TOKENS = {*parser.Parser.TYPE_TOKENS, TokenType.FILE}
 346    STRUCT_TYPE_TOKENS = {*parser.Parser.STRUCT_TYPE_TOKENS, TokenType.FILE}
 347    NESTED_TYPE_TOKENS = {*parser.Parser.NESTED_TYPE_TOKENS, TokenType.FILE}
 348
 349    ID_VAR_TOKENS = {
 350        *parser.Parser.ID_VAR_TOKENS,
 351        TokenType.EXCEPT,
 352        TokenType.INTEGRATION,
 353        TokenType.LATERAL,
 354        TokenType.MATCH_CONDITION,
 355        TokenType.PACKAGE,
 356        TokenType.POLICY,
 357        TokenType.POOL,
 358        TokenType.ROLE,
 359        TokenType.ROLLBACK,
 360        TokenType.RULE,
 361        TokenType.USING,
 362        TokenType.VOLUME,
 363    }
 364
 365    FUNC_TOKENS = parser.Parser.FUNC_TOKENS | {TokenType.ROLLBACK}
 366
 367    ALIAS_TOKENS = parser.Parser.ALIAS_TOKENS | {
 368        TokenType.INTEGRATION,
 369        TokenType.LATERAL,
 370        TokenType.PACKAGE,
 371        TokenType.POLICY,
 372        TokenType.POOL,
 373        TokenType.ROLE,
 374        TokenType.ROLLBACK,
 375        TokenType.RULE,
 376        TokenType.USING,
 377        TokenType.VOLUME,
 378    }
 379
 380    TABLE_ALIAS_TOKENS = (
 381        parser.Parser.TABLE_ALIAS_TOKENS
 382        | {
 383            TokenType.ANTI,
 384            TokenType.INTEGRATION,
 385            TokenType.PACKAGE,
 386            TokenType.POLICY,
 387            TokenType.POOL,
 388            TokenType.ROLE,
 389            TokenType.ROLLBACK,
 390            TokenType.RULE,
 391            TokenType.SEMI,
 392            TokenType.VOLUME,
 393            TokenType.WINDOW,
 394        }
 395    ) - {TokenType.MATCH_CONDITION}
 396
 397    COLON_PLACEHOLDER_TOKENS = ID_VAR_TOKENS | {TokenType.NUMBER}
 398
 399    NO_PAREN_FUNCTIONS = {
 400        **parser.Parser.NO_PAREN_FUNCTIONS,
 401        TokenType.LOCALTIME: exp.Localtime,
 402        # LOCALTIMESTAMP is a Snowflake alias of CURRENT_TIMESTAMP, like the parenthesised form in
 403        # FUNCTION_PARSERS. Only Snowflake treats it as such, so it must not map to Localtimestamp.
 404        TokenType.LOCALTIMESTAMP: exp.CurrentTimestamp,
 405        TokenType.CURRENT_TIME: exp.Localtime,
 406    }
 407
 408    RANGE_PARSERS = {
 409        **parser.Parser.RANGE_PARSERS,
 410        TokenType.RLIKE: lambda self, this: self.expression(
 411            exp.RegexpLike(this=this, expression=self._parse_bitwise(), full_match=True)
 412        ),
 413    }
 414
 415    FUNCTIONS = {
 416        **parser.Parser.FUNCTIONS,
 417        "CHARINDEX": lambda args: exp.StrPosition(
 418            this=seq_get(args, 1),
 419            substr=seq_get(args, 0),
 420            position=seq_get(args, 2),
 421            clamp_position=True,
 422        ),
 423        "ADD_MONTHS": lambda args: exp.AddMonths(
 424            this=seq_get(args, 0),
 425            expression=seq_get(args, 1),
 426            preserve_end_of_month=True,
 427        ),
 428        "APPROX_PERCENTILE": exp.ApproxQuantile.from_arg_list,
 429        "CURRENT_TIME": lambda args: exp.Localtime(this=seq_get(args, 0)),
 430        "APPROX_TOP_K": _build_approx_top_k,
 431        "ARRAY_CONSTRUCT": lambda args: exp.Array(expressions=args),
 432        "ARRAY_CONTAINS": lambda args: exp.ArrayContains(
 433            this=seq_get(args, 1),
 434            expression=seq_get(args, 0),
 435            ensure_variant=False,
 436            check_null=True,
 437        ),
 438        "ARRAY_DISTINCT": lambda args: exp.ArrayDistinct(
 439            this=seq_get(args, 0),
 440            check_null=True,
 441        ),
 442        "ARRAY_GENERATE_RANGE": lambda args: exp.GenerateSeries(
 443            # Snowflake has exclusive end semantics
 444            start=seq_get(args, 0),
 445            end=seq_get(args, 1),
 446            step=seq_get(args, 2),
 447            is_end_exclusive=True,
 448        ),
 449        "ARRAY_EXCEPT": lambda args: exp.ArrayExcept(
 450            this=seq_get(args, 0),
 451            expression=seq_get(args, 1),
 452            is_multiset=True,
 453        ),
 454        "ARRAY_INTERSECTION": lambda args: exp.ArrayIntersect(
 455            expressions=args,
 456            is_multiset=True,
 457        ),
 458        "ARRAY_POSITION": lambda args: exp.ArrayPosition(
 459            this=seq_get(args, 1),
 460            expression=seq_get(args, 0),
 461            zero_based=True,
 462        ),
 463        "ARRAY_SLICE": lambda args: exp.ArraySlice(
 464            this=seq_get(args, 0),
 465            start=seq_get(args, 1),
 466            end=seq_get(args, 2),
 467            zero_based=True,
 468        ),
 469        "ARRAY_SORT": _build_array_sort,
 470        "ARRAY_FLATTEN": exp.Flatten.from_arg_list,
 471        "ARRAY_TO_STRING": lambda args: exp.ArrayToString(
 472            this=seq_get(args, 0),
 473            expression=seq_get(args, 1),
 474            null_is_empty=True,
 475            null_delim_is_null=True,
 476        ),
 477        "ARRAYS_OVERLAP": lambda args: exp.ArrayOverlaps(
 478            this=seq_get(args, 0), expression=seq_get(args, 1), null_safe=True
 479        ),
 480        "BITAND": _build_bitwise(exp.BitwiseAnd, "BITAND"),
 481        "BIT_AND": _build_bitwise(exp.BitwiseAnd, "BITAND"),
 482        "BITNOT": lambda args: exp.BitwiseNot(this=seq_get(args, 0)),
 483        "BIT_NOT": lambda args: exp.BitwiseNot(this=seq_get(args, 0)),
 484        "BITXOR": _build_bitwise(exp.BitwiseXor, "BITXOR"),
 485        "BIT_XOR": _build_bitwise(exp.BitwiseXor, "BITXOR"),
 486        "BITOR": _build_bitwise(exp.BitwiseOr, "BITOR"),
 487        "BIT_OR": _build_bitwise(exp.BitwiseOr, "BITOR"),
 488        "BITSHIFTLEFT": _build_bitwise(exp.BitwiseLeftShift, "BITSHIFTLEFT"),
 489        "BIT_SHIFTLEFT": _build_bitwise(exp.BitwiseLeftShift, "BIT_SHIFTLEFT"),
 490        "BITSHIFTRIGHT": _build_bitwise(exp.BitwiseRightShift, "BITSHIFTRIGHT"),
 491        "BIT_SHIFTRIGHT": _build_bitwise(exp.BitwiseRightShift, "BIT_SHIFTRIGHT"),
 492        "BITANDAGG": exp.BitwiseAndAgg.from_arg_list,
 493        "BITAND_AGG": exp.BitwiseAndAgg.from_arg_list,
 494        "BIT_AND_AGG": exp.BitwiseAndAgg.from_arg_list,
 495        "BIT_ANDAGG": exp.BitwiseAndAgg.from_arg_list,
 496        "BITORAGG": exp.BitwiseOrAgg.from_arg_list,
 497        "BITOR_AGG": exp.BitwiseOrAgg.from_arg_list,
 498        "BIT_OR_AGG": exp.BitwiseOrAgg.from_arg_list,
 499        "BIT_ORAGG": exp.BitwiseOrAgg.from_arg_list,
 500        "BITXORAGG": exp.BitwiseXorAgg.from_arg_list,
 501        "BITXOR_AGG": exp.BitwiseXorAgg.from_arg_list,
 502        "BIT_XOR_AGG": exp.BitwiseXorAgg.from_arg_list,
 503        "BIT_XORAGG": exp.BitwiseXorAgg.from_arg_list,
 504        "BITMAP_OR_AGG": exp.BitmapOrAgg.from_arg_list,
 505        "BOOLAND": lambda args: exp.Booland(
 506            this=seq_get(args, 0), expression=seq_get(args, 1), round_input=True
 507        ),
 508        "BOOLOR": lambda args: exp.Boolor(
 509            this=seq_get(args, 0), expression=seq_get(args, 1), round_input=True
 510        ),
 511        "BOOLNOT": lambda args: exp.Boolnot(this=seq_get(args, 0), round_input=True),
 512        "BOOLXOR": lambda args: exp.Xor(
 513            this=seq_get(args, 0), expression=seq_get(args, 1), round_input=True
 514        ),
 515        "CORR": lambda args: exp.Corr(
 516            this=seq_get(args, 0),
 517            expression=seq_get(args, 1),
 518            null_on_zero_variance=True,
 519        ),
 520        "COUNT_IF": lambda args: exp.CountIf(this=seq_get(args, 0), zero_on_all_null=True),
 521        "DATE": _build_datetime("DATE", exp.DType.DATE),
 522        "DATEFROMPARTS": _build_date_from_parts,
 523        "DATE_FROM_PARTS": _build_date_from_parts,
 524        "DATE_TRUNC": _date_trunc_to_time,
 525        "DATEADD": lambda args: exp.DateAdd(
 526            this=seq_get(args, 2),
 527            expression=seq_get(args, 1),
 528            unit=map_date_part(seq_get(args, 0)),
 529        ),
 530        "DATEDIFF": lambda args: exp.DateDiff(
 531            this=seq_get(args, 2),
 532            expression=seq_get(args, 1),
 533            unit=map_date_part(seq_get(args, 0)),
 534            date_part_boundary=True,
 535        ),
 536        "DAYNAME": lambda args: exp.Dayname(this=seq_get(args, 0), abbreviated=True),
 537        "DAYOFWEEKISO": exp.DayOfWeekIso.from_arg_list,
 538        "DIV0": _build_if_from_div0,
 539        "DIV0NULL": _build_if_from_div0null,
 540        "EDITDISTANCE": lambda args: exp.Levenshtein(
 541            this=seq_get(args, 0), expression=seq_get(args, 1), max_dist=seq_get(args, 2)
 542        ),
 543        "FLATTEN": exp.Explode.from_arg_list,
 544        "GENERATOR": _build_generator,
 545        "GET": exp.GetExtract.from_arg_list,
 546        "GETDATE": exp.CurrentTimestamp.from_arg_list,
 547        "GET_PATH": lambda args, dialect: exp.JSONExtract(
 548            this=seq_get(args, 0),
 549            expression=dialect.to_json_path(seq_get(args, 1)),
 550            requires_json=True,
 551        ),
 552        "GREATEST_IGNORE_NULLS": lambda args: exp.Greatest(
 553            this=seq_get(args, 0), expressions=args[1:], ignore_nulls=True
 554        ),
 555        "LEAST_IGNORE_NULLS": lambda args: exp.Least(
 556            this=seq_get(args, 0), expressions=args[1:], ignore_nulls=True
 557        ),
 558        "LEFT": lambda args: exp.Left(
 559            this=seq_get(args, 0), expression=seq_get(args, 1), negative_length_returns_empty=True
 560        ),
 561        "HEX_DECODE_BINARY": exp.Unhex.from_arg_list,
 562        "HEX_ENCODE": exp.Hex.from_arg_list,
 563        "IFF": exp.If.from_arg_list,
 564        "JAROWINKLER_SIMILARITY": lambda args: exp.JarowinklerSimilarity(
 565            this=seq_get(args, 0),
 566            expression=seq_get(args, 1),
 567            case_insensitive=True,
 568            integer_scale=True,
 569        ),
 570        "MD5_HEX": exp.MD5.from_arg_list,
 571        "MD5_BINARY": exp.MD5Digest.from_arg_list,
 572        "MD5_NUMBER_LOWER64": exp.MD5NumberLower64.from_arg_list,
 573        "MD5_NUMBER_UPPER64": exp.MD5NumberUpper64.from_arg_list,
 574        "MONTHNAME": lambda args: exp.Monthname(this=seq_get(args, 0), abbreviated=True),
 575        "LAST_DAY": lambda args: exp.LastDay(
 576            this=seq_get(args, 0), unit=map_date_part(seq_get(args, 1))
 577        ),
 578        "LEN": lambda args: exp.Length(this=seq_get(args, 0), binary=True),
 579        "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True),
 580        "LOCALTIMESTAMP": exp.CurrentTimestamp.from_arg_list,
 581        "NULLIFZERO": _build_if_from_nullifzero,
 582        "OBJECT_CONSTRUCT": lambda args: build_object_construct(args),
 583        "OBJECT_KEYS": exp.JSONKeys.from_arg_list,
 584        "OCTET_LENGTH": exp.ByteLength.from_arg_list,
 585        "PARSE_URL": lambda args: exp.ParseUrl(this=seq_get(args, 0), permissive=seq_get(args, 1)),
 586        "REGEXP_EXTRACT_ALL": _build_regexp_extract(exp.RegexpExtractAll),
 587        "REGEXP_LIKE": _build_regexp_like,
 588        "REGEXP_REPLACE": _build_regexp_replace,
 589        "REGEXP_SUBSTR": _build_regexp_extract(exp.RegexpExtract),
 590        "REGEXP_SUBSTR_ALL": _build_regexp_extract(exp.RegexpExtractAll),
 591        "RANDOM": lambda args: exp.Rand(
 592            this=seq_get(args, 0),
 593            lower=exp.Literal.number(-9223372036854775808.0),  # -2^63 as float to avoid overflow
 594            upper=exp.Literal.number(9223372036854775807.0),  # 2^63-1 as float
 595        ),
 596        "REPLACE": build_replace_with_optional_replacement,
 597        "RIGHT": lambda args: exp.Right(
 598            this=seq_get(args, 0), expression=seq_get(args, 1), negative_length_returns_empty=True
 599        ),
 600        "RLIKE": _build_regexp_like,
 601        "ROUND": _build_round,
 602        "SHA1_BINARY": exp.SHA1Digest.from_arg_list,
 603        "SHA1_HEX": exp.SHA.from_arg_list,
 604        "SHA2_BINARY": exp.SHA2Digest.from_arg_list,
 605        "SHA2_HEX": exp.SHA2.from_arg_list,
 606        "SPLIT": lambda args: exp.Split(
 607            this=seq_get(args, 0),
 608            expression=seq_get(args, 1),
 609            null_returns_null=True,
 610            empty_delimiter_returns_whole=True,
 611        ),
 612        "SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)),
 613        "STDDEV_SAMP": exp.Stddev.from_arg_list,
 614        "SYSDATE": lambda args: exp.CurrentTimestamp(this=seq_get(args, 0), sysdate=True),
 615        "TABLE": lambda args: exp.TableFromRows(this=seq_get(args, 0)),
 616        "TIMEADD": lambda args: exp.TimeAdd(
 617            this=seq_get(args, 2),
 618            expression=seq_get(args, 1),
 619            unit=map_date_part(seq_get(args, 0)),
 620        ),
 621        "TIMEDIFF": lambda args: exp.DateDiff(
 622            this=seq_get(args, 2),
 623            expression=seq_get(args, 1),
 624            unit=map_date_part(seq_get(args, 0)),
 625            date_part_boundary=True,
 626        ),
 627        "TIME_FROM_PARTS": lambda args: exp.TimeFromParts(
 628            hour=seq_get(args, 0),
 629            min=seq_get(args, 1),
 630            sec=seq_get(args, 2),
 631            nano=seq_get(args, 3),
 632            overflow=True,
 633        ),
 634        "TIMESTAMPADD": lambda args: exp.DateAdd(
 635            this=seq_get(args, 2),
 636            expression=seq_get(args, 1),
 637            unit=map_date_part(seq_get(args, 0)),
 638        ),
 639        "TIMESTAMPDIFF": lambda args: exp.DateDiff(
 640            this=seq_get(args, 2),
 641            expression=seq_get(args, 1),
 642            unit=map_date_part(seq_get(args, 0)),
 643            date_part_boundary=True,
 644        ),
 645        "TIMESTAMPFROMPARTS": _build_timestamp_from_parts,
 646        "TIMESTAMP_FROM_PARTS": _build_timestamp_from_parts,
 647        "TIMESTAMPNTZFROMPARTS": _build_timestamp_from_parts,
 648        "TIMESTAMP_NTZ_FROM_PARTS": _build_timestamp_from_parts,
 649        "TRUNC": _build_trunc,
 650        "TRUNCATE": _build_trunc,
 651        "TRY_DECRYPT": lambda args: exp.Decrypt(
 652            this=seq_get(args, 0),
 653            passphrase=seq_get(args, 1),
 654            aad=seq_get(args, 2),
 655            encryption_method=seq_get(args, 3),
 656            safe=True,
 657        ),
 658        "TRY_DECRYPT_RAW": lambda args: exp.DecryptRaw(
 659            this=seq_get(args, 0),
 660            key=seq_get(args, 1),
 661            iv=seq_get(args, 2),
 662            aad=seq_get(args, 3),
 663            encryption_method=seq_get(args, 4),
 664            aead=seq_get(args, 5),
 665            safe=True,
 666        ),
 667        "TRY_PARSE_JSON": lambda args: exp.ParseJSON(this=seq_get(args, 0), safe=True),
 668        "TRY_TO_BINARY": lambda args: exp.ToBinary(
 669            this=seq_get(args, 0), format=seq_get(args, 1), safe=True
 670        ),
 671        "TRY_TO_BOOLEAN": lambda args: exp.ToBoolean(this=seq_get(args, 0), safe=True),
 672        "TRY_TO_DATE": _build_datetime("TRY_TO_DATE", exp.DType.DATE, safe=True),
 673        **dict.fromkeys(
 674            ("TRY_TO_DECIMAL", "TRY_TO_NUMBER", "TRY_TO_NUMERIC"),
 675            lambda args: _build_to_number(args, safe=True),
 676        ),
 677        "TRY_TO_DOUBLE": lambda args: exp.ToDouble(
 678            this=seq_get(args, 0), format=seq_get(args, 1), safe=True
 679        ),
 680        "TRY_TO_FILE": lambda args: exp.ToFile(
 681            this=seq_get(args, 0), path=seq_get(args, 1), safe=True
 682        ),
 683        "TRY_TO_TIME": _build_datetime("TRY_TO_TIME", exp.DType.TIME, safe=True),
 684        "TRY_TO_TIMESTAMP": _build_datetime("TRY_TO_TIMESTAMP", exp.DType.TIMESTAMP, safe=True),
 685        "TRY_TO_TIMESTAMP_LTZ": _build_datetime(
 686            "TRY_TO_TIMESTAMP_LTZ", exp.DType.TIMESTAMPLTZ, safe=True
 687        ),
 688        "TRY_TO_TIMESTAMP_NTZ": _build_datetime(
 689            "TRY_TO_TIMESTAMP_NTZ", exp.DType.TIMESTAMPNTZ, safe=True
 690        ),
 691        "TRY_TO_TIMESTAMP_TZ": _build_datetime(
 692            "TRY_TO_TIMESTAMP_TZ", exp.DType.TIMESTAMPTZ, safe=True
 693        ),
 694        "TO_CHAR": build_timetostr_or_tochar,
 695        "TO_DATE": _build_datetime("TO_DATE", exp.DType.DATE),
 696        **dict.fromkeys(
 697            ("TO_DECIMAL", "TO_NUMBER", "TO_NUMERIC"),
 698            lambda args: _build_to_number(args),
 699        ),
 700        "TO_TIME": _build_datetime("TO_TIME", exp.DType.TIME),
 701        "TO_TIMESTAMP": _build_datetime("TO_TIMESTAMP", exp.DType.TIMESTAMP),
 702        "TO_TIMESTAMP_LTZ": _build_datetime("TO_TIMESTAMP_LTZ", exp.DType.TIMESTAMPLTZ),
 703        "TO_TIMESTAMP_NTZ": _build_datetime("TO_TIMESTAMP_NTZ", exp.DType.TIMESTAMPNTZ),
 704        "TO_TIMESTAMP_TZ": _build_datetime("TO_TIMESTAMP_TZ", exp.DType.TIMESTAMPTZ),
 705        "TO_GEOGRAPHY": lambda args: (
 706            exp.cast(args[0], exp.DType.GEOGRAPHY)
 707            if len(args) == 1
 708            else exp.Anonymous(this="TO_GEOGRAPHY", expressions=args)
 709        ),
 710        "TO_GEOMETRY": lambda args: (
 711            exp.cast(args[0], exp.DType.GEOMETRY)
 712            if len(args) == 1
 713            else exp.Anonymous(this="TO_GEOMETRY", expressions=args)
 714        ),
 715        "TO_VARCHAR": build_timetostr_or_tochar,
 716        "TO_JSON": exp.JSONFormat.from_arg_list,
 717        "VECTOR_COSINE_SIMILARITY": exp.CosineDistance.from_arg_list,
 718        "VECTOR_INNER_PRODUCT": exp.DotProduct.from_arg_list,
 719        "VECTOR_L1_DISTANCE": exp.ManhattanDistance.from_arg_list,
 720        "VECTOR_L2_DISTANCE": exp.EuclideanDistance.from_arg_list,
 721        "ZEROIFNULL": _build_if_from_zeroifnull,
 722        "LIKE": build_like(exp.Like),
 723        "ILIKE": build_like(exp.ILike),
 724        "SEARCH": _build_search,
 725        "SKEW": exp.Skewness.from_arg_list,
 726        "SPLIT_PART": lambda args: exp.SplitPart(
 727            this=seq_get(args, 0),
 728            delimiter=seq_get(args, 1),
 729            part_index=seq_get(args, 2),
 730            part_index_zero_as_one=True,
 731            empty_delimiter_returns_whole=True,
 732        ),
 733        "STRTOK": lambda args: exp.Strtok(
 734            this=seq_get(args, 0),
 735            delimiter=seq_get(args, 1) or exp.Literal.string(" "),
 736            part_index=seq_get(args, 2) or exp.Literal.number("1"),
 737        ),
 738        "STRTOK_TO_ARRAY": lambda args: exp.StrtokToArray(
 739            this=seq_get(args, 0),
 740            expression=seq_get(args, 1) or exp.Literal.string(" "),
 741        ),
 742        "SYSTIMESTAMP": exp.CurrentTimestamp.from_arg_list,
 743        "IDENTIFIER": exp.DynamicIdentifier.from_arg_list,
 744        "UNICODE": lambda args: exp.Unicode(this=seq_get(args, 0), empty_is_zero=True),
 745        "WEEKISO": exp.WeekOfYear.from_arg_list,
 746        "WEEKOFYEAR": exp.Week.from_arg_list,
 747    }
 748    FUNCTIONS = {k: v for k, v in FUNCTIONS.items() if k != "PREDICT"}
 749
 750    FUNCTION_PARSERS = {
 751        **parser.Parser.FUNCTION_PARSERS,
 752        "DATE_PART": lambda self: self._parse_date_part(),
 753        "DIRECTORY": lambda self: self._parse_directory(),
 754        "OBJECT_CONSTRUCT_KEEP_NULL": lambda self: self._parse_object_construct_keep_null(),
 755        "LISTAGG": lambda self: self._parse_listagg(),
 756        "SEMANTIC_VIEW": lambda self: self._parse_semantic_view(),
 757        "SUBSTR": lambda self: self._parse_substring(),
 758    }
 759    FUNCTION_PARSERS = {k: v for k, v in FUNCTION_PARSERS.items() if k != "TRIM"}
 760
 761    TIMESTAMPS = parser.Parser.TIMESTAMPS - {TokenType.TIME}
 762
 763    ALTER_PARSERS = {
 764        **parser.Parser.ALTER_PARSERS,
 765        "MODIFY": lambda self: self._parse_alter_table_alter(),
 766        "SESSION": lambda self: self._parse_alter_session(),
 767        "UNSET": lambda self: self.expression(
 768            exp.Set(
 769                tag=self._match_text_seq("TAG"),
 770                expressions=self._parse_csv(self._parse_id_var),
 771                unset=True,
 772            )
 773        ),
 774    }
 775
 776    STATEMENT_PARSERS = {
 777        **{
 778            k: v
 779            for k, v in parser.Parser.STATEMENT_PARSERS.items()
 780            if k not in (TokenType.PIVOT, TokenType.UNPIVOT)
 781        },
 782        TokenType.GET: lambda self: self._parse_get(),
 783        TokenType.LIST: lambda self: self._parse_list_stage(),
 784        TokenType.PUT: lambda self: self._parse_put(),
 785        TokenType.SHOW: lambda self: self._parse_show(),
 786        TokenType.UNDROP: lambda self: self._parse_undrop(),
 787    }
 788
 789    PROPERTY_PARSERS = {
 790        **parser.Parser.PROPERTY_PARSERS,
 791        "CREDENTIALS": lambda self: self._parse_credentials_property(),
 792        "FILE_FORMAT": lambda self: self._parse_file_format_property(),
 793        "IGNORE": lambda self: self._parse_ignore_property(),
 794        "INTERACTIVE": lambda self: self.expression(exp.InteractiveProperty()),
 795        "LOCATION": lambda self: self._parse_location_property(),
 796        "ROW": lambda self: (
 797            self._parse_row_access_policy()
 798            if self._match_text_seq("ACCESS", "POLICY")
 799            else self._parse_row()
 800        ),
 801        "SCOPED": lambda self: (
 802            self._match_texts(("TEMP", "TEMPORARY"))
 803            and self.expression(exp.TemporaryProperty(scoped=True))
 804        ),
 805        "TAG": lambda self: self._parse_tag(),
 806        "USING": lambda self: (
 807            self._match_text_seq("TEMPLATE")
 808            and self.expression(exp.UsingTemplateProperty(this=self._parse_statement()))
 809        ),
 810    }
 811
 812    DESCRIBE_QUALIFIER_PARSERS: t.ClassVar[dict[str, t.Callable]] = {
 813        "API": lambda self: self.expression(exp.ApiProperty()),
 814        "APPLICATION": lambda self: self.expression(exp.ApplicationProperty()),
 815        "CATALOG": lambda self: self.expression(exp.CatalogProperty()),
 816        "COMPUTE": lambda self: self.expression(exp.ComputeProperty()),
 817        "DATABASE": lambda self: (
 818            self.expression(exp.DatabaseProperty())
 819            if self._curr and self._curr.text.upper() == "ROLE"
 820            else None
 821        ),
 822        "DYNAMIC": lambda self: self.expression(exp.DynamicProperty()),
 823        "EXTERNAL": lambda self: self.expression(exp.ExternalProperty()),
 824        "HYBRID": lambda self: self.expression(exp.HybridProperty()),
 825        "ICEBERG": lambda self: self.expression(exp.IcebergProperty()),
 826        "MASKING": lambda self: self.expression(exp.MaskingProperty()),
 827        "MATERIALIZED": lambda self: self.expression(exp.MaterializedProperty()),
 828        "NETWORK": lambda self: self.expression(exp.NetworkProperty()),
 829        "ROW": lambda self: (
 830            self.expression(exp.RowAccessProperty()) if self._match_text_seq("ACCESS") else None
 831        ),
 832        "SECURITY": lambda self: (
 833            self.expression(exp.SecurityIntegrationProperty())
 834            if self._curr and self._curr.text.upper() == "INTEGRATION"
 835            else None
 836        ),
 837    }
 838
 839    TYPE_CONVERTERS = {
 840        # https://docs.snowflake.com/en/sql-reference/data-types-numeric#number
 841        exp.DType.DECIMAL: build_default_decimal_type(precision=38, scale=0),
 842    }
 843
 844    SHOW_PARSERS = {
 845        "DATABASES": _show_parser("DATABASES"),
 846        "SCHEMAS": _show_parser("SCHEMAS"),
 847        "OBJECTS": _show_parser("OBJECTS"),
 848        "TABLES": _show_parser("TABLES"),
 849        "VIEWS": _show_parser("VIEWS"),
 850        "PRIMARY KEYS": _show_parser("PRIMARY KEYS"),
 851        "IMPORTED KEYS": _show_parser("IMPORTED KEYS"),
 852        "UNIQUE KEYS": _show_parser("UNIQUE KEYS"),
 853        "SEQUENCES": _show_parser("SEQUENCES"),
 854        "STAGES": _show_parser("STAGES"),
 855        "COLUMNS": _show_parser("COLUMNS"),
 856        "USERS": _show_parser("USERS"),
 857        "FILE FORMATS": _show_parser("FILE FORMATS"),
 858        "FUNCTIONS": _show_parser("FUNCTIONS"),
 859        "PROCEDURES": _show_parser("PROCEDURES"),
 860        "WAREHOUSES": _show_parser("WAREHOUSES"),
 861        "ICEBERG TABLES": _show_parser("TABLES", iceberg=True),
 862        "TERSE ICEBERG TABLES": _show_parser("TABLES", terse=True, iceberg=True),
 863        "TERSE DATABASES": _show_parser("DATABASES", terse=True),
 864        "TERSE SCHEMAS": _show_parser("SCHEMAS", terse=True),
 865        "TERSE OBJECTS": _show_parser("OBJECTS", terse=True),
 866        "TERSE TABLES": _show_parser("TABLES", terse=True),
 867        "TERSE VIEWS": _show_parser("VIEWS", terse=True),
 868        "TERSE SEQUENCES": _show_parser("SEQUENCES", terse=True),
 869        "TERSE USERS": _show_parser("USERS", terse=True),
 870        # TERSE has no semantic effect for KEYS, so we do not set the terse AST arg
 871        "TERSE PRIMARY KEYS": _show_parser("PRIMARY KEYS"),
 872        "TERSE IMPORTED KEYS": _show_parser("IMPORTED KEYS"),
 873        "TERSE UNIQUE KEYS": _show_parser("UNIQUE KEYS"),
 874    }
 875
 876    SHOW_TRIE = new_trie(key.split(" ") for key in SHOW_PARSERS)
 877
 878    SCHEMA_UNNAMED_CONSTRAINTS = parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS - {"EXCLUDE"}
 879
 880    CONSTRAINT_PARSERS = {
 881        **parser.Parser.CONSTRAINT_PARSERS,
 882        "WITH": lambda self: self._parse_with_constraint(),
 883        "MASKING": lambda self: self._parse_with_constraint(),
 884        "PROJECTION": lambda self: self._parse_with_constraint(),
 885        "TAG": lambda self: self._parse_with_constraint(),
 886    }
 887
 888    STAGED_FILE_SINGLE_TOKENS: t.ClassVar = {
 889        TokenType.DOT,
 890        TokenType.MOD,
 891        TokenType.SLASH,
 892    }
 893
 894    FLATTEN_COLUMNS: t.ClassVar = ["SEQ", "KEY", "PATH", "INDEX", "VALUE", "THIS"]
 895
 896    SCHEMA_KINDS: t.ClassVar = {
 897        "OBJECTS",
 898        "TABLES",
 899        "VIEWS",
 900        "SEQUENCES",
 901        "UNIQUE KEYS",
 902        "IMPORTED KEYS",
 903    }
 904
 905    NON_TABLE_CREATABLES: t.ClassVar = {"STORAGE INTEGRATION", "TAG", "WAREHOUSE", "STREAMLIT"}
 906
 907    UNDROP_OBJECTS: t.ClassVar[parser.OPTIONS_TYPE] = {
 908        **dict.fromkeys(
 909            (
 910                "ACCOUNT",
 911                "DATABASE",
 912                "NOTEBOOK",
 913                "SCHEMA",
 914                "SNAPSHOT",
 915                "STREAMLIT",
 916                "TABLE",
 917                "TAG",
 918                "TYPE",
 919            ),
 920            tuple(),
 921        ),
 922        "DYNAMIC": ("TABLE",),
 923        "EXTERNAL": ("VOLUME",),
 924        "ICEBERG": ("TABLE",),
 925    }
 926
 927    CREATABLES = {
 928        *parser.Parser.CREATABLES,
 929        TokenType.INTEGRATION,
 930        TokenType.PACKAGE,
 931        TokenType.POLICY,
 932        TokenType.POOL,
 933        TokenType.ROLE,
 934        TokenType.RULE,
 935        TokenType.VOLUME,
 936    }
 937
 938    LAMBDAS = {
 939        **parser.Parser.LAMBDAS,
 940        TokenType.ARROW: lambda self, expressions: self.expression(
 941            exp.Lambda(
 942                this=self._replace_lambda(
 943                    self._parse_assignment(),
 944                    expressions,
 945                ),
 946                expressions=[e.this if isinstance(e, exp.Cast) else e for e in expressions],
 947            )
 948        ),
 949    }
 950
 951    COLUMN_OPERATORS = {
 952        **parser.Parser.COLUMN_OPERATORS,
 953        TokenType.EXCLAMATION: lambda self, this, attr: self.expression(
 954            exp.ModelAttribute(this=this, expression=attr)
 955        ),
 956    }
 957
 958    def _parse_directory(self) -> exp.DirectoryStage:
 959        table = self._parse_table_parts()
 960        this = table.this if isinstance(table, exp.Table) else table
 961        return self.expression(exp.DirectoryStage(this=this))
 962
 963    def _parse_describe(self) -> exp.Describe:
 964        index = self._index
 965
 966        if self._match_texts(self.DESCRIBE_QUALIFIER_PARSERS):
 967            qualifier = self.DESCRIBE_QUALIFIER_PARSERS[self._prev.text.upper()](self)
 968
 969            if qualifier:
 970                kind = self._match_set(self.CREATABLES) and self._prev.text.upper()
 971
 972                if kind:
 973                    this = self._parse_table(schema=True)
 974                    properties = self.expression(exp.Properties(expressions=[qualifier]))
 975                    post_props = self._parse_properties()
 976                    expressions = post_props.expressions if post_props else None
 977                    return self.expression(
 978                        exp.Describe(
 979                            this=this,
 980                            kind=kind,
 981                            properties=properties,
 982                            expressions=expressions,
 983                        )
 984                    )
 985
 986        self._retreat(index)
 987        return super()._parse_describe()
 988
 989    def _parse_use(self) -> exp.Use:
 990        if self._match_text_seq("SECONDARY", "ROLES"):
 991            this = self._match_texts(("ALL", "NONE")) and exp.var(self._prev.text.upper())
 992            roles = None if this else self._parse_csv(lambda: self._parse_table(schema=False))
 993            return self.expression(exp.Use(kind="SECONDARY ROLES", this=this, expressions=roles))
 994
 995        return super()._parse_use()
 996
 997    def _negate_range(self, this: exp.Expr | None = None) -> exp.Expr | None:
 998        if not this:
 999            return this
1000
1001        query = this.args.get("query")
1002        if isinstance(this, exp.In) and isinstance(query, exp.Query):
1003            # Snowflake treats `value NOT IN (subquery)` as `VALUE <> ALL (subquery)`, so
1004            # we do this conversion here to avoid parsing it into `NOT value IN (subquery)`
1005            # which can produce different results (most likely a SnowFlake bug).
1006            #
1007            # https://docs.snowflake.com/en/sql-reference/functions/in
1008            # Context: https://github.com/tobymao/sqlglot/issues/3890
1009            return self.expression(exp.NEQ(this=this.this, expression=exp.All(this=query.unnest())))
1010
1011        return self.expression(exp.Not(this=this))
1012
1013    def _parse_copy_property(self) -> exp.Property | None:
1014        if self._match_text_seq("TAGS"):
1015            return self.expression(exp.CopyTagsProperty())
1016        return super()._parse_copy_property()
1017
1018    def _parse_ignore_property(self) -> exp.Property | None:
1019        if not self._match_text_seq("GRANTS"):
1020            self._retreat(self._index - 1)
1021            return None
1022
1023        return self.expression(exp.IgnoreGrantsProperty())
1024
1025    def _parse_tag(self) -> exp.Tags:
1026        return self.expression(exp.Tags(expressions=self._parse_wrapped_csv(self._parse_property)))
1027
1028    def _parse_property_before(self) -> exp.Expr | list[exp.Expr] | None:
1029        prop = super()._parse_property_before()
1030        if prop:
1031            return prop
1032
1033        if not self._next or self._next.token_type != TokenType.EQ:
1034            return None
1035
1036        return self._parse_sequence_properties() or self._parse_key_value_property(
1037            self._parse_primary_or_var
1038        )
1039
1040    def _parse_with_constraint(self) -> exp.Expr | None:
1041        if self._prev.token_type != TokenType.WITH:
1042            self._retreat(self._index - 1)
1043
1044        if self._match_text_seq("MASKING", "POLICY"):
1045            policy = self._parse_column()
1046            return self.expression(
1047                exp.MaskingPolicyColumnConstraint(
1048                    this=policy.to_dot() if isinstance(policy, exp.Column) else policy,
1049                    expressions=self._match(TokenType.USING)
1050                    and self._parse_wrapped_csv(self._parse_id_var),
1051                )
1052            )
1053        if self._match_text_seq("PROJECTION", "POLICY"):
1054            policy = self._parse_column()
1055            return self.expression(
1056                exp.ProjectionPolicyColumnConstraint(
1057                    this=policy.to_dot() if isinstance(policy, exp.Column) else policy
1058                )
1059            )
1060        if self._match(TokenType.TAG):
1061            return self._parse_tag()
1062
1063        return None
1064
1065    def _parse_with_property(self) -> exp.Expr | None | list[exp.Expr]:
1066        if self._match(TokenType.TAG):
1067            return self._parse_tag()
1068
1069        if self._match_text_seq("ROW", "ACCESS", "POLICY"):
1070            return self._parse_row_access_policy()
1071
1072        return super()._parse_with_property()
1073
1074    def _parse_row_access_policy(self) -> exp.RowAccessProperty:
1075        # GET_DDL outputs #unknown_policy when the user lacks privileges to see the policy name
1076        if self._match(TokenType.HASH):
1077            policy: exp.Expr | None = self._parse_var(any_token=True)
1078            if policy:
1079                policy = exp.Var(this=f"#{policy.name}")
1080            expressions = None
1081        else:
1082            policy = self._parse_column()
1083            if isinstance(policy, exp.Column):
1084                policy = policy.to_dot()
1085            if not self._match(TokenType.ON):
1086                self.raise_error("Expected ON after ROW ACCESS POLICY name")
1087            expressions = self._parse_wrapped_csv(self._parse_id_var)
1088
1089        return self.expression(exp.RowAccessProperty(this=policy, expressions=expressions))
1090
1091    def _parse_create(self) -> exp.Create | exp.Command:
1092        expression = super()._parse_create()
1093        if isinstance(expression, exp.Create) and expression.kind in self.NON_TABLE_CREATABLES:
1094            # Replace the Table node with the enclosed Identifier
1095            expression.this.replace(expression.this.this)
1096
1097        return expression
1098
1099    def _parse_listagg(self) -> exp.GroupConcat:
1100        expression = self._parse_string_agg()
1101        if expression.args.get("separator") is None:
1102            expression.set("separator", exp.Literal.string(""))
1103        return expression
1104
1105    def _parse_object_construct_keep_null(self) -> exp.JSONObject:
1106        index = self._index
1107        column = self._parse_column()
1108        if column and column.is_star:
1109            return self.expression(exp.JSONObject(expressions=[column]))
1110
1111        self._retreat(index)
1112        return self._parse_json_object(agg=False)
1113
1114    # https://docs.snowflake.com/en/sql-reference/functions/date_part.html
1115    # https://docs.snowflake.com/en/sql-reference/functions-date-time.html#label-supported-date-time-parts
1116    def _parse_date_part(self) -> exp.Expr | None:
1117        this = self._parse_var() or self._parse_type()
1118
1119        if not this:
1120            return None
1121
1122        # Handle both syntaxes: DATE_PART(part, expr) and DATE_PART(part FROM expr)
1123        expression = self._match_set((TokenType.FROM, TokenType.COMMA)) and self._parse_bitwise()
1124        return self.expression(
1125            exp.Extract(this=map_date_part(this, self.dialect), expression=expression)
1126        )
1127
1128    def _parse_bracket_key_value(self, is_map: bool = False) -> exp.Expr | None:
1129        if is_map:
1130            # Keys are strings in Snowflake's objects, see also:
1131            # - https://docs.snowflake.com/en/sql-reference/data-types-semistructured
1132            # - https://docs.snowflake.com/en/sql-reference/functions/object_construct
1133            return self._parse_slice(self._parse_string()) or self._parse_assignment()
1134
1135        return self._parse_slice(self._parse_alias(self._parse_assignment(), explicit=True))
1136
1137    def _parse_lateral(self) -> exp.Lateral | None:
1138        lateral = super()._parse_lateral()
1139        if not lateral:
1140            return lateral
1141
1142        if isinstance(lateral.this, exp.Explode):
1143            table_alias = lateral.args.get("alias")
1144            columns = [exp.to_identifier(col) for col in self.FLATTEN_COLUMNS]
1145            if table_alias and not table_alias.args.get("columns"):
1146                table_alias.set("columns", columns)
1147            elif not table_alias:
1148                exp.alias_(lateral, "_flattened", table=columns, copy=False)
1149
1150        return lateral
1151
1152    def _parse_table_parts(
1153        self,
1154        schema: bool = False,
1155        is_db_reference: bool = False,
1156        wildcard: bool = False,
1157        fast: bool = False,
1158    ) -> exp.Table | exp.Dot | None:
1159        # https://docs.snowflake.com/en/user-guide/querying-stage
1160        if self._match(TokenType.STRING, advance=False):
1161            table = self._parse_string()
1162        elif self._match_text_seq("@", advance=False):
1163            table = self._parse_location_path()
1164        else:
1165            table = None
1166
1167        if table:
1168            file_format = None
1169            pattern = None
1170
1171            wrapped = self._match(TokenType.L_PAREN)
1172            while self._curr and wrapped and not self._match(TokenType.R_PAREN):
1173                if self._match_text_seq("FILE_FORMAT", "=>"):
1174                    file_format = self._parse_string() or super()._parse_table_parts(
1175                        is_db_reference=is_db_reference
1176                    )
1177                elif self._match_text_seq("PATTERN", "=>"):
1178                    pattern = self._parse_string()
1179                else:
1180                    break
1181
1182                self._match(TokenType.COMMA)
1183
1184            table = self.expression(exp.Table(this=table, format=file_format, pattern=pattern))
1185        else:
1186            table = super()._parse_table_parts(
1187                schema=schema,
1188                is_db_reference=is_db_reference,
1189                fast=fast,
1190            )
1191
1192        return table
1193
1194    def _parse_function_call(
1195        self,
1196        functions: dict[str, t.Callable] | None = None,
1197        anonymous: bool = False,
1198        optional_parens: bool = True,
1199        any_token: bool = False,
1200    ) -> exp.Expr | None:
1201        this = super()._parse_function_call(
1202            functions=functions,
1203            anonymous=anonymous,
1204            optional_parens=optional_parens,
1205            any_token=any_token,
1206        )
1207
1208        # Snowflake can invoke a function whose name is dynamically resolved, e.g.
1209        # `IDENTIFIER('my_func')(1, 2)`. The trailing argument list is the call's arguments.
1210        #
1211        # https://docs.snowflake.com/en/sql-reference/identifier-literal
1212        if isinstance(this, exp.DynamicIdentifier) and self._match(
1213            TokenType.L_PAREN, advance=False
1214        ):
1215            this.set("expressions", self._parse_wrapped_csv(self._parse_lambda))
1216
1217        return this
1218
1219    def _parse_id_var(
1220        self,
1221        any_token: bool = True,
1222        tokens: Collection[TokenType] | None = None,
1223    ) -> exp.Expr | None:
1224        if self._match_text_seq("IDENTIFIER", "("):
1225            identifier = (
1226                super()._parse_id_var(any_token=any_token, tokens=tokens) or self._parse_string()
1227            )
1228            self._match_r_paren()
1229            return self.expression(exp.DynamicIdentifier(this=identifier))
1230
1231        return super()._parse_id_var(any_token=any_token, tokens=tokens)
1232
1233    def _parse_show_snowflake(
1234        self, this: str, terse: bool = False, iceberg: bool = False
1235    ) -> exp.Show:
1236        scope = None
1237        scope_kind = None
1238
1239        history = self._match_text_seq("HISTORY")
1240
1241        like = self._parse_string() if self._match(TokenType.LIKE) else None
1242
1243        if self._match(TokenType.IN):
1244            if self._match_text_seq("ACCOUNT"):
1245                scope_kind = "ACCOUNT"
1246            elif self._match_text_seq("CLASS"):
1247                scope_kind = "CLASS"
1248                scope = self._parse_table_parts()
1249            elif self._match_text_seq("APPLICATION"):
1250                scope_kind = "APPLICATION"
1251                if self._match_text_seq("PACKAGE"):
1252                    scope_kind += " PACKAGE"
1253                scope = self._parse_table_parts()
1254            elif self._match_set(self.DB_CREATABLES):
1255                scope_kind = self._prev.text.upper()
1256                if self._curr:
1257                    scope = self._parse_table_parts()
1258            elif self._curr:
1259                scope_kind = "SCHEMA" if this in self.SCHEMA_KINDS else "TABLE"
1260                scope = self._parse_table_parts()
1261
1262        return self.expression(
1263            exp.Show(
1264                terse=terse,
1265                iceberg=iceberg,
1266                this=this,
1267                history=history,
1268                like=like,
1269                scope=scope,
1270                scope_kind=scope_kind,
1271                starts_with=self._match_text_seq("STARTS", "WITH") and self._parse_string(),
1272                limit=self._parse_limit(),
1273                from_=self._parse_string() if self._match(TokenType.FROM) else None,
1274                privileges=self._match_text_seq("WITH", "PRIVILEGES")
1275                and self._parse_csv(lambda: self._parse_var(any_token=True, upper=True)),
1276            )
1277        )
1278
1279    def _parse_undrop(self) -> exp.Undrop | exp.Command:
1280        start = self._prev
1281        kind = self._parse_var_from_options(self.UNDROP_OBJECTS, raise_unmatched=False)
1282        if not kind:
1283            return self._parse_as_command(start)
1284
1285        this = self._parse_table_parts(
1286            is_db_reference=kind.name in ("ACCOUNT", "DATABASE", "SCHEMA")
1287        )
1288        rename = self._parse_table_parts() if self._match_text_seq("RENAME", "TO") else None
1289        return self.expression(exp.Undrop(this=this, kind=kind.name, rename=rename))
1290
1291    def _parse_put(self) -> exp.Put | exp.Command:
1292        if self._curr.token_type not in (TokenType.STRING, TokenType.URI_START):
1293            return self._parse_as_command(self._prev)
1294
1295        return self.expression(
1296            exp.Put(
1297                this=self._parse_string() or exp.Literal.string(self._parse_location_path().name),
1298                target=self._parse_location_path(),
1299                properties=self._parse_properties(),
1300            )
1301        )
1302
1303    def _parse_get(self) -> exp.Expr | None:
1304        start = self._prev
1305
1306        # If we detect GET( then we need to parse a function, not a statement
1307        if self._match(TokenType.L_PAREN):
1308            self._retreat(self._index - 2)
1309            return self._parse_expression()
1310
1311        target = self._parse_location_path()
1312
1313        # Parse as command if unquoted file path
1314        if self._curr.token_type == TokenType.URI_START:
1315            return self._parse_as_command(start)
1316
1317        return self.expression(
1318            exp.Get(this=self._parse_string(), target=target, properties=self._parse_properties())
1319        )
1320
1321    def _parse_list_stage(self) -> exp.ListStage:
1322        this = self._parse_location_path() if self._curr else None
1323        pattern = None
1324        if self._match_text_seq("PATTERN", "="):
1325            pattern = self._parse_string()
1326            if pattern is None:
1327                self.raise_error("Expected string after PATTERN =")
1328
1329        return self.expression(exp.ListStage(this=this, pattern=pattern))
1330
1331    def _parse_location_property(self) -> exp.LocationProperty:
1332        self._match(TokenType.EQ)
1333        return self.expression(exp.LocationProperty(this=self._parse_location_path()))
1334
1335    def _parse_file_location(self) -> exp.Expr | None:
1336        # Parse either a subquery or a staged file
1337        return (
1338            self._parse_select(table=True, parse_subquery_alias=False)
1339            if self._match(TokenType.L_PAREN, advance=False)
1340            else self._parse_table_parts()
1341        )
1342
1343    def _parse_location_path(self) -> exp.Var:
1344        start = self._curr
1345        self._advance_any(ignore_reserved=True)
1346
1347        # We avoid consuming a comma token because external tables like @foo and @bar
1348        # can be joined in a query with a comma separator, as well as closing paren
1349        # in case of subqueries
1350        while self._is_connected() and not self._match_set(
1351            (TokenType.COMMA, TokenType.L_PAREN, TokenType.R_PAREN), advance=False
1352        ):
1353            self._advance_any(ignore_reserved=True)
1354
1355        return exp.var(self._find_sql(start, self._prev))
1356
1357    def _parse_lambda_arg(self) -> exp.Expr | None:
1358        this = super()._parse_lambda_arg()
1359
1360        if not this:
1361            return this
1362
1363        typ = self._parse_types()
1364
1365        if typ:
1366            return self.expression(exp.Cast(this=this, to=typ))
1367
1368        return this
1369
1370    def _parse_foreign_key(self) -> exp.ForeignKey:
1371        # inlineFK, the REFERENCES columns are implied
1372        if self._match(TokenType.REFERENCES, advance=False):
1373            return self.expression(exp.ForeignKey())
1374
1375        # outoflineFK, explicitly names the columns
1376        return super()._parse_foreign_key()
1377
1378    def _parse_file_format_property(self) -> exp.FileFormatProperty:
1379        self._match(TokenType.EQ)
1380        if self._match(TokenType.L_PAREN, advance=False):
1381            expressions = self._parse_wrapped_options()
1382        else:
1383            expressions = [self._parse_format_name()]
1384
1385        return self.expression(exp.FileFormatProperty(expressions=expressions))
1386
1387    def _parse_credentials_property(self) -> exp.CredentialsProperty:
1388        return self.expression(exp.CredentialsProperty(expressions=self._parse_wrapped_options()))
1389
1390    def _parse_semantic_view(self) -> exp.SemanticView:
1391        kwargs: dict[str, t.Any] = {"this": self._parse_table_parts()}
1392
1393        while self._curr and not self._match(TokenType.R_PAREN, advance=False):
1394            if self._match_texts(("DIMENSIONS", "METRICS", "FACTS")):
1395                keyword = self._prev.text.lower()
1396                kwargs[keyword] = self._parse_csv(
1397                    lambda: self._parse_alias(self._parse_disjunction(), explicit=True)
1398                )
1399            elif self._match_text_seq("WHERE"):
1400                kwargs["where"] = self._parse_expression()
1401            else:
1402                self.raise_error("Expecting ) or encountered unexpected keyword")
1403                break
1404
1405        return self.expression(exp.SemanticView(**kwargs))
1406
1407    def _parse_set(self, unset: bool = False, tag: bool = False) -> exp.Set | exp.Command:
1408        set = super()._parse_set(unset=unset, tag=tag)
1409
1410        if isinstance(set, exp.Set):
1411            for expr in set.expressions:
1412                if isinstance(expr, exp.SetItem):
1413                    expr.set("kind", "VARIABLE")
1414        return set
1415
1416    def _parse_position(self, haystack_first: bool = False) -> exp.StrPosition:
1417        result = super()._parse_position(haystack_first)
1418        result.set("clamp_position", True)
1419        return result
1420
1421    def _parse_substring(self) -> exp.Substring:
1422        result = super()._parse_substring()
1423        result.set("zero_start", True)
1424        return result
1425
1426    def build_cast(self, strict: bool, **kwargs) -> exp.Expr:
1427        to = kwargs.get("to")
1428        if not strict and to and to.this == exp.DataType.Type.BOOLEAN:
1429            return self.expression(exp.ToBoolean(this=kwargs.get("this"), safe=True))
1430        cast = super().build_cast(strict, **kwargs)
1431        if isinstance(cast, exp.TryCast) and to:
1432            if to.this in exp.DataType.TEXT_TYPES and to.expressions:
1433                cast.set("null_on_text_overflow", True)
1434            elif to.this == exp.DType.DATE and cast.this.is_string:
1435                cast.set("probe_date_format", True)
1436        return cast
1437
1438    def _parse_window(self, this: exp.Expr | None, alias: bool = False) -> exp.Expr | None:
1439        result = super()._parse_window(this, alias)
1440
1441        # Set default window frame for ranking functions if not present
1442        if (
1443            isinstance(result, exp.Window)
1444            and isinstance(this, RANKING_WINDOW_FUNCTIONS_WITH_FRAME)
1445            and not result.args.get("spec")
1446        ):
1447            frame = exp.WindowSpec(
1448                kind="ROWS",
1449                start="UNBOUNDED",
1450                start_side="PRECEDING",
1451                end="UNBOUNDED",
1452                end_side="FOLLOWING",
1453            )
1454            result.set("spec", frame)
1455        return result

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.
IDENTIFY_PIVOT_STRINGS = True
TYPED_LAMBDA_ARGS = True
DEFAULT_SAMPLING_METHOD = 'BERNOULLI'
COLON_IS_VARIANT_EXTRACT = True
JSON_EXTRACT_REQUIRES_JSON_EXPRESSION = True
SUPPORTS_NTH_VALUE_FROM_MODIFIER = True
TYPE_TOKENS = {<TokenType.BIT: 98>, <TokenType.BOOLEAN: 99>, <TokenType.TINYINT: 100>, <TokenType.UTINYINT: 101>, <TokenType.SMALLINT: 102>, <TokenType.USMALLINT: 103>, <TokenType.MEDIUMINT: 104>, <TokenType.UMEDIUMINT: 105>, <TokenType.INT: 106>, <TokenType.UINT: 107>, <TokenType.BIGINT: 108>, <TokenType.UBIGINT: 109>, <TokenType.BIGNUM: 110>, <TokenType.INT128: 111>, <TokenType.UINT128: 112>, <TokenType.INT256: 113>, <TokenType.UINT256: 114>, <TokenType.FLOAT: 115>, <TokenType.DOUBLE: 116>, <TokenType.UDOUBLE: 117>, <TokenType.DECIMAL: 118>, <TokenType.DECIMAL32: 119>, <TokenType.DECIMAL64: 120>, <TokenType.DECIMAL128: 121>, <TokenType.DECIMAL256: 122>, <TokenType.DECFLOAT: 123>, <TokenType.UDECIMAL: 124>, <TokenType.BIGDECIMAL: 125>, <TokenType.CHAR: 126>, <TokenType.NCHAR: 127>, <TokenType.VARCHAR: 128>, <TokenType.NVARCHAR: 129>, <TokenType.BPCHAR: 130>, <TokenType.TEXT: 131>, <TokenType.MEDIUMTEXT: 132>, <TokenType.LONGTEXT: 133>, <TokenType.BLOB: 134>, <TokenType.MEDIUMBLOB: 135>, <TokenType.LONGBLOB: 136>, <TokenType.TINYBLOB: 137>, <TokenType.TINYTEXT: 138>, <TokenType.NAME: 139>, <TokenType.BINARY: 140>, <TokenType.VARBINARY: 141>, <TokenType.JSON: 142>, <TokenType.JSONB: 143>, <TokenType.TIME: 144>, <TokenType.TIMETZ: 145>, <TokenType.TIME_NS: 146>, <TokenType.TIMESTAMP: 147>, <TokenType.TIMESTAMPTZ: 148>, <TokenType.TIMESTAMPLTZ: 149>, <TokenType.TIMESTAMPNTZ: 150>, <TokenType.TIMESTAMP_S: 151>, <TokenType.TIMESTAMP_MS: 152>, <TokenType.TIMESTAMP_NS: 153>, <TokenType.DATETIME: 154>, <TokenType.DATETIME2: 155>, <TokenType.DATETIME64: 156>, <TokenType.SMALLDATETIME: 157>, <TokenType.DATE: 158>, <TokenType.DATE32: 159>, <TokenType.INT4RANGE: 160>, <TokenType.INT4MULTIRANGE: 161>, <TokenType.INT8RANGE: 162>, <TokenType.INT8MULTIRANGE: 163>, <TokenType.NUMRANGE: 164>, <TokenType.NUMMULTIRANGE: 165>, <TokenType.TSRANGE: 166>, <TokenType.TSMULTIRANGE: 167>, <TokenType.TSTZRANGE: 168>, <TokenType.TSTZMULTIRANGE: 169>, <TokenType.DATERANGE: 170>, <TokenType.DATEMULTIRANGE: 171>, <TokenType.UUID: 172>, <TokenType.GEOGRAPHY: 173>, <TokenType.GEOGRAPHYPOINT: 174>, <TokenType.NULLABLE: 175>, <TokenType.GEOMETRY: 176>, <TokenType.POINT: 177>, <TokenType.RING: 178>, <TokenType.LINESTRING: 179>, <TokenType.MULTILINESTRING: 183>, <TokenType.POLYGON: 184>, <TokenType.MULTIPOLYGON: 185>, <TokenType.HLLSKETCH: 186>, <TokenType.HSTORE: 187>, <TokenType.SUPER: 188>, <TokenType.SERIAL: 189>, <TokenType.SMALLSERIAL: 190>, <TokenType.BIGSERIAL: 191>, <TokenType.XML: 192>, <TokenType.YEAR: 193>, <TokenType.USERDEFINED: 194>, <TokenType.MONEY: 195>, <TokenType.SMALLMONEY: 196>, <TokenType.ROWVERSION: 197>, <TokenType.IMAGE: 198>, <TokenType.VARIANT: 199>, <TokenType.OBJECT: 200>, <TokenType.REF: 201>, <TokenType.INET: 202>, <TokenType.IPADDRESS: 203>, <TokenType.IPPREFIX: 204>, <TokenType.IPV4: 205>, <TokenType.IPV6: 206>, <TokenType.ENUM: 207>, <TokenType.ENUM8: 208>, <TokenType.ENUM16: 209>, <TokenType.FIXEDSTRING: 210>, <TokenType.LOWCARDINALITY: 211>, <TokenType.NESTED: 212>, <TokenType.AGGREGATEFUNCTION: 213>, <TokenType.SIMPLEAGGREGATEFUNCTION: 214>, <TokenType.TDIGEST: 215>, <TokenType.UNKNOWN: 216>, <TokenType.VECTOR: 217>, <TokenType.DYNAMIC: 218>, <TokenType.VOID: 219>, <TokenType.ARRAY: 226>, <TokenType.FILE: 278>, <TokenType.INTERVAL: 308>, <TokenType.LIST: 324>, <TokenType.MAP: 327>, <TokenType.NOTHING: 337>, <TokenType.NULL: 339>, <TokenType.OBJECT_IDENTIFIER: 340>, <TokenType.PSEUDO_TYPE: 371>, <TokenType.RANGE: 376>, <TokenType.STRUCT: 408>, <TokenType.UNION: 421>}
STRUCT_TYPE_TOKENS = {<TokenType.UNION: 421>, <TokenType.OBJECT: 200>, <TokenType.NESTED: 212>, <TokenType.FILE: 278>, <TokenType.STRUCT: 408>}
NESTED_TYPE_TOKENS = {<TokenType.ARRAY: 226>, <TokenType.LIST: 324>, <TokenType.STRUCT: 408>, <TokenType.UNION: 421>, <TokenType.MAP: 327>, <TokenType.OBJECT: 200>, <TokenType.NULLABLE: 175>, <TokenType.LOWCARDINALITY: 211>, <TokenType.NESTED: 212>, <TokenType.FILE: 278>, <TokenType.RANGE: 376>}
ID_VAR_TOKENS = {<TokenType.SESSION: 59>, <TokenType.SESSION_USER: 61>, <TokenType.IDENTIFIER: 79>, <TokenType.DATABASE: 80>, <TokenType.COLUMN: 81>, <TokenType.SCHEMA: 83>, <TokenType.TABLE: 84>, <TokenType.WAREHOUSE: 85>, <TokenType.STAGE: 86>, <TokenType.STREAM: 87>, <TokenType.STREAMLIT: 88>, <TokenType.VAR: 89>, <TokenType.BIT: 98>, <TokenType.BOOLEAN: 99>, <TokenType.TINYINT: 100>, <TokenType.UTINYINT: 101>, <TokenType.SMALLINT: 102>, <TokenType.USMALLINT: 103>, <TokenType.MEDIUMINT: 104>, <TokenType.UMEDIUMINT: 105>, <TokenType.INT: 106>, <TokenType.UINT: 107>, <TokenType.BIGINT: 108>, <TokenType.UBIGINT: 109>, <TokenType.BIGNUM: 110>, <TokenType.INT128: 111>, <TokenType.UINT128: 112>, <TokenType.INT256: 113>, <TokenType.UINT256: 114>, <TokenType.FLOAT: 115>, <TokenType.DOUBLE: 116>, <TokenType.UDOUBLE: 117>, <TokenType.DECIMAL: 118>, <TokenType.DECIMAL32: 119>, <TokenType.DECIMAL64: 120>, <TokenType.DECIMAL128: 121>, <TokenType.DECIMAL256: 122>, <TokenType.DECFLOAT: 123>, <TokenType.UDECIMAL: 124>, <TokenType.BIGDECIMAL: 125>, <TokenType.CHAR: 126>, <TokenType.NCHAR: 127>, <TokenType.VARCHAR: 128>, <TokenType.NVARCHAR: 129>, <TokenType.BPCHAR: 130>, <TokenType.TEXT: 131>, <TokenType.MEDIUMTEXT: 132>, <TokenType.LONGTEXT: 133>, <TokenType.BLOB: 134>, <TokenType.MEDIUMBLOB: 135>, <TokenType.LONGBLOB: 136>, <TokenType.TINYBLOB: 137>, <TokenType.TINYTEXT: 138>, <TokenType.NAME: 139>, <TokenType.BINARY: 140>, <TokenType.VARBINARY: 141>, <TokenType.JSON: 142>, <TokenType.JSONB: 143>, <TokenType.TIME: 144>, <TokenType.TIMETZ: 145>, <TokenType.TIME_NS: 146>, <TokenType.TIMESTAMP: 147>, <TokenType.TIMESTAMPTZ: 148>, <TokenType.TIMESTAMPLTZ: 149>, <TokenType.TIMESTAMPNTZ: 150>, <TokenType.TIMESTAMP_S: 151>, <TokenType.TIMESTAMP_MS: 152>, <TokenType.TIMESTAMP_NS: 153>, <TokenType.DATETIME: 154>, <TokenType.DATETIME2: 155>, <TokenType.DATETIME64: 156>, <TokenType.SMALLDATETIME: 157>, <TokenType.DATE: 158>, <TokenType.DATE32: 159>, <TokenType.INT4RANGE: 160>, <TokenType.INT4MULTIRANGE: 161>, <TokenType.INT8RANGE: 162>, <TokenType.INT8MULTIRANGE: 163>, <TokenType.NUMRANGE: 164>, <TokenType.NUMMULTIRANGE: 165>, <TokenType.TSRANGE: 166>, <TokenType.TSMULTIRANGE: 167>, <TokenType.TSTZRANGE: 168>, <TokenType.TSTZMULTIRANGE: 169>, <TokenType.DATERANGE: 170>, <TokenType.DATEMULTIRANGE: 171>, <TokenType.UUID: 172>, <TokenType.GEOGRAPHY: 173>, <TokenType.GEOGRAPHYPOINT: 174>, <TokenType.NULLABLE: 175>, <TokenType.GEOMETRY: 176>, <TokenType.POINT: 177>, <TokenType.RING: 178>, <TokenType.LINESTRING: 179>, <TokenType.LOCALTIME: 180>, <TokenType.LOCALTIMESTAMP: 181>, <TokenType.MULTILINESTRING: 183>, <TokenType.POLYGON: 184>, <TokenType.MULTIPOLYGON: 185>, <TokenType.HLLSKETCH: 186>, <TokenType.HSTORE: 187>, <TokenType.SUPER: 188>, <TokenType.SERIAL: 189>, <TokenType.SMALLSERIAL: 190>, <TokenType.BIGSERIAL: 191>, <TokenType.XML: 192>, <TokenType.YEAR: 193>, <TokenType.USERDEFINED: 194>, <TokenType.MONEY: 195>, <TokenType.SMALLMONEY: 196>, <TokenType.ROWVERSION: 197>, <TokenType.IMAGE: 198>, <TokenType.VARIANT: 199>, <TokenType.OBJECT: 200>, <TokenType.REF: 201>, <TokenType.INET: 202>, <TokenType.IPADDRESS: 203>, <TokenType.IPPREFIX: 204>, <TokenType.IPV4: 205>, <TokenType.IPV6: 206>, <TokenType.ENUM: 207>, <TokenType.ENUM8: 208>, <TokenType.ENUM16: 209>, <TokenType.FIXEDSTRING: 210>, <TokenType.LOWCARDINALITY: 211>, <TokenType.NESTED: 212>, <TokenType.AGGREGATEFUNCTION: 213>, <TokenType.SIMPLEAGGREGATEFUNCTION: 214>, <TokenType.TDIGEST: 215>, <TokenType.UNKNOWN: 216>, <TokenType.VECTOR: 217>, <TokenType.DYNAMIC: 218>, <TokenType.VOID: 219>, <TokenType.ALL: 222>, <TokenType.ANTI: 223>, <TokenType.ANY: 224>, <TokenType.APPLY: 225>, <TokenType.ARRAY: 226>, <TokenType.ASC: 227>, <TokenType.ASOF: 228>, <TokenType.ATTACH: 229>, <TokenType.AUTO_INCREMENT: 230>, <TokenType.BEGIN: 231>, <TokenType.CACHE: 234>, <TokenType.CASE: 235>, <TokenType.COLLATE: 238>, <TokenType.COMMAND: 239>, <TokenType.COMMENT: 240>, <TokenType.COMMIT: 241>, <TokenType.CONNECT: 242>, <TokenType.CONSTRAINT: 244>, <TokenType.COPY: 245>, <TokenType.CUBE: 248>, <TokenType.CURRENT_DATE: 249>, <TokenType.CURRENT_DATETIME: 250>, <TokenType.CURRENT_SCHEMA: 251>, <TokenType.CURRENT_TIME: 252>, <TokenType.CURRENT_TIMESTAMP: 253>, <TokenType.CURRENT_USER: 254>, <TokenType.CURRENT_ROLE: 256>, <TokenType.CURRENT_CATALOG: 257>, <TokenType.DECLARE: 258>, <TokenType.DEFAULT: 259>, <TokenType.DELETE: 260>, <TokenType.DESC: 261>, <TokenType.DESCRIBE: 262>, <TokenType.DETACH: 263>, <TokenType.DISCONNECT: 264>, <TokenType.DICTIONARY: 265>, <TokenType.DIV: 268>, <TokenType.END: 271>, <TokenType.ESCAPE: 272>, <TokenType.EXCEPT: 273>, <TokenType.EXECUTE: 274>, <TokenType.EXISTS: 275>, <TokenType.FALSE: 276>, <TokenType.FILE: 278>, <TokenType.FILE_FORMAT: 279>, <TokenType.FILTER: 280>, <TokenType.FINAL: 281>, <TokenType.FIRST: 282>, <TokenType.FOREIGN_KEY: 285>, <TokenType.FORMAT: 286>, <TokenType.FULL: 288>, <TokenType.FUNCTION: 289>, <TokenType.GET: 290>, <TokenType.IN: 300>, <TokenType.INDEX: 301>, <TokenType.INTEGRATION: 306>, <TokenType.INTERVAL: 308>, <TokenType.IS: 312>, <TokenType.ISNULL: 313>, <TokenType.KEEP: 316>, <TokenType.KILL: 318>, <TokenType.LATERAL: 320>, <TokenType.LEFT: 321>, <TokenType.LIMIT: 323>, <TokenType.LIST: 324>, <TokenType.LOAD: 325>, <TokenType.LOCK: 326>, <TokenType.MAP: 327>, <TokenType.MATCH: 328>, <TokenType.MATCH_CONDITION: 329>, <TokenType.MERGE: 332>, <TokenType.MODEL: 334>, <TokenType.NATURAL: 335>, <TokenType.NEXT: 336>, <TokenType.NOTHING: 337>, <TokenType.NULL: 339>, <TokenType.OBJECT_IDENTIFIER: 340>, <TokenType.OFFSET: 341>, <TokenType.OPERATOR: 344>, <TokenType.ORDINALITY: 348>, <TokenType.OUT: 349>, <TokenType.INOUT: 350>, <TokenType.OVER: 352>, <TokenType.OVERLAPS: 353>, <TokenType.OVERWRITE: 354>, <TokenType.PACKAGE: 355>, <TokenType.PARTITION: 356>, <TokenType.PASTE: 358>, <TokenType.PERCENT: 359>, <TokenType.PIVOT: 360>, <TokenType.POLICY: 362>, <TokenType.POOL: 363>, <TokenType.PRAGMA: 365>, <TokenType.PROCEDURE: 368>, <TokenType.PROJECTION: 370>, <TokenType.PSEUDO_TYPE: 371>, <TokenType.PUT: 372>, <TokenType.RANGE: 376>, <TokenType.RECURSIVE: 377>, <TokenType.REFRESH: 378>, <TokenType.RENAME: 379>, <TokenType.REPLACE: 380>, <TokenType.REFERENCES: 383>, <TokenType.RIGHT: 384>, <TokenType.ROLE: 386>, <TokenType.ROLLBACK: 387>, <TokenType.ROLLUP: 388>, <TokenType.ROW: 389>, <TokenType.ROWS: 390>, <TokenType.RULE: 391>, <TokenType.SEMI: 393>, <TokenType.SEQUENCE: 395>, <TokenType.SET: 397>, <TokenType.SETTINGS: 398>, <TokenType.SHOW: 399>, <TokenType.SOME: 401>, <TokenType.STORAGE_INTEGRATION: 406>, <TokenType.STRAIGHT_JOIN: 407>, <TokenType.STRUCT: 408>, <TokenType.TAG: 411>, <TokenType.TEMPORARY: 412>, <TokenType.TOP: 413>, <TokenType.TRUE: 415>, <TokenType.TRUNCATE: 416>, <TokenType.TRIGGER: 417>, <TokenType.TYPE: 418>, <TokenType.UNNEST: 422>, <TokenType.UNPIVOT: 423>, <TokenType.UPDATE: 424>, <TokenType.USE: 425>, <TokenType.USING: 426>, <TokenType.VIEW: 429>, <TokenType.SEMANTIC_VIEW: 430>, <TokenType.VOLATILE: 431>, <TokenType.VOLUME: 432>, <TokenType.WINDOW: 435>, <TokenType.UNIQUE: 437>, <TokenType.SINK: 442>, <TokenType.SOURCE: 443>, <TokenType.ANALYZE: 444>, <TokenType.NAMESPACE: 445>, <TokenType.EXPORT: 446>}
FUNC_TOKENS = {<TokenType.SESSION_USER: 61>, <TokenType.XOR: 66>, <TokenType.IDENTIFIER: 79>, <TokenType.TABLE: 84>, <TokenType.VAR: 89>, <TokenType.BIT: 98>, <TokenType.BOOLEAN: 99>, <TokenType.TINYINT: 100>, <TokenType.UTINYINT: 101>, <TokenType.SMALLINT: 102>, <TokenType.USMALLINT: 103>, <TokenType.MEDIUMINT: 104>, <TokenType.UMEDIUMINT: 105>, <TokenType.INT: 106>, <TokenType.UINT: 107>, <TokenType.BIGINT: 108>, <TokenType.UBIGINT: 109>, <TokenType.BIGNUM: 110>, <TokenType.INT128: 111>, <TokenType.UINT128: 112>, <TokenType.INT256: 113>, <TokenType.UINT256: 114>, <TokenType.FLOAT: 115>, <TokenType.DOUBLE: 116>, <TokenType.UDOUBLE: 117>, <TokenType.DECIMAL: 118>, <TokenType.DECIMAL32: 119>, <TokenType.DECIMAL64: 120>, <TokenType.DECIMAL128: 121>, <TokenType.DECIMAL256: 122>, <TokenType.DECFLOAT: 123>, <TokenType.UDECIMAL: 124>, <TokenType.BIGDECIMAL: 125>, <TokenType.CHAR: 126>, <TokenType.NCHAR: 127>, <TokenType.VARCHAR: 128>, <TokenType.NVARCHAR: 129>, <TokenType.BPCHAR: 130>, <TokenType.TEXT: 131>, <TokenType.MEDIUMTEXT: 132>, <TokenType.LONGTEXT: 133>, <TokenType.BLOB: 134>, <TokenType.MEDIUMBLOB: 135>, <TokenType.LONGBLOB: 136>, <TokenType.TINYBLOB: 137>, <TokenType.TINYTEXT: 138>, <TokenType.NAME: 139>, <TokenType.BINARY: 140>, <TokenType.VARBINARY: 141>, <TokenType.JSON: 142>, <TokenType.JSONB: 143>, <TokenType.TIME: 144>, <TokenType.TIMETZ: 145>, <TokenType.TIME_NS: 146>, <TokenType.TIMESTAMP: 147>, <TokenType.TIMESTAMPTZ: 148>, <TokenType.TIMESTAMPLTZ: 149>, <TokenType.TIMESTAMPNTZ: 150>, <TokenType.TIMESTAMP_S: 151>, <TokenType.TIMESTAMP_MS: 152>, <TokenType.TIMESTAMP_NS: 153>, <TokenType.DATETIME: 154>, <TokenType.DATETIME2: 155>, <TokenType.DATETIME64: 156>, <TokenType.SMALLDATETIME: 157>, <TokenType.DATE: 158>, <TokenType.DATE32: 159>, <TokenType.INT4RANGE: 160>, <TokenType.INT4MULTIRANGE: 161>, <TokenType.INT8RANGE: 162>, <TokenType.INT8MULTIRANGE: 163>, <TokenType.NUMRANGE: 164>, <TokenType.NUMMULTIRANGE: 165>, <TokenType.TSRANGE: 166>, <TokenType.TSMULTIRANGE: 167>, <TokenType.TSTZRANGE: 168>, <TokenType.TSTZMULTIRANGE: 169>, <TokenType.DATERANGE: 170>, <TokenType.DATEMULTIRANGE: 171>, <TokenType.UUID: 172>, <TokenType.GEOGRAPHY: 173>, <TokenType.GEOGRAPHYPOINT: 174>, <TokenType.NULLABLE: 175>, <TokenType.GEOMETRY: 176>, <TokenType.POINT: 177>, <TokenType.RING: 178>, <TokenType.LINESTRING: 179>, <TokenType.LOCALTIME: 180>, <TokenType.LOCALTIMESTAMP: 181>, <TokenType.MULTILINESTRING: 183>, <TokenType.POLYGON: 184>, <TokenType.MULTIPOLYGON: 185>, <TokenType.HLLSKETCH: 186>, <TokenType.HSTORE: 187>, <TokenType.SUPER: 188>, <TokenType.SERIAL: 189>, <TokenType.SMALLSERIAL: 190>, <TokenType.BIGSERIAL: 191>, <TokenType.XML: 192>, <TokenType.YEAR: 193>, <TokenType.USERDEFINED: 194>, <TokenType.MONEY: 195>, <TokenType.SMALLMONEY: 196>, <TokenType.ROWVERSION: 197>, <TokenType.IMAGE: 198>, <TokenType.VARIANT: 199>, <TokenType.OBJECT: 200>, <TokenType.REF: 201>, <TokenType.INET: 202>, <TokenType.IPADDRESS: 203>, <TokenType.IPPREFIX: 204>, <TokenType.IPV4: 205>, <TokenType.IPV6: 206>, <TokenType.ENUM: 207>, <TokenType.ENUM8: 208>, <TokenType.ENUM16: 209>, <TokenType.FIXEDSTRING: 210>, <TokenType.LOWCARDINALITY: 211>, <TokenType.NESTED: 212>, <TokenType.AGGREGATEFUNCTION: 213>, <TokenType.SIMPLEAGGREGATEFUNCTION: 214>, <TokenType.TDIGEST: 215>, <TokenType.UNKNOWN: 216>, <TokenType.VECTOR: 217>, <TokenType.DYNAMIC: 218>, <TokenType.VOID: 219>, <TokenType.ALL: 222>, <TokenType.ANY: 224>, <TokenType.ARRAY: 226>, <TokenType.COLLATE: 238>, <TokenType.COMMAND: 239>, <TokenType.CURRENT_DATE: 249>, <TokenType.CURRENT_DATETIME: 250>, <TokenType.CURRENT_SCHEMA: 251>, <TokenType.CURRENT_TIME: 252>, <TokenType.CURRENT_TIMESTAMP: 253>, <TokenType.CURRENT_USER: 254>, <TokenType.CURRENT_CATALOG: 257>, <TokenType.DECLARE: 258>, <TokenType.EXISTS: 275>, <TokenType.FILTER: 280>, <TokenType.FIRST: 282>, <TokenType.FORMAT: 286>, <TokenType.GET: 290>, <TokenType.GLOB: 291>, <TokenType.ILIKE: 299>, <TokenType.INDEX: 301>, <TokenType.INSERT: 304>, <TokenType.INTERVAL: 308>, <TokenType.ISNULL: 313>, <TokenType.LEFT: 321>, <TokenType.LIKE: 322>, <TokenType.LIST: 324>, <TokenType.MAP: 327>, <TokenType.MERGE: 332>, <TokenType.NEXT: 336>, <TokenType.NOTHING: 337>, <TokenType.NULL: 339>, <TokenType.OBJECT_IDENTIFIER: 340>, <TokenType.OFFSET: 341>, <TokenType.PRIMARY_KEY: 367>, <TokenType.PSEUDO_TYPE: 371>, <TokenType.RANGE: 376>, <TokenType.REPLACE: 380>, <TokenType.RIGHT: 384>, <TokenType.RLIKE: 385>, <TokenType.ROLLBACK: 387>, <TokenType.ROW: 389>, <TokenType.SEQUENCE: 395>, <TokenType.SOME: 401>, <TokenType.STRUCT: 408>, <TokenType.TRUNCATE: 416>, <TokenType.UNION: 421>, <TokenType.UNNEST: 422>, <TokenType.WINDOW: 435>, <TokenType.UTC_DATE: 438>, <TokenType.UTC_TIME: 439>, <TokenType.UTC_TIMESTAMP: 440>}
ALIAS_TOKENS = {<TokenType.SESSION: 59>, <TokenType.SESSION_USER: 61>, <TokenType.IDENTIFIER: 79>, <TokenType.DATABASE: 80>, <TokenType.COLUMN: 81>, <TokenType.SCHEMA: 83>, <TokenType.TABLE: 84>, <TokenType.WAREHOUSE: 85>, <TokenType.STAGE: 86>, <TokenType.STREAM: 87>, <TokenType.STREAMLIT: 88>, <TokenType.VAR: 89>, <TokenType.BIT: 98>, <TokenType.BOOLEAN: 99>, <TokenType.TINYINT: 100>, <TokenType.UTINYINT: 101>, <TokenType.SMALLINT: 102>, <TokenType.USMALLINT: 103>, <TokenType.MEDIUMINT: 104>, <TokenType.UMEDIUMINT: 105>, <TokenType.INT: 106>, <TokenType.UINT: 107>, <TokenType.BIGINT: 108>, <TokenType.UBIGINT: 109>, <TokenType.BIGNUM: 110>, <TokenType.INT128: 111>, <TokenType.UINT128: 112>, <TokenType.INT256: 113>, <TokenType.UINT256: 114>, <TokenType.FLOAT: 115>, <TokenType.DOUBLE: 116>, <TokenType.UDOUBLE: 117>, <TokenType.DECIMAL: 118>, <TokenType.DECIMAL32: 119>, <TokenType.DECIMAL64: 120>, <TokenType.DECIMAL128: 121>, <TokenType.DECIMAL256: 122>, <TokenType.DECFLOAT: 123>, <TokenType.UDECIMAL: 124>, <TokenType.BIGDECIMAL: 125>, <TokenType.CHAR: 126>, <TokenType.NCHAR: 127>, <TokenType.VARCHAR: 128>, <TokenType.NVARCHAR: 129>, <TokenType.BPCHAR: 130>, <TokenType.TEXT: 131>, <TokenType.MEDIUMTEXT: 132>, <TokenType.LONGTEXT: 133>, <TokenType.BLOB: 134>, <TokenType.MEDIUMBLOB: 135>, <TokenType.LONGBLOB: 136>, <TokenType.TINYBLOB: 137>, <TokenType.TINYTEXT: 138>, <TokenType.NAME: 139>, <TokenType.BINARY: 140>, <TokenType.VARBINARY: 141>, <TokenType.JSON: 142>, <TokenType.JSONB: 143>, <TokenType.TIME: 144>, <TokenType.TIMETZ: 145>, <TokenType.TIME_NS: 146>, <TokenType.TIMESTAMP: 147>, <TokenType.TIMESTAMPTZ: 148>, <TokenType.TIMESTAMPLTZ: 149>, <TokenType.TIMESTAMPNTZ: 150>, <TokenType.TIMESTAMP_S: 151>, <TokenType.TIMESTAMP_MS: 152>, <TokenType.TIMESTAMP_NS: 153>, <TokenType.DATETIME: 154>, <TokenType.DATETIME2: 155>, <TokenType.DATETIME64: 156>, <TokenType.SMALLDATETIME: 157>, <TokenType.DATE: 158>, <TokenType.DATE32: 159>, <TokenType.INT4RANGE: 160>, <TokenType.INT4MULTIRANGE: 161>, <TokenType.INT8RANGE: 162>, <TokenType.INT8MULTIRANGE: 163>, <TokenType.NUMRANGE: 164>, <TokenType.NUMMULTIRANGE: 165>, <TokenType.TSRANGE: 166>, <TokenType.TSMULTIRANGE: 167>, <TokenType.TSTZRANGE: 168>, <TokenType.TSTZMULTIRANGE: 169>, <TokenType.DATERANGE: 170>, <TokenType.DATEMULTIRANGE: 171>, <TokenType.UUID: 172>, <TokenType.GEOGRAPHY: 173>, <TokenType.GEOGRAPHYPOINT: 174>, <TokenType.NULLABLE: 175>, <TokenType.GEOMETRY: 176>, <TokenType.POINT: 177>, <TokenType.RING: 178>, <TokenType.LINESTRING: 179>, <TokenType.LOCALTIME: 180>, <TokenType.LOCALTIMESTAMP: 181>, <TokenType.MULTILINESTRING: 183>, <TokenType.POLYGON: 184>, <TokenType.MULTIPOLYGON: 185>, <TokenType.HLLSKETCH: 186>, <TokenType.HSTORE: 187>, <TokenType.SUPER: 188>, <TokenType.SERIAL: 189>, <TokenType.SMALLSERIAL: 190>, <TokenType.BIGSERIAL: 191>, <TokenType.XML: 192>, <TokenType.YEAR: 193>, <TokenType.USERDEFINED: 194>, <TokenType.MONEY: 195>, <TokenType.SMALLMONEY: 196>, <TokenType.ROWVERSION: 197>, <TokenType.IMAGE: 198>, <TokenType.VARIANT: 199>, <TokenType.OBJECT: 200>, <TokenType.REF: 201>, <TokenType.INET: 202>, <TokenType.IPADDRESS: 203>, <TokenType.IPPREFIX: 204>, <TokenType.IPV4: 205>, <TokenType.IPV6: 206>, <TokenType.ENUM: 207>, <TokenType.ENUM8: 208>, <TokenType.ENUM16: 209>, <TokenType.FIXEDSTRING: 210>, <TokenType.LOWCARDINALITY: 211>, <TokenType.NESTED: 212>, <TokenType.AGGREGATEFUNCTION: 213>, <TokenType.SIMPLEAGGREGATEFUNCTION: 214>, <TokenType.TDIGEST: 215>, <TokenType.UNKNOWN: 216>, <TokenType.VECTOR: 217>, <TokenType.DYNAMIC: 218>, <TokenType.VOID: 219>, <TokenType.ALL: 222>, <TokenType.ANTI: 223>, <TokenType.ANY: 224>, <TokenType.APPLY: 225>, <TokenType.ARRAY: 226>, <TokenType.ASC: 227>, <TokenType.ASOF: 228>, <TokenType.ATTACH: 229>, <TokenType.AUTO_INCREMENT: 230>, <TokenType.BEGIN: 231>, <TokenType.CACHE: 234>, <TokenType.CASE: 235>, <TokenType.COLLATE: 238>, <TokenType.COMMAND: 239>, <TokenType.COMMENT: 240>, <TokenType.COMMIT: 241>, <TokenType.CONNECT: 242>, <TokenType.CONSTRAINT: 244>, <TokenType.COPY: 245>, <TokenType.CUBE: 248>, <TokenType.CURRENT_DATE: 249>, <TokenType.CURRENT_DATETIME: 250>, <TokenType.CURRENT_SCHEMA: 251>, <TokenType.CURRENT_TIME: 252>, <TokenType.CURRENT_TIMESTAMP: 253>, <TokenType.CURRENT_USER: 254>, <TokenType.CURRENT_ROLE: 256>, <TokenType.CURRENT_CATALOG: 257>, <TokenType.DECLARE: 258>, <TokenType.DEFAULT: 259>, <TokenType.DELETE: 260>, <TokenType.DESC: 261>, <TokenType.DESCRIBE: 262>, <TokenType.DETACH: 263>, <TokenType.DISCONNECT: 264>, <TokenType.DICTIONARY: 265>, <TokenType.DIV: 268>, <TokenType.END: 271>, <TokenType.ESCAPE: 272>, <TokenType.EXECUTE: 274>, <TokenType.EXISTS: 275>, <TokenType.FALSE: 276>, <TokenType.FILE: 278>, <TokenType.FILE_FORMAT: 279>, <TokenType.FILTER: 280>, <TokenType.FINAL: 281>, <TokenType.FIRST: 282>, <TokenType.FOREIGN_KEY: 285>, <TokenType.FORMAT: 286>, <TokenType.FULL: 288>, <TokenType.FUNCTION: 289>, <TokenType.GET: 290>, <TokenType.IN: 300>, <TokenType.INDEX: 301>, <TokenType.INTEGRATION: 306>, <TokenType.INTERVAL: 308>, <TokenType.IS: 312>, <TokenType.ISNULL: 313>, <TokenType.KEEP: 316>, <TokenType.KILL: 318>, <TokenType.LATERAL: 320>, <TokenType.LEFT: 321>, <TokenType.LIMIT: 323>, <TokenType.LIST: 324>, <TokenType.LOAD: 325>, <TokenType.LOCK: 326>, <TokenType.MAP: 327>, <TokenType.MATCH: 328>, <TokenType.MERGE: 332>, <TokenType.MODEL: 334>, <TokenType.NATURAL: 335>, <TokenType.NEXT: 336>, <TokenType.NOTHING: 337>, <TokenType.NULL: 339>, <TokenType.OBJECT_IDENTIFIER: 340>, <TokenType.OFFSET: 341>, <TokenType.OPERATOR: 344>, <TokenType.ORDINALITY: 348>, <TokenType.OUT: 349>, <TokenType.INOUT: 350>, <TokenType.OVER: 352>, <TokenType.OVERLAPS: 353>, <TokenType.OVERWRITE: 354>, <TokenType.PACKAGE: 355>, <TokenType.PARTITION: 356>, <TokenType.PASTE: 358>, <TokenType.PERCENT: 359>, <TokenType.PIVOT: 360>, <TokenType.POLICY: 362>, <TokenType.POOL: 363>, <TokenType.PRAGMA: 365>, <TokenType.PROCEDURE: 368>, <TokenType.PROJECTION: 370>, <TokenType.PSEUDO_TYPE: 371>, <TokenType.PUT: 372>, <TokenType.RANGE: 376>, <TokenType.RECURSIVE: 377>, <TokenType.REFRESH: 378>, <TokenType.RENAME: 379>, <TokenType.REPLACE: 380>, <TokenType.REFERENCES: 383>, <TokenType.RIGHT: 384>, <TokenType.ROLE: 386>, <TokenType.ROLLBACK: 387>, <TokenType.ROLLUP: 388>, <TokenType.ROW: 389>, <TokenType.ROWS: 390>, <TokenType.RULE: 391>, <TokenType.SEMI: 393>, <TokenType.SEQUENCE: 395>, <TokenType.SET: 397>, <TokenType.SETTINGS: 398>, <TokenType.SHOW: 399>, <TokenType.SOME: 401>, <TokenType.STORAGE_INTEGRATION: 406>, <TokenType.STRAIGHT_JOIN: 407>, <TokenType.STRUCT: 408>, <TokenType.TAG: 411>, <TokenType.TEMPORARY: 412>, <TokenType.TOP: 413>, <TokenType.TRUE: 415>, <TokenType.TRUNCATE: 416>, <TokenType.TRIGGER: 417>, <TokenType.TYPE: 418>, <TokenType.UNNEST: 422>, <TokenType.UNPIVOT: 423>, <TokenType.UPDATE: 424>, <TokenType.USE: 425>, <TokenType.USING: 426>, <TokenType.VIEW: 429>, <TokenType.SEMANTIC_VIEW: 430>, <TokenType.VOLATILE: 431>, <TokenType.VOLUME: 432>, <TokenType.WINDOW: 435>, <TokenType.UNIQUE: 437>, <TokenType.SINK: 442>, <TokenType.SOURCE: 443>, <TokenType.ANALYZE: 444>, <TokenType.NAMESPACE: 445>, <TokenType.EXPORT: 446>}
TABLE_ALIAS_TOKENS = {<TokenType.SESSION: 59>, <TokenType.SESSION_USER: 61>, <TokenType.IDENTIFIER: 79>, <TokenType.DATABASE: 80>, <TokenType.COLUMN: 81>, <TokenType.SCHEMA: 83>, <TokenType.TABLE: 84>, <TokenType.WAREHOUSE: 85>, <TokenType.STAGE: 86>, <TokenType.STREAM: 87>, <TokenType.STREAMLIT: 88>, <TokenType.VAR: 89>, <TokenType.BIT: 98>, <TokenType.BOOLEAN: 99>, <TokenType.TINYINT: 100>, <TokenType.UTINYINT: 101>, <TokenType.SMALLINT: 102>, <TokenType.USMALLINT: 103>, <TokenType.MEDIUMINT: 104>, <TokenType.UMEDIUMINT: 105>, <TokenType.INT: 106>, <TokenType.UINT: 107>, <TokenType.BIGINT: 108>, <TokenType.UBIGINT: 109>, <TokenType.BIGNUM: 110>, <TokenType.INT128: 111>, <TokenType.UINT128: 112>, <TokenType.INT256: 113>, <TokenType.UINT256: 114>, <TokenType.FLOAT: 115>, <TokenType.DOUBLE: 116>, <TokenType.UDOUBLE: 117>, <TokenType.DECIMAL: 118>, <TokenType.DECIMAL32: 119>, <TokenType.DECIMAL64: 120>, <TokenType.DECIMAL128: 121>, <TokenType.DECIMAL256: 122>, <TokenType.DECFLOAT: 123>, <TokenType.UDECIMAL: 124>, <TokenType.BIGDECIMAL: 125>, <TokenType.CHAR: 126>, <TokenType.NCHAR: 127>, <TokenType.VARCHAR: 128>, <TokenType.NVARCHAR: 129>, <TokenType.BPCHAR: 130>, <TokenType.TEXT: 131>, <TokenType.MEDIUMTEXT: 132>, <TokenType.LONGTEXT: 133>, <TokenType.BLOB: 134>, <TokenType.MEDIUMBLOB: 135>, <TokenType.LONGBLOB: 136>, <TokenType.TINYBLOB: 137>, <TokenType.TINYTEXT: 138>, <TokenType.NAME: 139>, <TokenType.BINARY: 140>, <TokenType.VARBINARY: 141>, <TokenType.JSON: 142>, <TokenType.JSONB: 143>, <TokenType.TIME: 144>, <TokenType.TIMETZ: 145>, <TokenType.TIME_NS: 146>, <TokenType.TIMESTAMP: 147>, <TokenType.TIMESTAMPTZ: 148>, <TokenType.TIMESTAMPLTZ: 149>, <TokenType.TIMESTAMPNTZ: 150>, <TokenType.TIMESTAMP_S: 151>, <TokenType.TIMESTAMP_MS: 152>, <TokenType.TIMESTAMP_NS: 153>, <TokenType.DATETIME: 154>, <TokenType.DATETIME2: 155>, <TokenType.DATETIME64: 156>, <TokenType.SMALLDATETIME: 157>, <TokenType.DATE: 158>, <TokenType.DATE32: 159>, <TokenType.INT4RANGE: 160>, <TokenType.INT4MULTIRANGE: 161>, <TokenType.INT8RANGE: 162>, <TokenType.INT8MULTIRANGE: 163>, <TokenType.NUMRANGE: 164>, <TokenType.NUMMULTIRANGE: 165>, <TokenType.TSRANGE: 166>, <TokenType.TSMULTIRANGE: 167>, <TokenType.TSTZRANGE: 168>, <TokenType.TSTZMULTIRANGE: 169>, <TokenType.DATERANGE: 170>, <TokenType.DATEMULTIRANGE: 171>, <TokenType.UUID: 172>, <TokenType.GEOGRAPHY: 173>, <TokenType.GEOGRAPHYPOINT: 174>, <TokenType.NULLABLE: 175>, <TokenType.GEOMETRY: 176>, <TokenType.POINT: 177>, <TokenType.RING: 178>, <TokenType.LINESTRING: 179>, <TokenType.LOCALTIME: 180>, <TokenType.LOCALTIMESTAMP: 181>, <TokenType.MULTILINESTRING: 183>, <TokenType.POLYGON: 184>, <TokenType.MULTIPOLYGON: 185>, <TokenType.HLLSKETCH: 186>, <TokenType.HSTORE: 187>, <TokenType.SUPER: 188>, <TokenType.SERIAL: 189>, <TokenType.SMALLSERIAL: 190>, <TokenType.BIGSERIAL: 191>, <TokenType.XML: 192>, <TokenType.YEAR: 193>, <TokenType.USERDEFINED: 194>, <TokenType.MONEY: 195>, <TokenType.SMALLMONEY: 196>, <TokenType.ROWVERSION: 197>, <TokenType.IMAGE: 198>, <TokenType.VARIANT: 199>, <TokenType.OBJECT: 200>, <TokenType.REF: 201>, <TokenType.INET: 202>, <TokenType.IPADDRESS: 203>, <TokenType.IPPREFIX: 204>, <TokenType.IPV4: 205>, <TokenType.IPV6: 206>, <TokenType.ENUM: 207>, <TokenType.ENUM8: 208>, <TokenType.ENUM16: 209>, <TokenType.FIXEDSTRING: 210>, <TokenType.LOWCARDINALITY: 211>, <TokenType.NESTED: 212>, <TokenType.AGGREGATEFUNCTION: 213>, <TokenType.SIMPLEAGGREGATEFUNCTION: 214>, <TokenType.TDIGEST: 215>, <TokenType.UNKNOWN: 216>, <TokenType.VECTOR: 217>, <TokenType.DYNAMIC: 218>, <TokenType.VOID: 219>, <TokenType.ALL: 222>, <TokenType.ANTI: 223>, <TokenType.ANY: 224>, <TokenType.APPLY: 225>, <TokenType.ARRAY: 226>, <TokenType.ASC: 227>, <TokenType.ATTACH: 229>, <TokenType.AUTO_INCREMENT: 230>, <TokenType.BEGIN: 231>, <TokenType.CACHE: 234>, <TokenType.CASE: 235>, <TokenType.COLLATE: 238>, <TokenType.COMMAND: 239>, <TokenType.COMMENT: 240>, <TokenType.COMMIT: 241>, <TokenType.CONNECT: 242>, <TokenType.CONSTRAINT: 244>, <TokenType.COPY: 245>, <TokenType.CUBE: 248>, <TokenType.CURRENT_DATE: 249>, <TokenType.CURRENT_DATETIME: 250>, <TokenType.CURRENT_SCHEMA: 251>, <TokenType.CURRENT_TIME: 252>, <TokenType.CURRENT_TIMESTAMP: 253>, <TokenType.CURRENT_USER: 254>, <TokenType.CURRENT_ROLE: 256>, <TokenType.CURRENT_CATALOG: 257>, <TokenType.DECLARE: 258>, <TokenType.DEFAULT: 259>, <TokenType.DELETE: 260>, <TokenType.DESC: 261>, <TokenType.DESCRIBE: 262>, <TokenType.DETACH: 263>, <TokenType.DISCONNECT: 264>, <TokenType.DICTIONARY: 265>, <TokenType.DIV: 268>, <TokenType.END: 271>, <TokenType.ESCAPE: 272>, <TokenType.EXECUTE: 274>, <TokenType.EXISTS: 275>, <TokenType.FALSE: 276>, <TokenType.FILE: 278>, <TokenType.FILE_FORMAT: 279>, <TokenType.FILTER: 280>, <TokenType.FINAL: 281>, <TokenType.FIRST: 282>, <TokenType.FOREIGN_KEY: 285>, <TokenType.FORMAT: 286>, <TokenType.FUNCTION: 289>, <TokenType.GET: 290>, <TokenType.IN: 300>, <TokenType.INDEX: 301>, <TokenType.INTEGRATION: 306>, <TokenType.INTERVAL: 308>, <TokenType.IS: 312>, <TokenType.ISNULL: 313>, <TokenType.KEEP: 316>, <TokenType.KILL: 318>, <TokenType.LIMIT: 323>, <TokenType.LIST: 324>, <TokenType.LOAD: 325>, <TokenType.MAP: 327>, <TokenType.MATCH: 328>, <TokenType.MERGE: 332>, <TokenType.MODEL: 334>, <TokenType.NEXT: 336>, <TokenType.NOTHING: 337>, <TokenType.NULL: 339>, <TokenType.OBJECT_IDENTIFIER: 340>, <TokenType.OFFSET: 341>, <TokenType.OPERATOR: 344>, <TokenType.ORDINALITY: 348>, <TokenType.OUT: 349>, <TokenType.INOUT: 350>, <TokenType.OVER: 352>, <TokenType.OVERLAPS: 353>, <TokenType.OVERWRITE: 354>, <TokenType.PACKAGE: 355>, <TokenType.PARTITION: 356>, <TokenType.PASTE: 358>, <TokenType.PERCENT: 359>, <TokenType.PIVOT: 360>, <TokenType.POLICY: 362>, <TokenType.POOL: 363>, <TokenType.PRAGMA: 365>, <TokenType.PROCEDURE: 368>, <TokenType.PROJECTION: 370>, <TokenType.PSEUDO_TYPE: 371>, <TokenType.PUT: 372>, <TokenType.RANGE: 376>, <TokenType.RECURSIVE: 377>, <TokenType.REFRESH: 378>, <TokenType.RENAME: 379>, <TokenType.REPLACE: 380>, <TokenType.REFERENCES: 383>, <TokenType.ROLE: 386>, <TokenType.ROLLBACK: 387>, <TokenType.ROLLUP: 388>, <TokenType.ROW: 389>, <TokenType.ROWS: 390>, <TokenType.RULE: 391>, <TokenType.SEMI: 393>, <TokenType.SEQUENCE: 395>, <TokenType.SET: 397>, <TokenType.SETTINGS: 398>, <TokenType.SHOW: 399>, <TokenType.SOME: 401>, <TokenType.STORAGE_INTEGRATION: 406>, <TokenType.STRAIGHT_JOIN: 407>, <TokenType.STRUCT: 408>, <TokenType.TAG: 411>, <TokenType.TEMPORARY: 412>, <TokenType.TOP: 413>, <TokenType.TRUE: 415>, <TokenType.TRUNCATE: 416>, <TokenType.TRIGGER: 417>, <TokenType.TYPE: 418>, <TokenType.UNNEST: 422>, <TokenType.UNPIVOT: 423>, <TokenType.UPDATE: 424>, <TokenType.USE: 425>, <TokenType.VIEW: 429>, <TokenType.SEMANTIC_VIEW: 430>, <TokenType.VOLATILE: 431>, <TokenType.VOLUME: 432>, <TokenType.WINDOW: 435>, <TokenType.UNIQUE: 437>, <TokenType.SINK: 442>, <TokenType.SOURCE: 443>, <TokenType.ANALYZE: 444>, <TokenType.NAMESPACE: 445>, <TokenType.EXPORT: 446>}
COLON_PLACEHOLDER_TOKENS = {<TokenType.SESSION: 59>, <TokenType.SESSION_USER: 61>, <TokenType.NUMBER: 78>, <TokenType.IDENTIFIER: 79>, <TokenType.DATABASE: 80>, <TokenType.COLUMN: 81>, <TokenType.SCHEMA: 83>, <TokenType.TABLE: 84>, <TokenType.WAREHOUSE: 85>, <TokenType.STAGE: 86>, <TokenType.STREAM: 87>, <TokenType.STREAMLIT: 88>, <TokenType.VAR: 89>, <TokenType.BIT: 98>, <TokenType.BOOLEAN: 99>, <TokenType.TINYINT: 100>, <TokenType.UTINYINT: 101>, <TokenType.SMALLINT: 102>, <TokenType.USMALLINT: 103>, <TokenType.MEDIUMINT: 104>, <TokenType.UMEDIUMINT: 105>, <TokenType.INT: 106>, <TokenType.UINT: 107>, <TokenType.BIGINT: 108>, <TokenType.UBIGINT: 109>, <TokenType.BIGNUM: 110>, <TokenType.INT128: 111>, <TokenType.UINT128: 112>, <TokenType.INT256: 113>, <TokenType.UINT256: 114>, <TokenType.FLOAT: 115>, <TokenType.DOUBLE: 116>, <TokenType.UDOUBLE: 117>, <TokenType.DECIMAL: 118>, <TokenType.DECIMAL32: 119>, <TokenType.DECIMAL64: 120>, <TokenType.DECIMAL128: 121>, <TokenType.DECIMAL256: 122>, <TokenType.DECFLOAT: 123>, <TokenType.UDECIMAL: 124>, <TokenType.BIGDECIMAL: 125>, <TokenType.CHAR: 126>, <TokenType.NCHAR: 127>, <TokenType.VARCHAR: 128>, <TokenType.NVARCHAR: 129>, <TokenType.BPCHAR: 130>, <TokenType.TEXT: 131>, <TokenType.MEDIUMTEXT: 132>, <TokenType.LONGTEXT: 133>, <TokenType.BLOB: 134>, <TokenType.MEDIUMBLOB: 135>, <TokenType.LONGBLOB: 136>, <TokenType.TINYBLOB: 137>, <TokenType.TINYTEXT: 138>, <TokenType.NAME: 139>, <TokenType.BINARY: 140>, <TokenType.VARBINARY: 141>, <TokenType.JSON: 142>, <TokenType.JSONB: 143>, <TokenType.TIME: 144>, <TokenType.TIMETZ: 145>, <TokenType.TIME_NS: 146>, <TokenType.TIMESTAMP: 147>, <TokenType.TIMESTAMPTZ: 148>, <TokenType.TIMESTAMPLTZ: 149>, <TokenType.TIMESTAMPNTZ: 150>, <TokenType.TIMESTAMP_S: 151>, <TokenType.TIMESTAMP_MS: 152>, <TokenType.TIMESTAMP_NS: 153>, <TokenType.DATETIME: 154>, <TokenType.DATETIME2: 155>, <TokenType.DATETIME64: 156>, <TokenType.SMALLDATETIME: 157>, <TokenType.DATE: 158>, <TokenType.DATE32: 159>, <TokenType.INT4RANGE: 160>, <TokenType.INT4MULTIRANGE: 161>, <TokenType.INT8RANGE: 162>, <TokenType.INT8MULTIRANGE: 163>, <TokenType.NUMRANGE: 164>, <TokenType.NUMMULTIRANGE: 165>, <TokenType.TSRANGE: 166>, <TokenType.TSMULTIRANGE: 167>, <TokenType.TSTZRANGE: 168>, <TokenType.TSTZMULTIRANGE: 169>, <TokenType.DATERANGE: 170>, <TokenType.DATEMULTIRANGE: 171>, <TokenType.UUID: 172>, <TokenType.GEOGRAPHY: 173>, <TokenType.GEOGRAPHYPOINT: 174>, <TokenType.NULLABLE: 175>, <TokenType.GEOMETRY: 176>, <TokenType.POINT: 177>, <TokenType.RING: 178>, <TokenType.LINESTRING: 179>, <TokenType.LOCALTIME: 180>, <TokenType.LOCALTIMESTAMP: 181>, <TokenType.MULTILINESTRING: 183>, <TokenType.POLYGON: 184>, <TokenType.MULTIPOLYGON: 185>, <TokenType.HLLSKETCH: 186>, <TokenType.HSTORE: 187>, <TokenType.SUPER: 188>, <TokenType.SERIAL: 189>, <TokenType.SMALLSERIAL: 190>, <TokenType.BIGSERIAL: 191>, <TokenType.XML: 192>, <TokenType.YEAR: 193>, <TokenType.USERDEFINED: 194>, <TokenType.MONEY: 195>, <TokenType.SMALLMONEY: 196>, <TokenType.ROWVERSION: 197>, <TokenType.IMAGE: 198>, <TokenType.VARIANT: 199>, <TokenType.OBJECT: 200>, <TokenType.REF: 201>, <TokenType.INET: 202>, <TokenType.IPADDRESS: 203>, <TokenType.IPPREFIX: 204>, <TokenType.IPV4: 205>, <TokenType.IPV6: 206>, <TokenType.ENUM: 207>, <TokenType.ENUM8: 208>, <TokenType.ENUM16: 209>, <TokenType.FIXEDSTRING: 210>, <TokenType.LOWCARDINALITY: 211>, <TokenType.NESTED: 212>, <TokenType.AGGREGATEFUNCTION: 213>, <TokenType.SIMPLEAGGREGATEFUNCTION: 214>, <TokenType.TDIGEST: 215>, <TokenType.UNKNOWN: 216>, <TokenType.VECTOR: 217>, <TokenType.DYNAMIC: 218>, <TokenType.VOID: 219>, <TokenType.ALL: 222>, <TokenType.ANTI: 223>, <TokenType.ANY: 224>, <TokenType.APPLY: 225>, <TokenType.ARRAY: 226>, <TokenType.ASC: 227>, <TokenType.ASOF: 228>, <TokenType.ATTACH: 229>, <TokenType.AUTO_INCREMENT: 230>, <TokenType.BEGIN: 231>, <TokenType.CACHE: 234>, <TokenType.CASE: 235>, <TokenType.COLLATE: 238>, <TokenType.COMMAND: 239>, <TokenType.COMMENT: 240>, <TokenType.COMMIT: 241>, <TokenType.CONNECT: 242>, <TokenType.CONSTRAINT: 244>, <TokenType.COPY: 245>, <TokenType.CUBE: 248>, <TokenType.CURRENT_DATE: 249>, <TokenType.CURRENT_DATETIME: 250>, <TokenType.CURRENT_SCHEMA: 251>, <TokenType.CURRENT_TIME: 252>, <TokenType.CURRENT_TIMESTAMP: 253>, <TokenType.CURRENT_USER: 254>, <TokenType.CURRENT_ROLE: 256>, <TokenType.CURRENT_CATALOG: 257>, <TokenType.DECLARE: 258>, <TokenType.DEFAULT: 259>, <TokenType.DELETE: 260>, <TokenType.DESC: 261>, <TokenType.DESCRIBE: 262>, <TokenType.DETACH: 263>, <TokenType.DISCONNECT: 264>, <TokenType.DICTIONARY: 265>, <TokenType.DIV: 268>, <TokenType.END: 271>, <TokenType.ESCAPE: 272>, <TokenType.EXCEPT: 273>, <TokenType.EXECUTE: 274>, <TokenType.EXISTS: 275>, <TokenType.FALSE: 276>, <TokenType.FILE: 278>, <TokenType.FILE_FORMAT: 279>, <TokenType.FILTER: 280>, <TokenType.FINAL: 281>, <TokenType.FIRST: 282>, <TokenType.FOREIGN_KEY: 285>, <TokenType.FORMAT: 286>, <TokenType.FULL: 288>, <TokenType.FUNCTION: 289>, <TokenType.GET: 290>, <TokenType.IN: 300>, <TokenType.INDEX: 301>, <TokenType.INTEGRATION: 306>, <TokenType.INTERVAL: 308>, <TokenType.IS: 312>, <TokenType.ISNULL: 313>, <TokenType.KEEP: 316>, <TokenType.KILL: 318>, <TokenType.LATERAL: 320>, <TokenType.LEFT: 321>, <TokenType.LIMIT: 323>, <TokenType.LIST: 324>, <TokenType.LOAD: 325>, <TokenType.LOCK: 326>, <TokenType.MAP: 327>, <TokenType.MATCH: 328>, <TokenType.MATCH_CONDITION: 329>, <TokenType.MERGE: 332>, <TokenType.MODEL: 334>, <TokenType.NATURAL: 335>, <TokenType.NEXT: 336>, <TokenType.NOTHING: 337>, <TokenType.NULL: 339>, <TokenType.OBJECT_IDENTIFIER: 340>, <TokenType.OFFSET: 341>, <TokenType.OPERATOR: 344>, <TokenType.ORDINALITY: 348>, <TokenType.OUT: 349>, <TokenType.INOUT: 350>, <TokenType.OVER: 352>, <TokenType.OVERLAPS: 353>, <TokenType.OVERWRITE: 354>, <TokenType.PACKAGE: 355>, <TokenType.PARTITION: 356>, <TokenType.PASTE: 358>, <TokenType.PERCENT: 359>, <TokenType.PIVOT: 360>, <TokenType.POLICY: 362>, <TokenType.POOL: 363>, <TokenType.PRAGMA: 365>, <TokenType.PROCEDURE: 368>, <TokenType.PROJECTION: 370>, <TokenType.PSEUDO_TYPE: 371>, <TokenType.PUT: 372>, <TokenType.RANGE: 376>, <TokenType.RECURSIVE: 377>, <TokenType.REFRESH: 378>, <TokenType.RENAME: 379>, <TokenType.REPLACE: 380>, <TokenType.REFERENCES: 383>, <TokenType.RIGHT: 384>, <TokenType.ROLE: 386>, <TokenType.ROLLBACK: 387>, <TokenType.ROLLUP: 388>, <TokenType.ROW: 389>, <TokenType.ROWS: 390>, <TokenType.RULE: 391>, <TokenType.SEMI: 393>, <TokenType.SEQUENCE: 395>, <TokenType.SET: 397>, <TokenType.SETTINGS: 398>, <TokenType.SHOW: 399>, <TokenType.SOME: 401>, <TokenType.STORAGE_INTEGRATION: 406>, <TokenType.STRAIGHT_JOIN: 407>, <TokenType.STRUCT: 408>, <TokenType.TAG: 411>, <TokenType.TEMPORARY: 412>, <TokenType.TOP: 413>, <TokenType.TRUE: 415>, <TokenType.TRUNCATE: 416>, <TokenType.TRIGGER: 417>, <TokenType.TYPE: 418>, <TokenType.UNNEST: 422>, <TokenType.UNPIVOT: 423>, <TokenType.UPDATE: 424>, <TokenType.USE: 425>, <TokenType.USING: 426>, <TokenType.VIEW: 429>, <TokenType.SEMANTIC_VIEW: 430>, <TokenType.VOLATILE: 431>, <TokenType.VOLUME: 432>, <TokenType.WINDOW: 435>, <TokenType.UNIQUE: 437>, <TokenType.SINK: 442>, <TokenType.SOURCE: 443>, <TokenType.ANALYZE: 444>, <TokenType.NAMESPACE: 445>, <TokenType.EXPORT: 446>}
NO_PAREN_FUNCTIONS = {<TokenType.CURRENT_DATE: 249>: <class 'sqlglot.expressions.temporal.CurrentDate'>, <TokenType.CURRENT_DATETIME: 250>: <class 'sqlglot.expressions.temporal.CurrentDate'>, <TokenType.CURRENT_TIME: 252>: <class 'sqlglot.expressions.temporal.Localtime'>, <TokenType.CURRENT_TIMESTAMP: 253>: <class 'sqlglot.expressions.temporal.CurrentTimestamp'>, <TokenType.CURRENT_USER: 254>: <class 'sqlglot.expressions.functions.CurrentUser'>, <TokenType.CURRENT_ROLE: 256>: <class 'sqlglot.expressions.functions.CurrentRole'>, <TokenType.LOCALTIME: 180>: <class 'sqlglot.expressions.temporal.Localtime'>, <TokenType.LOCALTIMESTAMP: 181>: <class 'sqlglot.expressions.temporal.CurrentTimestamp'>}
RANGE_PARSERS = {<TokenType.AT_GT: 56>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.BETWEEN: 232>: <function Parser.<lambda>>, <TokenType.GLOB: 291>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ILIKE: 299>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IN: 300>: <function Parser.<lambda>>, <TokenType.IRLIKE: 311>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IS: 312>: <function Parser.<lambda>>, <TokenType.LIKE: 322>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.LT_AT: 55>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.OVERLAPS: 353>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.RLIKE: 385>: <function SnowflakeParser.<lambda>>, <TokenType.SIMILAR_TO: 400>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.FOR: 283>: <function Parser.<lambda>>, <TokenType.QMARK_AMP: 68>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.QMARK_PIPE: 69>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.HASH_DASH: 70>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.AT_QMARK: 54>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ADJACENT: 65>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.OPERATOR: 344>: <function Parser.<lambda>>, <TokenType.AMP_LT: 63>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.AMP_GT: 64>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.CARET_AT: 43>: <function binary_range_parser.<locals>._parse_binary_range>}
FUNCTIONS = {'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': <function SnowflakeParser.<lambda>>, 'AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Agg'>>, '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': <function _build_approx_top_k>, '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_CONTAINED_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContainedBy'>>, 'ARRAY_CONTAINS': <function SnowflakeParser.<lambda>>, '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': <function SnowflakeParser.<lambda>>, 'ARRAY_EXCEPT': <function SnowflakeParser.<lambda>>, '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 SnowflakeParser.<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': <function SnowflakeParser.<lambda>>, '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': <function SnowflakeParser.<lambda>>, 'ARRAY_SORT': <function _build_array_sort>, 'ARRAY_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySum'>>, 'ARRAY_TO_STRING': <function SnowflakeParser.<lambda>>, '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': <function SnowflakeParser.<lambda>>, 'BOOLNOT': <function SnowflakeParser.<lambda>>, 'BOOLOR': <function SnowflakeParser.<lambda>>, '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': <function SnowflakeParser.<lambda>>, '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': <function SnowflakeParser.<lambda>>, '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': <function SnowflakeParser.<lambda>>, '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_USER_ID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentUserId'>>, '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_datetime.<locals>._builder>, 'DATE_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateAdd'>>, 'DATE_BIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateBin'>>, 'DATEDIFF': <function SnowflakeParser.<lambda>>, 'DATE_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateDiff'>>, 'DATE_FROM_PARTS': <function _build_date_from_parts>, 'DATEFROMPARTS': <function _build_date_from_parts>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateSub'>>, '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 _date_trunc_to_time>, 'DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Datetime'>>, 'DATETIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DatetimeAdd'>>, 'DATETIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DatetimeDiff'>>, 'DATETIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DatetimeSub'>>, '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': <function SnowflakeParser.<lambda>>, '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'>>, 'DYNAMIC_IDENTIFIER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.DynamicIdentifier'>>, '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.Explode'>>, '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_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.FromISO8601Date'>>, 'FROM_ISO8601_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.FromISO8601Timestamp'>>, 'FROM_ISO8601_TIMESTAMP_NANOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.FromISO8601TimestampNanos'>>, 'FROM_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.FromJson'>>, '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': <function _build_generator>, 'GET_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.GetExtract'>>, 'GET_IGNORE_CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GetIgnoreCase'>>, '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'>>, '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_CONTAINS_TOP_KEY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBContainsTopKey'>>, '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_B_PATH_EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBPathExists'>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONExtractArray'>>, 'JSON_EXTRACT_SCALAR': <function build_extract_json_with_path.<locals>._builder>, 'JSON_FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONFormat'>>, 'JSON_KEYS': <function Parser.<lambda>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONStripNulls'>>, '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': <function SnowflakeParser.<lambda>>, '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': <function SnowflakeParser.<lambda>>, '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': <function SnowflakeParser.<lambda>>, 'LENGTH': <function SnowflakeParser.<lambda>>, 'LEN': <function SnowflakeParser.<lambda>>, '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.CurrentTimestamp'>>, '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.MD5'>>, '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': <function SnowflakeParser.<lambda>>, 'MONTHS_BETWEEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.MonthsBetween'>>, 'NANVL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Nanvl'>>, 'NEGATIVE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Negative'>>, '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'>>, 'OBJECT_TRANSFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ObjectTransform'>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.ParseDatetime'>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.ParseTime'>>, 'PARSE_URL': <function SnowflakeParser.<lambda>>, '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'>>, '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': <function SnowflakeParser.<lambda>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpExtract'>>, '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': <function _build_regexp_like>, 'REGEXP_REPLACE': <function _build_regexp_replace>, 'REGEXP_SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpSplit'>>, 'REGEXP_SUBSTR': <function _build_regexp_extract.<locals>._builder>, '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': <function build_replace_with_optional_replacement>, 'REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Reverse'>>, 'RIGHT': <function SnowflakeParser.<lambda>>, 'RINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Rint'>>, 'ROUND': <function _build_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.SHA'>>, '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': <function _build_search>, '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'>>, 'SECRET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Secret'>>, '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'>>, 'SHUFFLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Shuffle'>>, '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'>>, '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 SnowflakeParser.<lambda>>, 'SPLIT_PART': <function SnowflakeParser.<lambda>>, 'SPLIT_TO_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.SplitToTable'>>, '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'>>, 'STACK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Stack'>>, '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.Stddev'>>, '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'>>, 'STRIP_NULL_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.StripNullValue'>>, 'STRTOK': <function SnowflakeParser.<lambda>>, 'STRTOK_SPLIT_TO_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StrtokSplitToTable'>>, 'STRTOK_TO_ARRAY': <function SnowflakeParser.<lambda>>, '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.CurrentTimestamp'>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Time'>>, 'TIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeAdd'>>, 'TIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeDiff'>>, 'TIME_FROM_PARTS': <function SnowflakeParser.<lambda>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeSub'>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Timestamp'>>, 'TIMESTAMP_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampAdd'>>, 'TIMESTAMPDIFF': <function SnowflakeParser.<lambda>>, 'TIMESTAMP_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampDiff'>>, 'TIMESTAMP_FROM_PARTS': <function _build_timestamp_from_parts>, 'TIMESTAMPFROMPARTS': <function _build_timestamp_from_parts>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampSub'>>, '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': <function build_timetostr_or_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': <function SnowflakeParser.<lambda>>, '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': <function _build_trunc>, 'TRUNCATE': <function _build_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': <function SnowflakeParser.<lambda>>, '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': <function Parser.<lambda>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Week'>>, '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.Week'>>, 'WEEK_START': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.WeekStart'>>, 'WEIGHT_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.WeightString'>>, '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'>>, 'SORT_ARRAY': <function build_sort_array>, 'ARRAYAGG': <function Parser.<lambda>>, 'GLOB': <function Parser.<lambda>>, 'JSON_EXTRACT_PATH_TEXT': <function build_extract_json_with_path.<locals>._builder>, 'LIKE': <function build_like.<locals>._builder>, '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 SnowflakeParser.<lambda>>, 'INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrPosition'>>, 'LOCATE': <function Parser.<lambda>>, 'TO_HEX': <function build_hex>, 'APPROX_PERCENTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxQuantile'>>, 'ARRAY_CONSTRUCT': <function SnowflakeParser.<lambda>>, 'ARRAY_GENERATE_RANGE': <function SnowflakeParser.<lambda>>, 'ARRAY_FLATTEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Flatten'>>, 'ARRAYS_OVERLAP': <function SnowflakeParser.<lambda>>, 'BITAND': <function _build_bitwise.<locals>._builder>, 'BIT_AND': <function _build_bitwise.<locals>._builder>, 'BITNOT': <function SnowflakeParser.<lambda>>, 'BIT_NOT': <function SnowflakeParser.<lambda>>, 'BITXOR': <function _build_bitwise.<locals>._builder>, 'BIT_XOR': <function _build_bitwise.<locals>._builder>, 'BITOR': <function _build_bitwise.<locals>._builder>, 'BIT_OR': <function _build_bitwise.<locals>._builder>, 'BITSHIFTLEFT': <function _build_bitwise.<locals>._builder>, 'BIT_SHIFTLEFT': <function _build_bitwise.<locals>._builder>, 'BITSHIFTRIGHT': <function _build_bitwise.<locals>._builder>, 'BIT_SHIFTRIGHT': <function _build_bitwise.<locals>._builder>, 'BITANDAGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseAndAgg'>>, 'BITAND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseAndAgg'>>, 'BIT_AND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseAndAgg'>>, 'BIT_ANDAGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseAndAgg'>>, 'BITORAGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseOrAgg'>>, 'BITOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseOrAgg'>>, 'BIT_OR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseOrAgg'>>, 'BIT_ORAGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseOrAgg'>>, 'BITXORAGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseXorAgg'>>, 'BITXOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseXorAgg'>>, 'BIT_XOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseXorAgg'>>, 'BIT_XORAGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseXorAgg'>>, 'BOOLXOR': <function SnowflakeParser.<lambda>>, 'DATEADD': <function SnowflakeParser.<lambda>>, 'DAYOFWEEKISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeekIso'>>, 'DIV0': <function _build_if_from_div0>, 'DIV0NULL': <function _build_if_from_div0null>, 'EDITDISTANCE': <function SnowflakeParser.<lambda>>, 'GET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.GetExtract'>>, 'GETDATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimestamp'>>, 'GET_PATH': <function SnowflakeParser.<lambda>>, 'GREATEST_IGNORE_NULLS': <function SnowflakeParser.<lambda>>, 'LEAST_IGNORE_NULLS': <function SnowflakeParser.<lambda>>, 'HEX_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Unhex'>>, 'HEX_ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Hex'>>, 'IFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.If'>>, 'MD5_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5'>>, 'MD5_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5Digest'>>, 'MD5_NUMBER_LOWER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5NumberLower64'>>, 'MD5_NUMBER_UPPER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5NumberUpper64'>>, 'NULLIFZERO': <function _build_if_from_nullifzero>, 'OBJECT_CONSTRUCT': <function SnowflakeParser.<lambda>>, 'OBJECT_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONKeys'>>, 'OCTET_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ByteLength'>>, 'REGEXP_SUBSTR_ALL': <function _build_regexp_extract.<locals>._builder>, 'RLIKE': <function _build_regexp_like>, 'SHA1_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA1Digest'>>, 'SHA1_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA'>>, 'SHA2_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA2Digest'>>, 'SHA2_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA2'>>, 'SQUARE': <function SnowflakeParser.<lambda>>, 'SYSDATE': <function SnowflakeParser.<lambda>>, 'TABLE': <function SnowflakeParser.<lambda>>, 'TIMEADD': <function SnowflakeParser.<lambda>>, 'TIMEDIFF': <function SnowflakeParser.<lambda>>, 'TIMESTAMPADD': <function SnowflakeParser.<lambda>>, 'TIMESTAMPNTZFROMPARTS': <function _build_timestamp_from_parts>, 'TIMESTAMP_NTZ_FROM_PARTS': <function _build_timestamp_from_parts>, 'TRY_DECRYPT': <function SnowflakeParser.<lambda>>, 'TRY_DECRYPT_RAW': <function SnowflakeParser.<lambda>>, 'TRY_PARSE_JSON': <function SnowflakeParser.<lambda>>, 'TRY_TO_BINARY': <function SnowflakeParser.<lambda>>, 'TRY_TO_BOOLEAN': <function SnowflakeParser.<lambda>>, 'TRY_TO_DATE': <function _build_datetime.<locals>._builder>, 'TRY_TO_DECIMAL': <function SnowflakeParser.<lambda>>, 'TRY_TO_NUMBER': <function SnowflakeParser.<lambda>>, 'TRY_TO_NUMERIC': <function SnowflakeParser.<lambda>>, 'TRY_TO_DOUBLE': <function SnowflakeParser.<lambda>>, 'TRY_TO_FILE': <function SnowflakeParser.<lambda>>, 'TRY_TO_TIME': <function _build_datetime.<locals>._builder>, 'TRY_TO_TIMESTAMP': <function _build_datetime.<locals>._builder>, 'TRY_TO_TIMESTAMP_LTZ': <function _build_datetime.<locals>._builder>, 'TRY_TO_TIMESTAMP_NTZ': <function _build_datetime.<locals>._builder>, 'TRY_TO_TIMESTAMP_TZ': <function _build_datetime.<locals>._builder>, 'TO_DATE': <function _build_datetime.<locals>._builder>, 'TO_DECIMAL': <function SnowflakeParser.<lambda>>, 'TO_NUMERIC': <function SnowflakeParser.<lambda>>, 'TO_TIME': <function _build_datetime.<locals>._builder>, 'TO_TIMESTAMP': <function _build_datetime.<locals>._builder>, 'TO_TIMESTAMP_LTZ': <function _build_datetime.<locals>._builder>, 'TO_TIMESTAMP_NTZ': <function _build_datetime.<locals>._builder>, 'TO_TIMESTAMP_TZ': <function _build_datetime.<locals>._builder>, 'TO_GEOGRAPHY': <function SnowflakeParser.<lambda>>, 'TO_GEOMETRY': <function SnowflakeParser.<lambda>>, 'TO_VARCHAR': <function build_timetostr_or_tochar>, 'TO_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONFormat'>>, 'VECTOR_COSINE_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.CosineDistance'>>, 'VECTOR_INNER_PRODUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.DotProduct'>>, 'VECTOR_L1_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.ManhattanDistance'>>, 'VECTOR_L2_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.EuclideanDistance'>>, 'ZEROIFNULL': <function _build_if_from_zeroifnull>, 'ILIKE': <function build_like.<locals>._builder>, 'SKEW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Skewness'>>, 'IDENTIFIER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.DynamicIdentifier'>>, 'WEEKISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.WeekOfYear'>>}
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>>, 'WEIGHT_STRING': <function Parser.<lambda>>, 'XMLELEMENT': <function Parser.<lambda>>, 'XMLTABLE': <function Parser.<lambda>>, 'DATE_PART': <function SnowflakeParser.<lambda>>, 'DIRECTORY': <function SnowflakeParser.<lambda>>, 'OBJECT_CONSTRUCT_KEEP_NULL': <function SnowflakeParser.<lambda>>, 'LISTAGG': <function SnowflakeParser.<lambda>>, 'SEMANTIC_VIEW': <function SnowflakeParser.<lambda>>, 'SUBSTR': <function SnowflakeParser.<lambda>>}
TIMESTAMPS = {<TokenType.TIMETZ: 145>, <TokenType.TIMESTAMP: 147>, <TokenType.TIMESTAMPTZ: 148>, <TokenType.TIMESTAMPLTZ: 149>, <TokenType.TIMESTAMPNTZ: 150>}
ALTER_PARSERS = {'ADD': <function Parser.<lambda>>, 'AS': <function Parser.<lambda>>, 'ALTER': <function Parser.<lambda>>, 'CLUSTER BY': <function Parser.<lambda>>, 'DELETE': <function Parser.<lambda>>, 'DROP': <function Parser.<lambda>>, 'RENAME': <function Parser.<lambda>>, 'SET': <function Parser.<lambda>>, 'SWAP': <function Parser.<lambda>>, 'MODIFY': <function SnowflakeParser.<lambda>>, 'SESSION': <function SnowflakeParser.<lambda>>, 'UNSET': <function SnowflakeParser.<lambda>>}
STATEMENT_PARSERS = {<TokenType.ALTER: 221>: <function Parser.<lambda>>, <TokenType.ANALYZE: 444>: <function Parser.<lambda>>, <TokenType.BEGIN: 231>: <function Parser.<lambda>>, <TokenType.CACHE: 234>: <function Parser.<lambda>>, <TokenType.COMMENT: 240>: <function Parser.<lambda>>, <TokenType.COMMIT: 241>: <function Parser.<lambda>>, <TokenType.COPY: 245>: <function Parser.<lambda>>, <TokenType.CREATE: 246>: <function Parser.<lambda>>, <TokenType.DECLARE: 258>: <function Parser.<lambda>>, <TokenType.DELETE: 260>: <function Parser.<lambda>>, <TokenType.DESC: 261>: <function Parser.<lambda>>, <TokenType.DESCRIBE: 262>: <function Parser.<lambda>>, <TokenType.DROP: 269>: <function Parser.<lambda>>, <TokenType.GRANT: 293>: <function Parser.<lambda>>, <TokenType.REVOKE: 382>: <function Parser.<lambda>>, <TokenType.INSERT: 304>: <function Parser.<lambda>>, <TokenType.KILL: 318>: <function Parser.<lambda>>, <TokenType.LOAD: 325>: <function Parser.<lambda>>, <TokenType.MERGE: 332>: <function Parser.<lambda>>, <TokenType.PRAGMA: 365>: <function Parser.<lambda>>, <TokenType.REFRESH: 378>: <function Parser.<lambda>>, <TokenType.ROLLBACK: 387>: <function Parser.<lambda>>, <TokenType.SET: 397>: <function Parser.<lambda>>, <TokenType.TRUNCATE: 416>: <function Parser.<lambda>>, <TokenType.UNCACHE: 419>: <function Parser.<lambda>>, <TokenType.UPDATE: 424>: <function Parser.<lambda>>, <TokenType.USE: 425>: <function Parser.<lambda>>, <TokenType.SEMICOLON: 19>: <function Parser.<lambda>>, <TokenType.GET: 290>: <function SnowflakeParser.<lambda>>, <TokenType.LIST: 324>: <function SnowflakeParser.<lambda>>, <TokenType.PUT: 372>: <function SnowflakeParser.<lambda>>, <TokenType.SHOW: 399>: <function SnowflakeParser.<lambda>>, <TokenType.UNDROP: 420>: <function SnowflakeParser.<lambda>>}
PROPERTY_PARSERS = {'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>>, 'CALLED': <function Parser.<lambda>>, 'CHARSET': <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 SnowflakeParser.<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 SnowflakeParser.<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 SnowflakeParser.<lambda>>, 'UNLOGGED': <function Parser.<lambda>>, 'VOLATILE': <function Parser.<lambda>>, 'WITH': <function Parser.<lambda>>, 'CREDENTIALS': <function SnowflakeParser.<lambda>>, 'FILE_FORMAT': <function SnowflakeParser.<lambda>>, 'IGNORE': <function SnowflakeParser.<lambda>>, 'INTERACTIVE': <function SnowflakeParser.<lambda>>, 'SCOPED': <function SnowflakeParser.<lambda>>, 'TAG': <function SnowflakeParser.<lambda>>}
DESCRIBE_QUALIFIER_PARSERS: ClassVar[dict[str, Callable]] = {'API': <function SnowflakeParser.<lambda>>, 'APPLICATION': <function SnowflakeParser.<lambda>>, 'CATALOG': <function SnowflakeParser.<lambda>>, 'COMPUTE': <function SnowflakeParser.<lambda>>, 'DATABASE': <function SnowflakeParser.<lambda>>, 'DYNAMIC': <function SnowflakeParser.<lambda>>, 'EXTERNAL': <function SnowflakeParser.<lambda>>, 'HYBRID': <function SnowflakeParser.<lambda>>, 'ICEBERG': <function SnowflakeParser.<lambda>>, 'MASKING': <function SnowflakeParser.<lambda>>, 'MATERIALIZED': <function SnowflakeParser.<lambda>>, 'NETWORK': <function SnowflakeParser.<lambda>>, 'ROW': <function SnowflakeParser.<lambda>>, 'SECURITY': <function SnowflakeParser.<lambda>>}
TYPE_CONVERTERS = {<DType.DECIMAL: 'DECIMAL'>: <function build_default_decimal_type.<locals>._builder>}
SHOW_PARSERS = {'DATABASES': <function _show_parser.<locals>._parse>, 'SCHEMAS': <function _show_parser.<locals>._parse>, 'OBJECTS': <function _show_parser.<locals>._parse>, 'TABLES': <function _show_parser.<locals>._parse>, 'VIEWS': <function _show_parser.<locals>._parse>, 'PRIMARY KEYS': <function _show_parser.<locals>._parse>, 'IMPORTED KEYS': <function _show_parser.<locals>._parse>, 'UNIQUE KEYS': <function _show_parser.<locals>._parse>, 'SEQUENCES': <function _show_parser.<locals>._parse>, 'STAGES': <function _show_parser.<locals>._parse>, 'COLUMNS': <function _show_parser.<locals>._parse>, 'USERS': <function _show_parser.<locals>._parse>, 'FILE FORMATS': <function _show_parser.<locals>._parse>, 'FUNCTIONS': <function _show_parser.<locals>._parse>, 'PROCEDURES': <function _show_parser.<locals>._parse>, 'WAREHOUSES': <function _show_parser.<locals>._parse>, 'ICEBERG TABLES': <function _show_parser.<locals>._parse>, 'TERSE ICEBERG TABLES': <function _show_parser.<locals>._parse>, 'TERSE DATABASES': <function _show_parser.<locals>._parse>, 'TERSE SCHEMAS': <function _show_parser.<locals>._parse>, 'TERSE OBJECTS': <function _show_parser.<locals>._parse>, 'TERSE TABLES': <function _show_parser.<locals>._parse>, 'TERSE VIEWS': <function _show_parser.<locals>._parse>, 'TERSE SEQUENCES': <function _show_parser.<locals>._parse>, 'TERSE USERS': <function _show_parser.<locals>._parse>, 'TERSE PRIMARY KEYS': <function _show_parser.<locals>._parse>, 'TERSE IMPORTED KEYS': <function _show_parser.<locals>._parse>, 'TERSE UNIQUE KEYS': <function _show_parser.<locals>._parse>}
SHOW_TRIE = {'DATABASES': {0: True}, 'SCHEMAS': {0: True}, 'OBJECTS': {0: True}, 'TABLES': {0: True}, 'VIEWS': {0: True}, 'PRIMARY': {'KEYS': {0: True}}, 'IMPORTED': {'KEYS': {0: True}}, 'UNIQUE': {'KEYS': {0: True}}, 'SEQUENCES': {0: True}, 'STAGES': {0: True}, 'COLUMNS': {0: True}, 'USERS': {0: True}, 'FILE': {'FORMATS': {0: True}}, 'FUNCTIONS': {0: True}, 'PROCEDURES': {0: True}, 'WAREHOUSES': {0: True}, 'ICEBERG': {'TABLES': {0: True}}, 'TERSE': {'ICEBERG': {'TABLES': {0: True}}, 'DATABASES': {0: True}, 'SCHEMAS': {0: True}, 'OBJECTS': {0: True}, 'TABLES': {0: True}, 'VIEWS': {0: True}, 'SEQUENCES': {0: True}, 'USERS': {0: True}, 'PRIMARY': {'KEYS': {0: True}}, 'IMPORTED': {'KEYS': {0: True}}, 'UNIQUE': {'KEYS': {0: True}}}}
SCHEMA_UNNAMED_CONSTRAINTS = {'FOREIGN KEY', 'UNIQUE', 'CHECK', 'PRIMARY KEY', 'PERIOD', 'BUCKET', 'LIKE', 'TRUNCATE'}
CONSTRAINT_PARSERS = {'AUTOINCREMENT': <function Parser.<lambda>>, 'AUTO_INCREMENT': <function Parser.<lambda>>, 'CASESPECIFIC': <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 SnowflakeParser.<lambda>>, 'BUCKET': <function Parser.<lambda>>, 'TRUNCATE': <function Parser.<lambda>>, 'MASKING': <function SnowflakeParser.<lambda>>, 'PROJECTION': <function SnowflakeParser.<lambda>>, 'TAG': <function SnowflakeParser.<lambda>>}
STAGED_FILE_SINGLE_TOKENS: ClassVar = {<TokenType.DOT: 8>, <TokenType.MOD: 333>, <TokenType.SLASH: 22>}
FLATTEN_COLUMNS: ClassVar = ['SEQ', 'KEY', 'PATH', 'INDEX', 'VALUE', 'THIS']
SCHEMA_KINDS: ClassVar = {'TABLES', 'VIEWS', 'SEQUENCES', 'UNIQUE KEYS', 'OBJECTS', 'IMPORTED KEYS'}
NON_TABLE_CREATABLES: ClassVar = {'STORAGE INTEGRATION', 'TAG', 'STREAMLIT', 'WAREHOUSE'}
UNDROP_OBJECTS: ClassVar[dict[str, Sequence[Union[Sequence[str], str]]]] = {'ACCOUNT': (), 'DATABASE': (), 'NOTEBOOK': (), 'SCHEMA': (), 'SNAPSHOT': (), 'STREAMLIT': (), 'TABLE': (), 'TAG': (), 'TYPE': (), 'DYNAMIC': ('TABLE',), 'EXTERNAL': ('VOLUME',), 'ICEBERG': ('TABLE',)}
CREATABLES = {<TokenType.ROLE: 386>, <TokenType.RULE: 391>, <TokenType.DICTIONARY: 265>, <TokenType.SEQUENCE: 395>, <TokenType.MODEL: 334>, <TokenType.DATABASE: 80>, <TokenType.COLUMN: 81>, <TokenType.SCHEMA: 83>, <TokenType.TABLE: 84>, <TokenType.WAREHOUSE: 85>, <TokenType.STAGE: 86>, <TokenType.FILE_FORMAT: 279>, <TokenType.STREAMLIT: 88>, <TokenType.STORAGE_INTEGRATION: 406>, <TokenType.TAG: 411>, <TokenType.FOREIGN_KEY: 285>, <TokenType.FUNCTION: 289>, <TokenType.TRIGGER: 417>, <TokenType.TYPE: 418>, <TokenType.PACKAGE: 355>, <TokenType.POLICY: 362>, <TokenType.POOL: 363>, <TokenType.INDEX: 301>, <TokenType.VIEW: 429>, <TokenType.SEMANTIC_VIEW: 430>, <TokenType.PROCEDURE: 368>, <TokenType.VOLUME: 432>, <TokenType.INTEGRATION: 306>, <TokenType.CONSTRAINT: 244>, <TokenType.SINK: 442>, <TokenType.SOURCE: 443>, <TokenType.NAMESPACE: 445>}
LAMBDAS = {<TokenType.ARROW: 45>: <function SnowflakeParser.<lambda>>, <TokenType.FARROW: 47>: <function Parser.<lambda>>}
COLUMN_OPERATORS = {<TokenType.DOT: 8>: None, <TokenType.DOTCOLON: 12>: <function Parser.<lambda>>, <TokenType.DCOLON: 14>: <function Parser.<lambda>>, <TokenType.ARROW: 45>: <function Parser.<lambda>>, <TokenType.DARROW: 46>: <function Parser.<lambda>>, <TokenType.HASH_ARROW: 49>: <function Parser.<lambda>>, <TokenType.DHASH_ARROW: 50>: <function Parser.<lambda>>, <TokenType.PLACEHOLDER: 361>: <function Parser.<lambda>>, <TokenType.EXCLAMATION: 71>: <function SnowflakeParser.<lambda>>}
def build_cast(self, strict: bool, **kwargs) -> sqlglot.expressions.core.Expr:
1426    def build_cast(self, strict: bool, **kwargs) -> exp.Expr:
1427        to = kwargs.get("to")
1428        if not strict and to and to.this == exp.DataType.Type.BOOLEAN:
1429            return self.expression(exp.ToBoolean(this=kwargs.get("this"), safe=True))
1430        cast = super().build_cast(strict, **kwargs)
1431        if isinstance(cast, exp.TryCast) and to:
1432            if to.this in exp.DataType.TEXT_TYPES and to.expressions:
1433                cast.set("null_on_text_overflow", True)
1434            elif to.this == exp.DType.DATE and cast.this.is_string:
1435                cast.set("probe_date_format", True)
1436        return cast
Inherited Members
sqlglot.parser.Parser
Parser
ENUM_TYPE_TOKENS
AGGREGATE_TYPE_TOKENS
SIGNED_TO_UNSIGNED_TYPE_TOKEN
SUBQUERY_PREDICATES
SUBQUERY_TOKENS
RESERVED_TOKENS
TEXT_MATCH_EXCLUDED_TOKENS
DB_CREATABLES
TRIGGER_EVENTS
ALTERABLES
ARRAY_CONSTRUCTORS
COMMENT_TABLE_ALIAS_TOKENS
UPDATE_ALIAS_TOKENS
TRIM_TYPES
IDENTIFIER_TOKENS
BRACKETS
COLUMN_POSTFIX_TOKENS
TABLE_POSTFIX_TOKENS
CONJUNCTION
ASSIGNMENT
DISJUNCTION
EQUALITY
COMPARISON
BITWISE
TERM
FACTOR
EXPONENT
TIMES
SET_OPERATIONS
JOIN_METHODS
JOIN_SIDES
JOIN_KINDS
JOIN_HINTS
SUPPORTS_DIRECTED_JOIN
TABLE_TERMINATORS
LAMBDA_ARG_TERMINATORS
JSON_OPERATORS
CAST_COLUMN_OPERATORS
EXPRESSION_PARSERS
UNARY_PARSERS
STRING_PARSERS
NUMERIC_PARSERS
PRIMARY_PARSERS
PLACEHOLDER_PARSERS
PIPE_SYNTAX_TRANSFORM_PARSERS
ALTER_ALTER_PARSERS
RESERVED_CONSTRAINT_KINDS
NO_PAREN_FUNCTION_PARSERS
INVALID_FUNC_NAME_TOKENS
FUNCTIONS_WITH_ALIASED_ARGS
KEY_VALUE_DEFINITIONS
QUERY_MODIFIER_PARSERS
QUERY_MODIFIER_TOKENS
SET_PARSERS
TYPE_LITERAL_PARSERS
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
VERSION_PHRASES
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
ADD_CONSTRAINT_KEYWORDS
DISTINCT_TOKENS
UNNEST_OFFSET_ALIAS_TOKENS
SELECT_START_TOKENS
COPY_INTO_VARLEN_OPTIONS
IS_PREDICATE_PRECEDENCE
IS_PREDICATE_TOKENS
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
PREFIXED_PIVOT_COLUMNS
UNPIVOT_VALUE_COLUMNS_FIRST
PIVOT_COLUMN_NAMING
LOG_DEFAULTS_TO_LN
TABLESAMPLE_CSV
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_CHAIN_IS_SINGLE_EXTRACT
VALUES_FOLLOWED_BY_PAREN
SUPPORTS_IMPLICIT_UNNEST
SUPPORTS_TABLE_QUERY
SUPPORTS_DIGIT_PREFIXED_FIELD_NAMES
INTERVAL_SPANS
SUPPORTS_PARTITION_SELECTION
WRAPPED_TRANSFORM_COLUMN_CONSTRAINT
OPTIONAL_ALIAS_TOKEN_CTE
ALTER_RENAME_REQUIRES_COLUMN
ALTER_DROP_REQUIRES_COLUMN
ALTER_TABLE_PARTITIONS
ALTER_TABLE_MIXED_ACTIONS
ALTER_TABLE_REQUIRES_ACTION
ALTER_COLUMN_TYPE_REQUIRES_KEYWORD
JOINS_HAVE_EQUAL_PRECEDENCE
ZONE_AWARE_TIMESTAMP_CONSTRUCTOR
MAP_KEYS_ARE_ARBITRARY_EXPRESSIONS
ADD_JOIN_ON_TRUE
SUPPORTS_OMITTED_INTERVAL_SPAN_UNIT
ADJACENT_STRINGS_CANNOT_BE_CONNECTED
QUOTED_TYPES_TO_PRESERVE
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
def build_object_construct( args: list) -> sqlglot.expressions.array.StarMap | sqlglot.expressions.array.Struct:
1466def build_object_construct(args: list) -> exp.StarMap | exp.Struct:
1467    expression = parser.build_var_map(args)
1468
1469    if isinstance(expression, exp.StarMap):
1470        return expression
1471
1472    return exp.Struct(
1473        expressions=[
1474            exp.PropertyEQ(this=k, expression=v) for k, v in zip(expression.keys, expression.values)
1475        ]
1476    )