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'}
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.
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>}
SCHEMA_KINDS: ClassVar =
{'TABLES', 'VIEWS', 'SEQUENCES', 'UNIQUE KEYS', 'OBJECTS', 'IMPORTED KEYS'}
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>>}
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
RANKING_WINDOW_FUNCTIONS_WITH_FRAME =
(<class 'sqlglot.expressions.aggregate.FirstValue'>, <class 'sqlglot.expressions.aggregate.LastValue'>, <class 'sqlglot.expressions.aggregate.NthValue'>)
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 )