sqlglot.parsers.bigquery
1from __future__ import annotations 2 3import re 4import typing as t 5 6from sqlglot import exp, parser 7from sqlglot.dialects.dialect import ( 8 binary_from_function, 9 build_date_delta_with_interval, 10 build_formatted_time, 11) 12from sqlglot.helper import seq_get, split_num_words 13from sqlglot.tokens import TokenType 14 15if t.TYPE_CHECKING: 16 from sqlglot._typing import E 17 from sqlglot.dialects.dialect import Dialect 18 19 20def _build_contains_substring(args: list) -> exp.Contains: 21 this = exp.Lower(this=seq_get(args, 0)) 22 expr = exp.Lower(this=seq_get(args, 1)) 23 return exp.Contains(this=this, expression=expr, json_scope=seq_get(args, 2)) 24 25 26def _build_date(args: list) -> exp.Date | exp.DateFromParts: 27 expr_type = exp.DateFromParts if len(args) == 3 else exp.Date 28 return expr_type.from_arg_list(args) 29 30 31def _normalize_bare_week(expr: E) -> E: 32 # In BigQuery, a bare WEEK date part is equivalent to WEEK(SUNDAY) 33 unit = expr.args.get("unit") 34 if isinstance(unit, (exp.Literal, exp.Var)) and unit.name.upper() == "WEEK": 35 expr.set("unit", exp.WeekStart(this=exp.var("SUNDAY"))) 36 37 return expr 38 39 40def build_date_diff( 41 expr_type: type[exp.DateDiff | exp.DatetimeDiff], 42) -> t.Callable[[list], exp.Expr]: 43 def _builder(args: list) -> exp.Expr: 44 return _normalize_bare_week( 45 expr_type( 46 this=seq_get(args, 0), 47 expression=seq_get(args, 1), 48 unit=seq_get(args, 2), 49 date_part_boundary=True, 50 ) 51 ) 52 53 return _builder 54 55 56def _build_datetime(args: list) -> exp.Func: 57 if len(args) == 1: 58 return exp.TsOrDsToDatetime.from_arg_list(args) 59 if len(args) == 2: 60 return exp.Datetime.from_arg_list(args) 61 return exp.TimestampFromParts.from_arg_list(args) 62 63 64def _build_extract_json_with_default_path( 65 expr_type: type[E], 66) -> t.Callable: 67 def _builder(args: list, dialect: Dialect) -> E: 68 if len(args) == 1: 69 args.append(exp.Literal.string("$")) 70 return parser.build_extract_json_with_path(expr_type)(args, dialect) 71 72 return _builder 73 74 75def _build_format_time(expr_type: type[exp.Expr]) -> t.Callable[[list, Dialect], exp.TimeToStr]: 76 def _builder(args: list, dialect: Dialect) -> exp.TimeToStr: 77 formatted_time = build_formatted_time(exp.TimeToStr)( 78 [expr_type(this=seq_get(args, 1)), seq_get(args, 0)], dialect 79 ) 80 formatted_time.set("zone", seq_get(args, 2)) 81 return formatted_time 82 83 return _builder 84 85 86def _build_json_strip_nulls(args: list) -> exp.JSONStripNulls: 87 expression = exp.JSONStripNulls(this=seq_get(args, 0)) 88 for arg in args[1:]: 89 if isinstance(arg, exp.Kwarg): 90 expression.set(arg.this.name.lower(), arg) 91 else: 92 expression.set("expression", arg) 93 return expression 94 95 96def _build_levenshtein(args: list) -> exp.Levenshtein: 97 max_dist = seq_get(args, 2) 98 return exp.Levenshtein( 99 this=seq_get(args, 0), 100 expression=seq_get(args, 1), 101 max_dist=max_dist.expression if max_dist else None, 102 ) 103 104 105def _build_parse_date(args: list, dialect: Dialect) -> exp.StrToDate: 106 this = build_formatted_time(exp.StrToDate)([seq_get(args, 1), seq_get(args, 0)], dialect) 107 this.set("default_year", exp.Literal.number(1970)) 108 return this 109 110 111def _build_parse_timestamp(args: list, dialect: Dialect) -> exp.StrToTime: 112 this = build_formatted_time(exp.StrToTime)([seq_get(args, 1), seq_get(args, 0)], dialect) 113 this.set("zone", seq_get(args, 2)) 114 this.set("default_year", exp.Literal.number(1970)) 115 return this 116 117 118def _build_parse_datetime(args: list, dialect: Dialect) -> exp.ParseDatetime: 119 this = build_formatted_time(exp.ParseDatetime)([seq_get(args, 1), seq_get(args, 0)], dialect) 120 this.set("default_year", exp.Literal.number(1970)) 121 return this 122 123 124def _build_regexp_extract(expr_type: type[E], default_group: exp.Expr | None = None) -> t.Callable: 125 def _builder(args: list, dialect: Dialect) -> E: 126 try: 127 group = re.compile(args[1].name).groups == 1 128 except re.error: 129 group = False 130 131 return expr_type( 132 this=seq_get(args, 0), 133 expression=seq_get(args, 1), 134 position=seq_get(args, 2), 135 occurrence=seq_get(args, 3), 136 group=exp.Literal.number(1) if group else default_group, 137 **( 138 { 139 "null_if_pos_overflow": dialect.REGEXP_EXTRACT_POSITION_OVERFLOW_RETURNS_NULL, 140 "null_if_no_match": dialect.REGEXP_EXTRACT_NO_MATCH_RETURNS_NULL, 141 "empty_if_group_missing": dialect.REGEXP_EXTRACT_MISSING_GROUP_RETURNS_EMPTY, 142 } 143 if expr_type is exp.RegexpExtract 144 else {} 145 ), 146 ) 147 148 return _builder 149 150 151def _build_time(args: list) -> exp.Func: 152 if len(args) == 1: 153 return exp.TsOrDsToTime(this=args[0]) 154 if len(args) == 2: 155 return exp.Time.from_arg_list(args) 156 return exp.TimeFromParts.from_arg_list(args) 157 158 159def _build_timestamp(args: list) -> exp.Timestamp: 160 timestamp = exp.Timestamp.from_arg_list(args) 161 timestamp.set("with_tz", True) 162 return timestamp 163 164 165def _build_to_hex(args: list) -> exp.Hex | exp.MD5: 166 arg = seq_get(args, 0) 167 return exp.MD5(this=arg.this) if isinstance(arg, exp.MD5Digest) else exp.LowerHex(this=arg) 168 169 170_DOMAIN_DOT = "\0" # placeholder; cannot occur in a SQL identifier 171 172 173def _split_qualified_name(name: str, min_num_words: int) -> list[str | None]: 174 # A dotted reference (e.g. `project.dataset.table`) is split into a fixed number of parts, 175 # the first of which is the project. Domain-scoped (legacy) project IDs have the form 176 # `domain.com:project-id`, where the dots belong to the domain, not the path - and a project 177 # ID itself can't contain dots, so every such dot precedes the colon. Mask those, then let 178 # `split_num_words` split and pad as usual, to avoid corrupting the project ID. 179 # See: https://docs.cloud.google.com/artifact-registry/docs/docker/names#domain 180 colon = name.find(":") 181 if colon != -1 and "." in name[:colon]: 182 name = name[:colon].replace(".", _DOMAIN_DOT) + name[colon:] 183 return [ 184 p and p.replace(_DOMAIN_DOT, ".") for p in split_num_words(name, ".", min_num_words) 185 ] 186 187 return split_num_words(name, ".", min_num_words) 188 189 190MAKE_INTERVAL_KWARGS = ["year", "month", "day", "hour", "minute", "second"] 191 192 193class BigQueryParser(parser.Parser): 194 PREFIXED_PIVOT_COLUMNS: t.ClassVar = True 195 LOG_DEFAULTS_TO_LN: t.ClassVar = True 196 SUPPORTS_IMPLICIT_UNNEST: t.ClassVar = True 197 JOINS_HAVE_EQUAL_PRECEDENCE: t.ClassVar = True 198 ADJACENT_STRINGS_CANNOT_BE_CONNECTED: t.ClassVar = True 199 SUPPORTS_DIGIT_PREFIXED_FIELD_NAMES: t.ClassVar = True 200 201 # BigQuery does not allow ASC/DESC to be used as an identifier, allows GRANT as an identifier 202 ID_VAR_TOKENS: t.ClassVar = { 203 *parser.Parser.ID_VAR_TOKENS, 204 TokenType.GRANT, 205 } - {TokenType.ASC, TokenType.DESC} 206 207 ALIAS_TOKENS: t.ClassVar = { 208 *parser.Parser.ALIAS_TOKENS, 209 TokenType.GRANT, 210 } - {TokenType.ASC, TokenType.DESC, *parser.Parser.JOIN_SIDES} 211 212 TABLE_ALIAS_TOKENS: t.ClassVar = { 213 *parser.Parser.TABLE_ALIAS_TOKENS, 214 TokenType.ANTI, 215 TokenType.GRANT, 216 TokenType.SEMI, 217 } - {TokenType.ASC, TokenType.DESC} 218 219 COMMENT_TABLE_ALIAS_TOKENS: t.ClassVar = { 220 *parser.Parser.COMMENT_TABLE_ALIAS_TOKENS, 221 TokenType.GRANT, 222 } - {TokenType.ASC, TokenType.DESC} 223 224 UPDATE_ALIAS_TOKENS: t.ClassVar = { 225 *parser.Parser.UPDATE_ALIAS_TOKENS, 226 TokenType.GRANT, 227 } - {TokenType.ASC, TokenType.DESC} 228 229 FUNCTIONS: t.ClassVar[dict[str, t.Callable]] = { 230 **{k: v for k, v in parser.Parser.FUNCTIONS.items() if k != "SEARCH"}, 231 "APPROX_TOP_COUNT": exp.ApproxTopK.from_arg_list, 232 "BIT_AND": exp.BitwiseAndAgg.from_arg_list, 233 "BIT_OR": exp.BitwiseOrAgg.from_arg_list, 234 "BIT_XOR": exp.BitwiseXorAgg.from_arg_list, 235 "BIT_COUNT": exp.BitwiseCount.from_arg_list, 236 "BOOL": exp.JSONBool.from_arg_list, 237 "CONTAINS_SUBSTR": _build_contains_substring, 238 "DATE": _build_date, 239 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 240 "DATE_DIFF": build_date_diff(exp.DateDiff), 241 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 242 "DATE_TRUNC": lambda args: _normalize_bare_week( 243 exp.DateTrunc( 244 unit=seq_get(args, 1), 245 this=seq_get(args, 0), 246 zone=seq_get(args, 2), 247 ) 248 ), 249 "DATETIME": _build_datetime, 250 "DATETIME_ADD": build_date_delta_with_interval(exp.DatetimeAdd), 251 "DATETIME_DIFF": build_date_diff(exp.DatetimeDiff), 252 "DATETIME_SUB": build_date_delta_with_interval(exp.DatetimeSub), 253 "DATETIME_TRUNC": lambda args: _normalize_bare_week(exp.DatetimeTrunc.from_arg_list(args)), 254 "DIV": binary_from_function(exp.IntDiv), 255 "EDIT_DISTANCE": _build_levenshtein, 256 "EMBED": exp.AIEmbed.from_arg_list, 257 "FORMAT_DATE": _build_format_time(exp.TsOrDsToDate), 258 "GENERATE": exp.AIGenerate.from_arg_list, 259 "GENERATE_ARRAY": exp.GenerateSeries.from_arg_list, 260 "JSON_EXTRACT_SCALAR": _build_extract_json_with_default_path(exp.JSONExtractScalar), 261 "JSON_EXTRACT_ARRAY": _build_extract_json_with_default_path(exp.JSONExtractArray), 262 "JSON_EXTRACT_STRING_ARRAY": _build_extract_json_with_default_path(exp.JSONValueArray), 263 "JSON_KEYS": exp.JSONKeysAtDepth.from_arg_list, 264 "JSON_QUERY": parser.build_extract_json_with_path(exp.JSONExtract), 265 "JSON_QUERY_ARRAY": _build_extract_json_with_default_path(exp.JSONExtractArray), 266 "JSON_STRIP_NULLS": _build_json_strip_nulls, 267 "JSON_VALUE": _build_extract_json_with_default_path(exp.JSONExtractScalar), 268 "JSON_VALUE_ARRAY": _build_extract_json_with_default_path(exp.JSONValueArray), 269 "LAST_DAY": lambda args: _normalize_bare_week(exp.LastDay.from_arg_list(args)), 270 "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True), 271 "MD5": exp.MD5Digest.from_arg_list, 272 "SHA1": exp.SHA1Digest.from_arg_list, 273 "NORMALIZE_AND_CASEFOLD": lambda args: exp.Normalize( 274 this=seq_get(args, 0), form=seq_get(args, 1), is_casefold=True 275 ), 276 "OCTET_LENGTH": exp.ByteLength.from_arg_list, 277 "TO_HEX": _build_to_hex, 278 "PARSE_DATE": _build_parse_date, 279 "PARSE_TIME": lambda args, dialect: build_formatted_time(exp.ParseTime)( 280 [seq_get(args, 1), seq_get(args, 0)], dialect 281 ), 282 "PARSE_TIMESTAMP": _build_parse_timestamp, 283 "PARSE_DATETIME": _build_parse_datetime, 284 "REGEXP_CONTAINS": exp.RegexpLike.from_arg_list, 285 "REGEXP_EXTRACT": _build_regexp_extract(exp.RegexpExtract), 286 "REGEXP_SUBSTR": _build_regexp_extract(exp.RegexpExtract), 287 "REGEXP_EXTRACT_ALL": _build_regexp_extract( 288 exp.RegexpExtractAll, default_group=exp.Literal.number(0) 289 ), 290 "SHA256": lambda args: exp.SHA2Digest( 291 this=seq_get(args, 0), length=exp.Literal.number(256) 292 ), 293 "SHA512": lambda args: exp.SHA2Digest( 294 this=seq_get(args, 0), length=exp.Literal.number(512) 295 ), 296 "SIMILARITY": exp.AISimilarity.from_arg_list, 297 "SPLIT": lambda args: exp.Split( 298 # https://cloud.google.com/bigquery/docs/reference/standard-sql/string_functions#split 299 this=seq_get(args, 0), 300 expression=seq_get(args, 1) or exp.Literal.string(","), 301 ), 302 "STRPOS": exp.StrPosition.from_arg_list, 303 "TIME": _build_time, 304 "TIME_ADD": build_date_delta_with_interval(exp.TimeAdd), 305 "TIME_SUB": build_date_delta_with_interval(exp.TimeSub), 306 "TIMESTAMP": _build_timestamp, 307 "TIMESTAMP_ADD": build_date_delta_with_interval(exp.TimestampAdd), 308 "TIMESTAMP_SUB": build_date_delta_with_interval(exp.TimestampSub), 309 "TIMESTAMP_MICROS": lambda args: exp.UnixToTime( 310 this=seq_get(args, 0), scale=exp.UnixToTime.MICROS 311 ), 312 "TIMESTAMP_MILLIS": lambda args: exp.UnixToTime( 313 this=seq_get(args, 0), scale=exp.UnixToTime.MILLIS 314 ), 315 "TIMESTAMP_SECONDS": lambda args: exp.UnixToTime(this=seq_get(args, 0)), 316 "TIMESTAMP_TRUNC": lambda args: _normalize_bare_week( 317 exp.TimestampTrunc.from_arg_list(args) 318 ), 319 "TO_JSON": lambda args: exp.JSONFormat( 320 this=seq_get(args, 0), options=seq_get(args, 1), to_json=True 321 ), 322 "TO_JSON_STRING": exp.JSONFormat.from_arg_list, 323 "FORMAT_DATETIME": _build_format_time(exp.TsOrDsToDatetime), 324 "FORMAT_TIMESTAMP": _build_format_time(exp.TsOrDsToTimestamp), 325 "FORMAT_TIME": _build_format_time(exp.TsOrDsToTime), 326 "FROM_HEX": exp.Unhex.from_arg_list, 327 "WEEK": lambda args: exp.WeekStart(this=exp.var(seq_get(args, 0))), 328 } 329 330 FUNCTION_PARSERS = { 331 **{k: v for k, v in parser.Parser.FUNCTION_PARSERS.items() if k != "TRIM"}, 332 "ARRAY": lambda self: self.expression( 333 exp.Array(expressions=[self._parse_statement()], struct_name_inheritance=True) 334 ), 335 "JSON_ARRAY": lambda self: self.expression( 336 exp.JSONArray(expressions=self._parse_csv(self._parse_bitwise)) 337 ), 338 "MAKE_INTERVAL": lambda self: self._parse_make_interval(), 339 "PREDICT": lambda self: self._parse_ml(exp.Predict), 340 "TRANSLATE": lambda self: self._parse_translate(), 341 "FEATURES_AT_TIME": lambda self: self._parse_features_at_time(), 342 "GENERATE_EMBEDDING": lambda self: self._parse_ml(exp.GenerateEmbedding), 343 "GENERATE_TEXT_EMBEDDING": lambda self: self._parse_ml(exp.GenerateEmbedding, is_text=True), 344 "GENERATE_TEXT": lambda self: self._parse_generate(exp.GenerateText), 345 "GENERATE_TABLE": lambda self: self._parse_generate(exp.GenerateTable), 346 "GENERATE_BOOL": lambda self: self._parse_generate(exp.GenerateBool), 347 "GENERATE_INT": lambda self: self._parse_generate(exp.GenerateInt), 348 "GENERATE_DOUBLE": lambda self: self._parse_generate(exp.GenerateDouble), 349 "VECTOR_SEARCH": lambda self: self._parse_vector_search(), 350 "FORECAST": lambda self: self._parse_forecast(), 351 } 352 353 NO_PAREN_FUNCTIONS: t.ClassVar = { 354 **parser.Parser.NO_PAREN_FUNCTIONS, 355 TokenType.CURRENT_DATETIME: exp.CurrentDatetime, 356 } 357 358 NESTED_TYPE_TOKENS: t.ClassVar = { 359 *parser.Parser.NESTED_TYPE_TOKENS, 360 TokenType.TABLE, 361 } 362 363 PROPERTY_PARSERS: t.ClassVar = { 364 **parser.Parser.PROPERTY_PARSERS, 365 "OPTIONS": lambda self: self._parse_with_property(), 366 } 367 368 CONSTRAINT_PARSERS: t.ClassVar = { 369 **parser.Parser.CONSTRAINT_PARSERS, 370 "OPTIONS": lambda self: exp.Properties(expressions=self._parse_with_property()), 371 } 372 373 RANGE_PARSERS: t.ClassVar = { 374 k: v for k, v in parser.Parser.RANGE_PARSERS.items() if k != TokenType.OVERLAPS 375 } 376 377 DASHED_TABLE_PART_FOLLOW_TOKENS: t.ClassVar = { 378 TokenType.DOT, 379 TokenType.L_PAREN, 380 TokenType.R_PAREN, 381 } 382 383 STATEMENT_PARSERS: t.ClassVar = { 384 **parser.Parser.STATEMENT_PARSERS, 385 TokenType.ELSE: lambda self: self._parse_as_command(self._prev), 386 TokenType.END: lambda self: self._parse_as_command(self._prev), 387 TokenType.FOR: lambda self: self._parse_for_in(), 388 TokenType.EXPORT: lambda self: self._parse_export_data(), 389 } 390 391 BRACKET_OFFSETS: t.ClassVar = { 392 "OFFSET": (0, False), 393 "ORDINAL": (1, False), 394 "SAFE_OFFSET": (0, True), 395 "SAFE_ORDINAL": (1, True), 396 } 397 398 def _parse_for_in(self) -> exp.ForIn | exp.Command: 399 index = self._index 400 this = self._parse_range() 401 self._match_text_seq("DO") 402 if self._match(TokenType.COMMAND): 403 self._retreat(index) 404 return self._parse_as_command(self._prev) 405 return self.expression(exp.ForIn(this=this, expression=self._parse_statement())) 406 407 def _parse_table_part(self, schema: bool = False) -> exp.Expr | None: 408 this = super()._parse_table_part(schema=schema) or self._parse_number() 409 410 # https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#table_names 411 if isinstance(this, exp.Identifier): 412 table_name = this.name 413 while self._match(TokenType.DASH, advance=False) and self._next: 414 start = self._curr 415 while self._is_connected() and not self._match_set( 416 self.DASHED_TABLE_PART_FOLLOW_TOKENS, advance=False 417 ): 418 self._advance() 419 420 if start == self._curr: 421 break 422 423 table_name += self._find_sql(start, self._prev) 424 425 this = exp.Identifier(this=table_name, quoted=this.args.get("quoted")).update_positions( 426 this 427 ) 428 elif isinstance(this, exp.Literal): 429 table_name = this.name 430 431 if self._is_connected() and self._parse_var(any_token=True): 432 table_name += self._prev.text 433 434 this = exp.Identifier(this=table_name, quoted=True).update_positions(this) 435 436 return this 437 438 def _parse_table_parts( 439 self, 440 schema: bool = False, 441 is_db_reference: bool = False, 442 wildcard: bool = False, 443 fast: bool = False, 444 ) -> exp.Table | exp.Dot | None: 445 table = super()._parse_table_parts( 446 schema=schema, is_db_reference=is_db_reference, wildcard=True, fast=fast 447 ) 448 449 if not isinstance(table, exp.Table): 450 return table 451 452 # proj-1.db.tbl -- `1.` is tokenized as a float so we need to unravel it here 453 if not table.catalog: 454 if table.db: 455 previous_db = table.args["db"] 456 parts = table.db.split(".") 457 if len(parts) == 2 and not table.args["db"].quoted: 458 table.set( 459 "catalog", exp.Identifier(this=parts[0]).update_positions(previous_db) 460 ) 461 table.set("db", exp.Identifier(this=parts[1]).update_positions(previous_db)) 462 else: 463 previous_this = table.this 464 parts = table.name.split(".") 465 if len(parts) == 2 and not table.this.quoted: 466 table.set("db", exp.Identifier(this=parts[0]).update_positions(previous_this)) 467 table.set("this", exp.Identifier(this=parts[1]).update_positions(previous_this)) 468 469 if isinstance(table.this, exp.Identifier) and any("." in p.name for p in table.parts): 470 alias = table.this 471 catalog, db, this_id, *rest = ( 472 exp.to_identifier(p, quoted=True) 473 for p in _split_qualified_name(".".join(p.name for p in table.parts), 3) 474 ) 475 476 for part in (catalog, db, this_id): 477 if part: 478 part.update_positions(table.this) 479 480 this: exp.Expr | None = this_id 481 if rest and this: 482 this = exp.Dot.build([this, *rest]) # type: ignore[list-item] 483 484 table = exp.Table(this=this, db=db, catalog=catalog, pivots=table.args.get("pivots")) 485 table.meta["quoted_table"] = True 486 else: 487 alias = None 488 489 # The `INFORMATION_SCHEMA` views in BigQuery need to be qualified by a region or 490 # dataset, so if the project identifier is omitted we need to fix the ast so that 491 # the `INFORMATION_SCHEMA.X` bit is represented as a single (quoted) Identifier. 492 # Otherwise, we wouldn't correctly qualify a `Table` node that references these 493 # views, because it would seem like the "catalog" part is set, when it'd actually 494 # be the region/dataset. Merging the two identifiers into a single one is done to 495 # avoid producing a 4-part Table reference, which would cause issues in the schema 496 # module, when there are 3-part table names mixed with information schema views. 497 # 498 # See: https://cloud.google.com/bigquery/docs/information-schema-intro#syntax 499 table_parts = table.parts 500 if len(table_parts) > 1 and table_parts[-2].name.upper() == "INFORMATION_SCHEMA": 501 # We need to alias the table here to avoid breaking existing qualified columns. 502 # This is expected to be safe, because if there's an actual alias coming up in 503 # the token stream, it will overwrite this one. If there isn't one, we are only 504 # exposing the name that can be used to reference the view explicitly (a no-op). 505 exp.alias_( 506 table, 507 t.cast(exp.Identifier, alias or table_parts[-1]), 508 table=True, 509 copy=False, 510 ) 511 512 info_schema_view = f"{table_parts[-2].name}.{table_parts[-1].name}" 513 new_this = exp.Identifier(this=info_schema_view, quoted=True).update_positions( 514 line=table_parts[-2].meta_get("line"), 515 col=table_parts[-1].meta_get("col"), 516 start=table_parts[-2].meta_get("start"), 517 end=table_parts[-1].meta_get("end"), 518 ) 519 table.set("this", new_this) 520 table.set("db", seq_get(table_parts, -3)) 521 table.set("catalog", seq_get(table_parts, -4)) 522 523 return table 524 525 def _parse_column(self) -> exp.Expr | None: 526 column = super()._parse_column() 527 if isinstance(column, exp.Column): 528 parts = column.parts 529 if any("." in p.name for p in parts): 530 catalog, db, table, this_id, *rest = ( 531 exp.to_identifier(p, quoted=True) 532 for p in _split_qualified_name(".".join(p.name for p in parts), 4) 533 ) 534 535 this: exp.Expr | None = this_id 536 if rest and this: 537 this = exp.Dot.build([this, *rest]) # type: ignore[list-item] 538 539 column = exp.Column(this=this, table=table, db=db, catalog=catalog) 540 column.meta["quoted_column"] = True 541 542 return column 543 544 def _parse_cluster_property(self) -> exp.ClusterProperty: 545 return self.expression( 546 exp.ClusterProperty( 547 expressions=self._parse_csv(self._parse_column), 548 ) 549 ) 550 551 @t.overload 552 def _parse_json_object(self, agg: t.Literal[False]) -> exp.JSONObject: ... 553 554 @t.overload 555 def _parse_json_object(self, agg: t.Literal[True]) -> exp.JSONObjectAgg: ... 556 557 def _parse_json_object(self, agg=False): 558 json_object = super()._parse_json_object() 559 array_kv_pair = seq_get(json_object.expressions, 0) 560 561 # Converts BQ's "signature 2" of JSON_OBJECT into SQLGlot's canonical representation 562 # https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#json_object_signature2 563 if ( 564 array_kv_pair 565 and isinstance(array_kv_pair.this, exp.Array) 566 and isinstance(array_kv_pair.expression, exp.Array) 567 ): 568 keys = array_kv_pair.this.expressions 569 values = array_kv_pair.expression.expressions 570 571 json_object.set( 572 "expressions", 573 [exp.JSONKeyValue(this=k, expression=v) for k, v in zip(keys, values)], 574 ) 575 576 return json_object 577 578 def _parse_bracket(self, this: exp.Expr | None = None) -> exp.Expr | None: 579 bracket = super()._parse_bracket(this) 580 581 if isinstance(bracket, exp.Array): 582 bracket.set("struct_name_inheritance", True) 583 584 if this is bracket: 585 return bracket 586 587 if isinstance(bracket, exp.Bracket): 588 for expression in bracket.expressions: 589 name = expression.name.upper() 590 591 expressions = expression.expressions 592 593 if name not in self.BRACKET_OFFSETS or not expressions: 594 break 595 596 offset, safe = self.BRACKET_OFFSETS[name] 597 bracket.set("offset", offset) 598 bracket.set("safe", safe) 599 expression.replace(expressions[0]) 600 601 return bracket 602 603 def _parse_unnest(self, with_alias: bool = True) -> exp.Unnest | None: 604 unnest = super()._parse_unnest(with_alias=with_alias) 605 606 if not unnest: 607 return None 608 609 unnest_expr = seq_get(unnest.expressions, 0) 610 if unnest_expr: 611 from sqlglot.optimizer.annotate_types import annotate_types 612 613 unnest_expr = annotate_types(unnest_expr, dialect=self.dialect) 614 615 # Unnesting a nested array (i.e array of structs) explodes the top-level struct fields, 616 # in contrast to other dialects such as DuckDB which flattens only the array by default 617 if unnest_expr.is_type(exp.DType.ARRAY) and any( 618 array_elem.is_type(exp.DType.STRUCT) for array_elem in unnest_expr._type.expressions 619 ): 620 unnest.set("explode_array", True) 621 622 return unnest 623 624 def _parse_make_interval(self) -> exp.MakeInterval: 625 expr = exp.MakeInterval() 626 627 for arg_key in MAKE_INTERVAL_KWARGS: 628 value = self._parse_lambda() 629 630 if not value: 631 break 632 633 # Non-named arguments are filled sequentially, (optionally) followed by named arguments 634 # that can appear in any order e.g MAKE_INTERVAL(1, minute => 5, day => 2) 635 if isinstance(value, exp.Kwarg): 636 arg_key = value.this.name 637 638 expr.set(arg_key, value) 639 640 self._match(TokenType.COMMA) 641 642 return expr 643 644 def _parse_ml(self, expr_type: type[E], **kwargs: t.Any) -> E: 645 self._match_text_seq("MODEL") 646 this = self._parse_table() 647 648 self._match(TokenType.COMMA) 649 self._match_text_seq("TABLE") 650 651 # Certain functions like ML.FORECAST require a STRUCT argument but not a TABLE/SELECT one 652 expression = ( 653 self._parse_table() if not self._match(TokenType.STRUCT, advance=False) else None 654 ) 655 656 self._match(TokenType.COMMA) 657 658 return self.expression( 659 expr_type( 660 this=this, expression=expression, params_struct=self._parse_bitwise(), **kwargs 661 ) 662 ) 663 664 def _parse_generate(self, expr_type: type[E], **kwargs: t.Any) -> E: 665 self._match_text_seq("MODEL") 666 this = self._parse_table() 667 668 self._match(TokenType.COMMA) 669 670 if self._match_text_seq("TABLE"): 671 expression = self._parse_table() 672 elif self._match(TokenType.L_PAREN, advance=False): 673 expression = self._parse_table() 674 else: 675 expression = self._parse_bitwise() 676 677 params_struct = self._match(TokenType.COMMA) and self._parse_bitwise() 678 679 return self.expression( 680 expr_type(this=this, expression=expression, params_struct=params_struct, **kwargs) 681 ) 682 683 def _parse_translate(self) -> exp.Translate | exp.MLTranslate: 684 # Check if this is ML.TRANSLATE by looking at previous tokens 685 token = seq_get(self._tokens, self._index - 4) 686 if token and token.text.upper() == "ML": 687 return self._parse_ml(exp.MLTranslate) 688 689 return exp.Translate.from_arg_list(self._parse_function_args()) 690 691 def _parse_forecast(self) -> exp.AIForecast | exp.MLForecast: 692 # Check if this is ML.FORECAST by looking at previous tokens. 693 token = seq_get(self._tokens, self._index - 4) 694 if token and token.text.upper() == "ML": 695 return self._parse_ml(exp.MLForecast) 696 697 # AI.FORECAST is a TVF, where the first argument is either TABLE <table> 698 # or a parenthesized query statement, followed by named arguments. 699 self._match(TokenType.TABLE) 700 this = self._parse_table() 701 if not this: 702 self.raise_error("Expected table or query statement") 703 704 expr = self.expression(exp.AIForecast(this=this)) 705 while self._match(TokenType.COMMA): 706 arg = self._parse_lambda() 707 if isinstance(arg, exp.Kwarg): 708 expr.set(arg.this.name, arg) 709 else: 710 self.raise_error(f"Expected key => value syntax for AI.FORECAST, got {arg}") 711 break 712 713 return expr 714 715 def _parse_features_at_time(self) -> exp.FeaturesAtTime: 716 self._match(TokenType.TABLE) 717 this = self._parse_table() 718 719 expr = self.expression(exp.FeaturesAtTime(this=this)) 720 721 while self._match(TokenType.COMMA): 722 arg = self._parse_lambda() 723 724 # Get the LHS of the Kwarg and set the arg to that value, e.g 725 # "num_rows => 1" sets the expr's `num_rows` arg 726 if arg: 727 expr.set(arg.this.name, arg) 728 729 return expr 730 731 def _parse_vector_search(self) -> exp.VectorSearch: 732 self._match(TokenType.TABLE) 733 base_table = self._parse_table() 734 735 self._match(TokenType.COMMA) 736 737 column_to_search = self._parse_bitwise() 738 self._match(TokenType.COMMA) 739 740 self._match(TokenType.TABLE) 741 query_table = self._parse_table() 742 743 expr = self.expression( 744 exp.VectorSearch( 745 this=base_table, column_to_search=column_to_search, query_table=query_table 746 ) 747 ) 748 749 while self._match(TokenType.COMMA): 750 # query_column_to_search can be named argument or positional 751 if self._match(TokenType.STRING, advance=False): 752 query_column = self._parse_string() 753 expr.set("query_column_to_search", query_column) 754 else: 755 arg = self._parse_lambda() 756 if arg: 757 expr.set(arg.this.name, arg) 758 759 return expr 760 761 def _parse_export_data(self) -> exp.Export: 762 self._match_text_seq("DATA") 763 764 return self.expression( 765 exp.Export( 766 connection=self._match_text_seq("WITH", "CONNECTION") and self._parse_table_parts(), 767 options=self._parse_properties(), 768 this=self._match_text_seq("AS") and self._parse_select(nested=True), 769 ) 770 ) 771 772 def _parse_column_ops(self, this: exp.Expr | None) -> exp.Expr | None: 773 func_index = self._index + 1 774 this = super()._parse_column_ops(this) 775 776 if isinstance(this, exp.Dot) and isinstance(this.expression, exp.Func): 777 prefix = this.this.name.upper() 778 779 func: type[exp.Func] | None = None 780 if prefix == "NET": 781 func = exp.NetFunc 782 elif prefix == "SAFE": 783 func = exp.SafeFunc 784 785 if func: 786 # Retreat to try and parse a known function instead of an anonymous one, 787 # which is parsed by the base column ops parser due to anonymous_func=true 788 self._retreat(func_index) 789 this = func(this=self._parse_function(any_token=True)) 790 elif prefix in ("AI", "ML"): 791 # AI.* and ML.* function calls can use custom BigQuery signatures that rely on 792 # function parsers, so re-parse the function in non-anonymous mode. 793 self._retreat(func_index) 794 parsed = self._parse_function(any_token=True) 795 if parsed: 796 this = self.expression(exp.Dot(this=this.this, expression=parsed)) 797 798 return this
def
build_date_diff( expr_type: type[sqlglot.expressions.temporal.DateDiff | sqlglot.expressions.temporal.DatetimeDiff]) -> Callable[[list], sqlglot.expressions.core.Expr]:
41def build_date_diff( 42 expr_type: type[exp.DateDiff | exp.DatetimeDiff], 43) -> t.Callable[[list], exp.Expr]: 44 def _builder(args: list) -> exp.Expr: 45 return _normalize_bare_week( 46 expr_type( 47 this=seq_get(args, 0), 48 expression=seq_get(args, 1), 49 unit=seq_get(args, 2), 50 date_part_boundary=True, 51 ) 52 ) 53 54 return _builder
MAKE_INTERVAL_KWARGS =
['year', 'month', 'day', 'hour', 'minute', 'second']
194class BigQueryParser(parser.Parser): 195 PREFIXED_PIVOT_COLUMNS: t.ClassVar = True 196 LOG_DEFAULTS_TO_LN: t.ClassVar = True 197 SUPPORTS_IMPLICIT_UNNEST: t.ClassVar = True 198 JOINS_HAVE_EQUAL_PRECEDENCE: t.ClassVar = True 199 ADJACENT_STRINGS_CANNOT_BE_CONNECTED: t.ClassVar = True 200 SUPPORTS_DIGIT_PREFIXED_FIELD_NAMES: t.ClassVar = True 201 202 # BigQuery does not allow ASC/DESC to be used as an identifier, allows GRANT as an identifier 203 ID_VAR_TOKENS: t.ClassVar = { 204 *parser.Parser.ID_VAR_TOKENS, 205 TokenType.GRANT, 206 } - {TokenType.ASC, TokenType.DESC} 207 208 ALIAS_TOKENS: t.ClassVar = { 209 *parser.Parser.ALIAS_TOKENS, 210 TokenType.GRANT, 211 } - {TokenType.ASC, TokenType.DESC, *parser.Parser.JOIN_SIDES} 212 213 TABLE_ALIAS_TOKENS: t.ClassVar = { 214 *parser.Parser.TABLE_ALIAS_TOKENS, 215 TokenType.ANTI, 216 TokenType.GRANT, 217 TokenType.SEMI, 218 } - {TokenType.ASC, TokenType.DESC} 219 220 COMMENT_TABLE_ALIAS_TOKENS: t.ClassVar = { 221 *parser.Parser.COMMENT_TABLE_ALIAS_TOKENS, 222 TokenType.GRANT, 223 } - {TokenType.ASC, TokenType.DESC} 224 225 UPDATE_ALIAS_TOKENS: t.ClassVar = { 226 *parser.Parser.UPDATE_ALIAS_TOKENS, 227 TokenType.GRANT, 228 } - {TokenType.ASC, TokenType.DESC} 229 230 FUNCTIONS: t.ClassVar[dict[str, t.Callable]] = { 231 **{k: v for k, v in parser.Parser.FUNCTIONS.items() if k != "SEARCH"}, 232 "APPROX_TOP_COUNT": exp.ApproxTopK.from_arg_list, 233 "BIT_AND": exp.BitwiseAndAgg.from_arg_list, 234 "BIT_OR": exp.BitwiseOrAgg.from_arg_list, 235 "BIT_XOR": exp.BitwiseXorAgg.from_arg_list, 236 "BIT_COUNT": exp.BitwiseCount.from_arg_list, 237 "BOOL": exp.JSONBool.from_arg_list, 238 "CONTAINS_SUBSTR": _build_contains_substring, 239 "DATE": _build_date, 240 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 241 "DATE_DIFF": build_date_diff(exp.DateDiff), 242 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 243 "DATE_TRUNC": lambda args: _normalize_bare_week( 244 exp.DateTrunc( 245 unit=seq_get(args, 1), 246 this=seq_get(args, 0), 247 zone=seq_get(args, 2), 248 ) 249 ), 250 "DATETIME": _build_datetime, 251 "DATETIME_ADD": build_date_delta_with_interval(exp.DatetimeAdd), 252 "DATETIME_DIFF": build_date_diff(exp.DatetimeDiff), 253 "DATETIME_SUB": build_date_delta_with_interval(exp.DatetimeSub), 254 "DATETIME_TRUNC": lambda args: _normalize_bare_week(exp.DatetimeTrunc.from_arg_list(args)), 255 "DIV": binary_from_function(exp.IntDiv), 256 "EDIT_DISTANCE": _build_levenshtein, 257 "EMBED": exp.AIEmbed.from_arg_list, 258 "FORMAT_DATE": _build_format_time(exp.TsOrDsToDate), 259 "GENERATE": exp.AIGenerate.from_arg_list, 260 "GENERATE_ARRAY": exp.GenerateSeries.from_arg_list, 261 "JSON_EXTRACT_SCALAR": _build_extract_json_with_default_path(exp.JSONExtractScalar), 262 "JSON_EXTRACT_ARRAY": _build_extract_json_with_default_path(exp.JSONExtractArray), 263 "JSON_EXTRACT_STRING_ARRAY": _build_extract_json_with_default_path(exp.JSONValueArray), 264 "JSON_KEYS": exp.JSONKeysAtDepth.from_arg_list, 265 "JSON_QUERY": parser.build_extract_json_with_path(exp.JSONExtract), 266 "JSON_QUERY_ARRAY": _build_extract_json_with_default_path(exp.JSONExtractArray), 267 "JSON_STRIP_NULLS": _build_json_strip_nulls, 268 "JSON_VALUE": _build_extract_json_with_default_path(exp.JSONExtractScalar), 269 "JSON_VALUE_ARRAY": _build_extract_json_with_default_path(exp.JSONValueArray), 270 "LAST_DAY": lambda args: _normalize_bare_week(exp.LastDay.from_arg_list(args)), 271 "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True), 272 "MD5": exp.MD5Digest.from_arg_list, 273 "SHA1": exp.SHA1Digest.from_arg_list, 274 "NORMALIZE_AND_CASEFOLD": lambda args: exp.Normalize( 275 this=seq_get(args, 0), form=seq_get(args, 1), is_casefold=True 276 ), 277 "OCTET_LENGTH": exp.ByteLength.from_arg_list, 278 "TO_HEX": _build_to_hex, 279 "PARSE_DATE": _build_parse_date, 280 "PARSE_TIME": lambda args, dialect: build_formatted_time(exp.ParseTime)( 281 [seq_get(args, 1), seq_get(args, 0)], dialect 282 ), 283 "PARSE_TIMESTAMP": _build_parse_timestamp, 284 "PARSE_DATETIME": _build_parse_datetime, 285 "REGEXP_CONTAINS": exp.RegexpLike.from_arg_list, 286 "REGEXP_EXTRACT": _build_regexp_extract(exp.RegexpExtract), 287 "REGEXP_SUBSTR": _build_regexp_extract(exp.RegexpExtract), 288 "REGEXP_EXTRACT_ALL": _build_regexp_extract( 289 exp.RegexpExtractAll, default_group=exp.Literal.number(0) 290 ), 291 "SHA256": lambda args: exp.SHA2Digest( 292 this=seq_get(args, 0), length=exp.Literal.number(256) 293 ), 294 "SHA512": lambda args: exp.SHA2Digest( 295 this=seq_get(args, 0), length=exp.Literal.number(512) 296 ), 297 "SIMILARITY": exp.AISimilarity.from_arg_list, 298 "SPLIT": lambda args: exp.Split( 299 # https://cloud.google.com/bigquery/docs/reference/standard-sql/string_functions#split 300 this=seq_get(args, 0), 301 expression=seq_get(args, 1) or exp.Literal.string(","), 302 ), 303 "STRPOS": exp.StrPosition.from_arg_list, 304 "TIME": _build_time, 305 "TIME_ADD": build_date_delta_with_interval(exp.TimeAdd), 306 "TIME_SUB": build_date_delta_with_interval(exp.TimeSub), 307 "TIMESTAMP": _build_timestamp, 308 "TIMESTAMP_ADD": build_date_delta_with_interval(exp.TimestampAdd), 309 "TIMESTAMP_SUB": build_date_delta_with_interval(exp.TimestampSub), 310 "TIMESTAMP_MICROS": lambda args: exp.UnixToTime( 311 this=seq_get(args, 0), scale=exp.UnixToTime.MICROS 312 ), 313 "TIMESTAMP_MILLIS": lambda args: exp.UnixToTime( 314 this=seq_get(args, 0), scale=exp.UnixToTime.MILLIS 315 ), 316 "TIMESTAMP_SECONDS": lambda args: exp.UnixToTime(this=seq_get(args, 0)), 317 "TIMESTAMP_TRUNC": lambda args: _normalize_bare_week( 318 exp.TimestampTrunc.from_arg_list(args) 319 ), 320 "TO_JSON": lambda args: exp.JSONFormat( 321 this=seq_get(args, 0), options=seq_get(args, 1), to_json=True 322 ), 323 "TO_JSON_STRING": exp.JSONFormat.from_arg_list, 324 "FORMAT_DATETIME": _build_format_time(exp.TsOrDsToDatetime), 325 "FORMAT_TIMESTAMP": _build_format_time(exp.TsOrDsToTimestamp), 326 "FORMAT_TIME": _build_format_time(exp.TsOrDsToTime), 327 "FROM_HEX": exp.Unhex.from_arg_list, 328 "WEEK": lambda args: exp.WeekStart(this=exp.var(seq_get(args, 0))), 329 } 330 331 FUNCTION_PARSERS = { 332 **{k: v for k, v in parser.Parser.FUNCTION_PARSERS.items() if k != "TRIM"}, 333 "ARRAY": lambda self: self.expression( 334 exp.Array(expressions=[self._parse_statement()], struct_name_inheritance=True) 335 ), 336 "JSON_ARRAY": lambda self: self.expression( 337 exp.JSONArray(expressions=self._parse_csv(self._parse_bitwise)) 338 ), 339 "MAKE_INTERVAL": lambda self: self._parse_make_interval(), 340 "PREDICT": lambda self: self._parse_ml(exp.Predict), 341 "TRANSLATE": lambda self: self._parse_translate(), 342 "FEATURES_AT_TIME": lambda self: self._parse_features_at_time(), 343 "GENERATE_EMBEDDING": lambda self: self._parse_ml(exp.GenerateEmbedding), 344 "GENERATE_TEXT_EMBEDDING": lambda self: self._parse_ml(exp.GenerateEmbedding, is_text=True), 345 "GENERATE_TEXT": lambda self: self._parse_generate(exp.GenerateText), 346 "GENERATE_TABLE": lambda self: self._parse_generate(exp.GenerateTable), 347 "GENERATE_BOOL": lambda self: self._parse_generate(exp.GenerateBool), 348 "GENERATE_INT": lambda self: self._parse_generate(exp.GenerateInt), 349 "GENERATE_DOUBLE": lambda self: self._parse_generate(exp.GenerateDouble), 350 "VECTOR_SEARCH": lambda self: self._parse_vector_search(), 351 "FORECAST": lambda self: self._parse_forecast(), 352 } 353 354 NO_PAREN_FUNCTIONS: t.ClassVar = { 355 **parser.Parser.NO_PAREN_FUNCTIONS, 356 TokenType.CURRENT_DATETIME: exp.CurrentDatetime, 357 } 358 359 NESTED_TYPE_TOKENS: t.ClassVar = { 360 *parser.Parser.NESTED_TYPE_TOKENS, 361 TokenType.TABLE, 362 } 363 364 PROPERTY_PARSERS: t.ClassVar = { 365 **parser.Parser.PROPERTY_PARSERS, 366 "OPTIONS": lambda self: self._parse_with_property(), 367 } 368 369 CONSTRAINT_PARSERS: t.ClassVar = { 370 **parser.Parser.CONSTRAINT_PARSERS, 371 "OPTIONS": lambda self: exp.Properties(expressions=self._parse_with_property()), 372 } 373 374 RANGE_PARSERS: t.ClassVar = { 375 k: v for k, v in parser.Parser.RANGE_PARSERS.items() if k != TokenType.OVERLAPS 376 } 377 378 DASHED_TABLE_PART_FOLLOW_TOKENS: t.ClassVar = { 379 TokenType.DOT, 380 TokenType.L_PAREN, 381 TokenType.R_PAREN, 382 } 383 384 STATEMENT_PARSERS: t.ClassVar = { 385 **parser.Parser.STATEMENT_PARSERS, 386 TokenType.ELSE: lambda self: self._parse_as_command(self._prev), 387 TokenType.END: lambda self: self._parse_as_command(self._prev), 388 TokenType.FOR: lambda self: self._parse_for_in(), 389 TokenType.EXPORT: lambda self: self._parse_export_data(), 390 } 391 392 BRACKET_OFFSETS: t.ClassVar = { 393 "OFFSET": (0, False), 394 "ORDINAL": (1, False), 395 "SAFE_OFFSET": (0, True), 396 "SAFE_ORDINAL": (1, True), 397 } 398 399 def _parse_for_in(self) -> exp.ForIn | exp.Command: 400 index = self._index 401 this = self._parse_range() 402 self._match_text_seq("DO") 403 if self._match(TokenType.COMMAND): 404 self._retreat(index) 405 return self._parse_as_command(self._prev) 406 return self.expression(exp.ForIn(this=this, expression=self._parse_statement())) 407 408 def _parse_table_part(self, schema: bool = False) -> exp.Expr | None: 409 this = super()._parse_table_part(schema=schema) or self._parse_number() 410 411 # https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#table_names 412 if isinstance(this, exp.Identifier): 413 table_name = this.name 414 while self._match(TokenType.DASH, advance=False) and self._next: 415 start = self._curr 416 while self._is_connected() and not self._match_set( 417 self.DASHED_TABLE_PART_FOLLOW_TOKENS, advance=False 418 ): 419 self._advance() 420 421 if start == self._curr: 422 break 423 424 table_name += self._find_sql(start, self._prev) 425 426 this = exp.Identifier(this=table_name, quoted=this.args.get("quoted")).update_positions( 427 this 428 ) 429 elif isinstance(this, exp.Literal): 430 table_name = this.name 431 432 if self._is_connected() and self._parse_var(any_token=True): 433 table_name += self._prev.text 434 435 this = exp.Identifier(this=table_name, quoted=True).update_positions(this) 436 437 return this 438 439 def _parse_table_parts( 440 self, 441 schema: bool = False, 442 is_db_reference: bool = False, 443 wildcard: bool = False, 444 fast: bool = False, 445 ) -> exp.Table | exp.Dot | None: 446 table = super()._parse_table_parts( 447 schema=schema, is_db_reference=is_db_reference, wildcard=True, fast=fast 448 ) 449 450 if not isinstance(table, exp.Table): 451 return table 452 453 # proj-1.db.tbl -- `1.` is tokenized as a float so we need to unravel it here 454 if not table.catalog: 455 if table.db: 456 previous_db = table.args["db"] 457 parts = table.db.split(".") 458 if len(parts) == 2 and not table.args["db"].quoted: 459 table.set( 460 "catalog", exp.Identifier(this=parts[0]).update_positions(previous_db) 461 ) 462 table.set("db", exp.Identifier(this=parts[1]).update_positions(previous_db)) 463 else: 464 previous_this = table.this 465 parts = table.name.split(".") 466 if len(parts) == 2 and not table.this.quoted: 467 table.set("db", exp.Identifier(this=parts[0]).update_positions(previous_this)) 468 table.set("this", exp.Identifier(this=parts[1]).update_positions(previous_this)) 469 470 if isinstance(table.this, exp.Identifier) and any("." in p.name for p in table.parts): 471 alias = table.this 472 catalog, db, this_id, *rest = ( 473 exp.to_identifier(p, quoted=True) 474 for p in _split_qualified_name(".".join(p.name for p in table.parts), 3) 475 ) 476 477 for part in (catalog, db, this_id): 478 if part: 479 part.update_positions(table.this) 480 481 this: exp.Expr | None = this_id 482 if rest and this: 483 this = exp.Dot.build([this, *rest]) # type: ignore[list-item] 484 485 table = exp.Table(this=this, db=db, catalog=catalog, pivots=table.args.get("pivots")) 486 table.meta["quoted_table"] = True 487 else: 488 alias = None 489 490 # The `INFORMATION_SCHEMA` views in BigQuery need to be qualified by a region or 491 # dataset, so if the project identifier is omitted we need to fix the ast so that 492 # the `INFORMATION_SCHEMA.X` bit is represented as a single (quoted) Identifier. 493 # Otherwise, we wouldn't correctly qualify a `Table` node that references these 494 # views, because it would seem like the "catalog" part is set, when it'd actually 495 # be the region/dataset. Merging the two identifiers into a single one is done to 496 # avoid producing a 4-part Table reference, which would cause issues in the schema 497 # module, when there are 3-part table names mixed with information schema views. 498 # 499 # See: https://cloud.google.com/bigquery/docs/information-schema-intro#syntax 500 table_parts = table.parts 501 if len(table_parts) > 1 and table_parts[-2].name.upper() == "INFORMATION_SCHEMA": 502 # We need to alias the table here to avoid breaking existing qualified columns. 503 # This is expected to be safe, because if there's an actual alias coming up in 504 # the token stream, it will overwrite this one. If there isn't one, we are only 505 # exposing the name that can be used to reference the view explicitly (a no-op). 506 exp.alias_( 507 table, 508 t.cast(exp.Identifier, alias or table_parts[-1]), 509 table=True, 510 copy=False, 511 ) 512 513 info_schema_view = f"{table_parts[-2].name}.{table_parts[-1].name}" 514 new_this = exp.Identifier(this=info_schema_view, quoted=True).update_positions( 515 line=table_parts[-2].meta_get("line"), 516 col=table_parts[-1].meta_get("col"), 517 start=table_parts[-2].meta_get("start"), 518 end=table_parts[-1].meta_get("end"), 519 ) 520 table.set("this", new_this) 521 table.set("db", seq_get(table_parts, -3)) 522 table.set("catalog", seq_get(table_parts, -4)) 523 524 return table 525 526 def _parse_column(self) -> exp.Expr | None: 527 column = super()._parse_column() 528 if isinstance(column, exp.Column): 529 parts = column.parts 530 if any("." in p.name for p in parts): 531 catalog, db, table, this_id, *rest = ( 532 exp.to_identifier(p, quoted=True) 533 for p in _split_qualified_name(".".join(p.name for p in parts), 4) 534 ) 535 536 this: exp.Expr | None = this_id 537 if rest and this: 538 this = exp.Dot.build([this, *rest]) # type: ignore[list-item] 539 540 column = exp.Column(this=this, table=table, db=db, catalog=catalog) 541 column.meta["quoted_column"] = True 542 543 return column 544 545 def _parse_cluster_property(self) -> exp.ClusterProperty: 546 return self.expression( 547 exp.ClusterProperty( 548 expressions=self._parse_csv(self._parse_column), 549 ) 550 ) 551 552 @t.overload 553 def _parse_json_object(self, agg: t.Literal[False]) -> exp.JSONObject: ... 554 555 @t.overload 556 def _parse_json_object(self, agg: t.Literal[True]) -> exp.JSONObjectAgg: ... 557 558 def _parse_json_object(self, agg=False): 559 json_object = super()._parse_json_object() 560 array_kv_pair = seq_get(json_object.expressions, 0) 561 562 # Converts BQ's "signature 2" of JSON_OBJECT into SQLGlot's canonical representation 563 # https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#json_object_signature2 564 if ( 565 array_kv_pair 566 and isinstance(array_kv_pair.this, exp.Array) 567 and isinstance(array_kv_pair.expression, exp.Array) 568 ): 569 keys = array_kv_pair.this.expressions 570 values = array_kv_pair.expression.expressions 571 572 json_object.set( 573 "expressions", 574 [exp.JSONKeyValue(this=k, expression=v) for k, v in zip(keys, values)], 575 ) 576 577 return json_object 578 579 def _parse_bracket(self, this: exp.Expr | None = None) -> exp.Expr | None: 580 bracket = super()._parse_bracket(this) 581 582 if isinstance(bracket, exp.Array): 583 bracket.set("struct_name_inheritance", True) 584 585 if this is bracket: 586 return bracket 587 588 if isinstance(bracket, exp.Bracket): 589 for expression in bracket.expressions: 590 name = expression.name.upper() 591 592 expressions = expression.expressions 593 594 if name not in self.BRACKET_OFFSETS or not expressions: 595 break 596 597 offset, safe = self.BRACKET_OFFSETS[name] 598 bracket.set("offset", offset) 599 bracket.set("safe", safe) 600 expression.replace(expressions[0]) 601 602 return bracket 603 604 def _parse_unnest(self, with_alias: bool = True) -> exp.Unnest | None: 605 unnest = super()._parse_unnest(with_alias=with_alias) 606 607 if not unnest: 608 return None 609 610 unnest_expr = seq_get(unnest.expressions, 0) 611 if unnest_expr: 612 from sqlglot.optimizer.annotate_types import annotate_types 613 614 unnest_expr = annotate_types(unnest_expr, dialect=self.dialect) 615 616 # Unnesting a nested array (i.e array of structs) explodes the top-level struct fields, 617 # in contrast to other dialects such as DuckDB which flattens only the array by default 618 if unnest_expr.is_type(exp.DType.ARRAY) and any( 619 array_elem.is_type(exp.DType.STRUCT) for array_elem in unnest_expr._type.expressions 620 ): 621 unnest.set("explode_array", True) 622 623 return unnest 624 625 def _parse_make_interval(self) -> exp.MakeInterval: 626 expr = exp.MakeInterval() 627 628 for arg_key in MAKE_INTERVAL_KWARGS: 629 value = self._parse_lambda() 630 631 if not value: 632 break 633 634 # Non-named arguments are filled sequentially, (optionally) followed by named arguments 635 # that can appear in any order e.g MAKE_INTERVAL(1, minute => 5, day => 2) 636 if isinstance(value, exp.Kwarg): 637 arg_key = value.this.name 638 639 expr.set(arg_key, value) 640 641 self._match(TokenType.COMMA) 642 643 return expr 644 645 def _parse_ml(self, expr_type: type[E], **kwargs: t.Any) -> E: 646 self._match_text_seq("MODEL") 647 this = self._parse_table() 648 649 self._match(TokenType.COMMA) 650 self._match_text_seq("TABLE") 651 652 # Certain functions like ML.FORECAST require a STRUCT argument but not a TABLE/SELECT one 653 expression = ( 654 self._parse_table() if not self._match(TokenType.STRUCT, advance=False) else None 655 ) 656 657 self._match(TokenType.COMMA) 658 659 return self.expression( 660 expr_type( 661 this=this, expression=expression, params_struct=self._parse_bitwise(), **kwargs 662 ) 663 ) 664 665 def _parse_generate(self, expr_type: type[E], **kwargs: t.Any) -> E: 666 self._match_text_seq("MODEL") 667 this = self._parse_table() 668 669 self._match(TokenType.COMMA) 670 671 if self._match_text_seq("TABLE"): 672 expression = self._parse_table() 673 elif self._match(TokenType.L_PAREN, advance=False): 674 expression = self._parse_table() 675 else: 676 expression = self._parse_bitwise() 677 678 params_struct = self._match(TokenType.COMMA) and self._parse_bitwise() 679 680 return self.expression( 681 expr_type(this=this, expression=expression, params_struct=params_struct, **kwargs) 682 ) 683 684 def _parse_translate(self) -> exp.Translate | exp.MLTranslate: 685 # Check if this is ML.TRANSLATE by looking at previous tokens 686 token = seq_get(self._tokens, self._index - 4) 687 if token and token.text.upper() == "ML": 688 return self._parse_ml(exp.MLTranslate) 689 690 return exp.Translate.from_arg_list(self._parse_function_args()) 691 692 def _parse_forecast(self) -> exp.AIForecast | exp.MLForecast: 693 # Check if this is ML.FORECAST by looking at previous tokens. 694 token = seq_get(self._tokens, self._index - 4) 695 if token and token.text.upper() == "ML": 696 return self._parse_ml(exp.MLForecast) 697 698 # AI.FORECAST is a TVF, where the first argument is either TABLE <table> 699 # or a parenthesized query statement, followed by named arguments. 700 self._match(TokenType.TABLE) 701 this = self._parse_table() 702 if not this: 703 self.raise_error("Expected table or query statement") 704 705 expr = self.expression(exp.AIForecast(this=this)) 706 while self._match(TokenType.COMMA): 707 arg = self._parse_lambda() 708 if isinstance(arg, exp.Kwarg): 709 expr.set(arg.this.name, arg) 710 else: 711 self.raise_error(f"Expected key => value syntax for AI.FORECAST, got {arg}") 712 break 713 714 return expr 715 716 def _parse_features_at_time(self) -> exp.FeaturesAtTime: 717 self._match(TokenType.TABLE) 718 this = self._parse_table() 719 720 expr = self.expression(exp.FeaturesAtTime(this=this)) 721 722 while self._match(TokenType.COMMA): 723 arg = self._parse_lambda() 724 725 # Get the LHS of the Kwarg and set the arg to that value, e.g 726 # "num_rows => 1" sets the expr's `num_rows` arg 727 if arg: 728 expr.set(arg.this.name, arg) 729 730 return expr 731 732 def _parse_vector_search(self) -> exp.VectorSearch: 733 self._match(TokenType.TABLE) 734 base_table = self._parse_table() 735 736 self._match(TokenType.COMMA) 737 738 column_to_search = self._parse_bitwise() 739 self._match(TokenType.COMMA) 740 741 self._match(TokenType.TABLE) 742 query_table = self._parse_table() 743 744 expr = self.expression( 745 exp.VectorSearch( 746 this=base_table, column_to_search=column_to_search, query_table=query_table 747 ) 748 ) 749 750 while self._match(TokenType.COMMA): 751 # query_column_to_search can be named argument or positional 752 if self._match(TokenType.STRING, advance=False): 753 query_column = self._parse_string() 754 expr.set("query_column_to_search", query_column) 755 else: 756 arg = self._parse_lambda() 757 if arg: 758 expr.set(arg.this.name, arg) 759 760 return expr 761 762 def _parse_export_data(self) -> exp.Export: 763 self._match_text_seq("DATA") 764 765 return self.expression( 766 exp.Export( 767 connection=self._match_text_seq("WITH", "CONNECTION") and self._parse_table_parts(), 768 options=self._parse_properties(), 769 this=self._match_text_seq("AS") and self._parse_select(nested=True), 770 ) 771 ) 772 773 def _parse_column_ops(self, this: exp.Expr | None) -> exp.Expr | None: 774 func_index = self._index + 1 775 this = super()._parse_column_ops(this) 776 777 if isinstance(this, exp.Dot) and isinstance(this.expression, exp.Func): 778 prefix = this.this.name.upper() 779 780 func: type[exp.Func] | None = None 781 if prefix == "NET": 782 func = exp.NetFunc 783 elif prefix == "SAFE": 784 func = exp.SafeFunc 785 786 if func: 787 # Retreat to try and parse a known function instead of an anonymous one, 788 # which is parsed by the base column ops parser due to anonymous_func=true 789 self._retreat(func_index) 790 this = func(this=self._parse_function(any_token=True)) 791 elif prefix in ("AI", "ML"): 792 # AI.* and ML.* function calls can use custom BigQuery signatures that rely on 793 # function parsers, so re-parse the function in non-anonymous mode. 794 self._retreat(func_index) 795 parsed = self._parse_function(any_token=True) 796 if parsed: 797 this = self.expression(exp.Dot(this=this.this, expression=parsed)) 798 799 return this
Parser consumes a list of tokens produced by the Tokenizer and produces a parsed syntax tree.
Arguments:
- error_level: The desired error level. Default: ErrorLevel.IMMEDIATE
- error_message_context: The amount of context to capture from a query string when displaying the error message (in number of characters). Default: 100
- max_errors: Maximum number of error messages to include in a raised ParseError. This is only relevant if error_level is ErrorLevel.RAISE. Default: 3
- max_nodes: Maximum number of AST nodes to prevent memory exhaustion. Set to -1 (default) to disable the check.
ID_VAR_TOKENS: ClassVar =
{<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.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.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.GRANT: 293>, <TokenType.IN: 300>, <TokenType.INDEX: 301>, <TokenType.INTERVAL: 308>, <TokenType.IS: 312>, <TokenType.ISNULL: 313>, <TokenType.KEEP: 316>, <TokenType.KILL: 318>, <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.PARTITION: 356>, <TokenType.PASTE: 358>, <TokenType.PERCENT: 359>, <TokenType.PIVOT: 360>, <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.ROLLUP: 388>, <TokenType.ROW: 389>, <TokenType.ROWS: 390>, <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.WINDOW: 435>, <TokenType.UNIQUE: 437>, <TokenType.SINK: 442>, <TokenType.SOURCE: 443>, <TokenType.ANALYZE: 444>, <TokenType.NAMESPACE: 445>, <TokenType.EXPORT: 446>}
ALIAS_TOKENS: ClassVar =
{<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.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.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.GRANT: 293>, <TokenType.IN: 300>, <TokenType.INDEX: 301>, <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.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.PARTITION: 356>, <TokenType.PASTE: 358>, <TokenType.PERCENT: 359>, <TokenType.PIVOT: 360>, <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.ROLLUP: 388>, <TokenType.ROW: 389>, <TokenType.ROWS: 390>, <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.WINDOW: 435>, <TokenType.UNIQUE: 437>, <TokenType.SINK: 442>, <TokenType.SOURCE: 443>, <TokenType.ANALYZE: 444>, <TokenType.NAMESPACE: 445>, <TokenType.EXPORT: 446>}
TABLE_ALIAS_TOKENS: ClassVar =
{<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.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.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.GRANT: 293>, <TokenType.IN: 300>, <TokenType.INDEX: 301>, <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.PARTITION: 356>, <TokenType.PASTE: 358>, <TokenType.PERCENT: 359>, <TokenType.PIVOT: 360>, <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.ROLLUP: 388>, <TokenType.ROW: 389>, <TokenType.ROWS: 390>, <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.UNIQUE: 437>, <TokenType.SINK: 442>, <TokenType.SOURCE: 443>, <TokenType.ANALYZE: 444>, <TokenType.NAMESPACE: 445>, <TokenType.EXPORT: 446>}
COMMENT_TABLE_ALIAS_TOKENS: ClassVar =
{<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.ANY: 224>, <TokenType.APPLY: 225>, <TokenType.ARRAY: 226>, <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.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.GRANT: 293>, <TokenType.IN: 300>, <TokenType.INDEX: 301>, <TokenType.INTERVAL: 308>, <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.PARTITION: 356>, <TokenType.PASTE: 358>, <TokenType.PERCENT: 359>, <TokenType.PIVOT: 360>, <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.ROLLUP: 388>, <TokenType.ROW: 389>, <TokenType.ROWS: 390>, <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.UNIQUE: 437>, <TokenType.SINK: 442>, <TokenType.SOURCE: 443>, <TokenType.ANALYZE: 444>, <TokenType.NAMESPACE: 445>, <TokenType.EXPORT: 446>}
UPDATE_ALIAS_TOKENS: ClassVar =
{<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.ANY: 224>, <TokenType.APPLY: 225>, <TokenType.ARRAY: 226>, <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.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.GRANT: 293>, <TokenType.IN: 300>, <TokenType.INDEX: 301>, <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.PARTITION: 356>, <TokenType.PASTE: 358>, <TokenType.PERCENT: 359>, <TokenType.PIVOT: 360>, <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.ROLLUP: 388>, <TokenType.ROW: 389>, <TokenType.ROWS: 390>, <TokenType.SEQUENCE: 395>, <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.UNIQUE: 437>, <TokenType.SINK: 442>, <TokenType.SOURCE: 443>, <TokenType.ANALYZE: 444>, <TokenType.NAMESPACE: 445>, <TokenType.EXPORT: 446>}
FUNCTIONS: ClassVar[dict[str, Callable]] =
{'AI_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.AIAgg'>>, 'AI_CLASSIFY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIClassify'>>, 'AI_EMBED': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIEmbed'>>, 'A_I_FORECAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIForecast'>>, 'AI_GENERATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIGenerate'>>, 'AI_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AISimilarity'>>, 'AI_SUMMARIZE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.AISummarizeAgg'>>, 'ABS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Abs'>>, 'ACOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Acos'>>, 'ACOSH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Acosh'>>, 'ADD_MONTHS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.AddMonths'>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopK'>>, 'APPROX_TOP_K_ACCUMULATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopKAccumulate'>>, 'APPROX_TOP_K_COMBINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopKCombine'>>, 'APPROX_TOP_K_ESTIMATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopKEstimate'>>, 'APPROX_TOP_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopSum'>>, 'APPROXIMATE_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproximateSimilarity'>>, 'APPROXIMATE_JACCARD_INDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproximateSimilarity'>>, 'ARG_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMax'>>, 'ARGMAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMax'>>, 'MAX_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMax'>>, 'ARG_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMin'>>, 'ARGMIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMin'>>, 'MIN_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMin'>>, 'ARRAY': <function Parser.<lambda>>, 'ARRAY_AGG': <function Parser.<lambda>>, 'ARRAY_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayAll'>>, 'ARRAY_ANY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayAny'>>, 'ARRAY_APPEND': <function build_array_append>, 'ARRAY_COMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayCompact'>>, 'ARRAY_CONCAT': <function build_array_concat>, 'ARRAY_CAT': <function build_array_concat>, 'ARRAY_CONCAT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArrayConcatAgg'>>, 'ARRAY_CONSTRUCT_COMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayConstructCompact'>>, 'ARRAY_CONTAINED_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContainedBy'>>, 'ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContains'>>, 'ARRAY_HAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContains'>>, 'ARRAY_CONTAINS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContainsAll'>>, 'ARRAY_HAS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContainsAll'>>, 'ARRAY_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayDistinct'>>, 'ARRAY_EXCEPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayExcept'>>, 'FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayFilter'>>, 'ARRAY_FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayFilter'>>, 'ARRAY_FIRST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayFirst'>>, 'ARRAY_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayInsert'>>, 'ARRAY_INTERSECT': <function Parser.<lambda>>, 'ARRAY_INTERSECTION': <function Parser.<lambda>>, 'ARRAY_LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayLast'>>, 'ARRAY_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayMax'>>, 'ARRAY_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayMin'>>, 'ARRAY_OVERLAPS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayOverlaps'>>, 'ARRAY_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayPosition'>>, 'ARRAY_PREPEND': <function build_array_prepend>, 'ARRAY_REMOVE': <function build_array_remove>, 'ARRAY_REMOVE_AT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayRemoveAt'>>, 'ARRAY_REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayReverse'>>, 'ARRAY_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySize'>>, 'ARRAY_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySize'>>, 'ARRAY_SLICE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySlice'>>, 'ARRAY_SORT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySort'>>, 'ARRAY_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySum'>>, 'ARRAY_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayToString'>>, 'ARRAY_JOIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayToString'>>, 'ARRAY_UNION_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArrayUnionAgg'>>, 'ARRAY_UNIQUE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArrayUniqueAgg'>>, 'ARRAYS_ZIP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraysZip'>>, 'ASCII': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Ascii'>>, 'ASIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Asin'>>, 'ASINH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Asinh'>>, 'ATAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Atan'>>, 'ATAN2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Atan2'>>, 'ATANH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Atanh'>>, 'AVG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Avg'>>, 'BASE64_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Base64DecodeBinary'>>, 'BASE64_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Base64DecodeString'>>, 'BASE64_ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Base64Encode'>>, 'BIT_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.BitLength'>>, 'BITMAP_BIT_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapBitPosition'>>, 'BITMAP_BUCKET_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapBucketNumber'>>, 'BITMAP_CONSTRUCT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapConstructAgg'>>, 'BITMAP_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapCount'>>, 'BITMAP_OR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapOrAgg'>>, 'BITWISE_AND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseAndAgg'>>, 'BITWISE_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseCount'>>, 'BITWISE_OR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseOrAgg'>>, 'BITWISE_XOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseXorAgg'>>, 'BOOLAND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Booland'>>, 'BOOLNOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Boolnot'>>, 'BOOLOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Boolor'>>, 'BOOLXOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BoolxorAgg'>>, 'BYTE_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ByteLength'>>, 'CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Case'>>, 'CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Cast'>>, 'CAST_TO_STR_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CastToStrType'>>, 'CBRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cbrt'>>, 'CEIL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Ceil'>>, 'CEILING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Ceil'>>, 'CHECK_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.CheckJson'>>, 'CHECK_XML': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CheckXml'>>, 'CHR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Chr'>>, 'CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Chr'>>, 'CITY_HASH64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.CityHash64'>>, 'COALESCE': <function build_coalesce>, 'IFNULL': <function build_coalesce>, 'NVL': <function build_coalesce>, 'CODE_POINTS_TO_BYTES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.CodePointsToBytes'>>, 'CODE_POINTS_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.CodePointsToString'>>, 'COLLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Collate'>>, 'COLLATION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Collation'>>, 'COLUMNS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Columns'>>, 'COMBINED_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.CombinedAggFunc'>>, 'COMBINED_PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.CombinedParameterizedAgg'>>, 'COMPRESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Compress'>>, 'CONCAT': <function Parser.<lambda>>, 'CONCAT_WS': <function Parser.<lambda>>, 'CONNECT_BY_ROOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ConnectByRoot'>>, 'CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Contains'>>, 'CONVERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Convert'>>, 'CONVERT_TIMEZONE': <function build_convert_timezone>, 'CONVERT_TO_CHARSET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ConvertToCharset'>>, 'CORR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Corr'>>, 'COS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cos'>>, 'COSH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cosh'>>, 'COSINE_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.CosineDistance'>>, 'COT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cot'>>, 'COTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Coth'>>, 'COUNT': <function Parser.<lambda>>, 'COUNT_IF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CountIf'>>, 'COUNTIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CountIf'>>, 'COVAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CovarPop'>>, 'COVAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CovarSamp'>>, 'CSC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Csc'>>, 'CSCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Csch'>>, 'CUME_DIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CumeDist'>>, 'CURRENT_ACCOUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentAccount'>>, 'CURRENT_ACCOUNT_NAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentAccountName'>>, 'CURRENT_AVAILABLE_ROLES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentAvailableRoles'>>, 'CURRENT_CATALOG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentCatalog'>>, 'CURRENT_CLIENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentClient'>>, 'CURRENT_DATABASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentDatabase'>>, 'CURRENT_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentDate'>>, 'CURRENT_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentDatetime'>>, 'CURRENT_IP_ADDRESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentIpAddress'>>, 'CURRENT_ORGANIZATION_NAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentOrganizationName'>>, 'CURRENT_ORGANIZATION_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentOrganizationUser'>>, 'CURRENT_REGION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentRegion'>>, 'CURRENT_ROLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentRole'>>, 'CURRENT_ROLE_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentRoleType'>>, 'CURRENT_SCHEMA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSchema'>>, 'CURRENT_SCHEMAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSchemas'>>, 'CURRENT_SECONDARY_ROLES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSecondaryRoles'>>, 'CURRENT_SESSION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSession'>>, 'CURRENT_STATEMENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentStatement'>>, 'CURRENT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTime'>>, 'CURRENT_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimestamp'>>, 'CURRENT_TIMESTAMP_L_T_Z': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimestampLTZ'>>, 'CURRENT_TIMEZONE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimezone'>>, 'CURRENT_TRANSACTION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentTransaction'>>, 'CURRENT_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentUser'>>, 'CURRENT_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_date>, 'DATE_ADD': <function build_date_delta_with_interval.<locals>._builder>, 'DATE_BIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateBin'>>, 'DATEDIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateDiff'>>, 'DATE_DIFF': <function build_date_diff.<locals>._builder>, 'DATE_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateFromParts'>>, 'DATEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateFromParts'>>, 'DATE_FROM_UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateFromUnixDate'>>, 'DATE_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateStrToDate'>>, 'DATE_SUB': <function build_date_delta_with_interval.<locals>._builder>, 'DATE_TO_DATE_STR': <function Parser.<lambda>>, 'DATE_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateToDi'>>, 'DATE_TRUNC': <function BigQueryParser.<lambda>>, 'DATETIME': <function _build_datetime>, 'DATETIME_ADD': <function build_date_delta_with_interval.<locals>._builder>, 'DATETIME_DIFF': <function build_date_diff.<locals>._builder>, 'DATETIME_SUB': <function build_date_delta_with_interval.<locals>._builder>, 'DATETIME_TRUNC': <function BigQueryParser.<lambda>>, 'DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Day'>>, 'DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfMonth'>>, 'DAYOFMONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfMonth'>>, 'DAY_OF_WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeek'>>, 'DAYOFWEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeek'>>, 'DAYOFWEEK_ISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeekIso'>>, 'ISODOW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeekIso'>>, 'DAY_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfYear'>>, 'DAYOFYEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfYear'>>, 'DAYNAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Dayname'>>, 'DECODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Decode'>>, 'DECODE_CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.DecodeCase'>>, 'DECOMPRESS_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.DecompressBinary'>>, 'DECOMPRESS_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.DecompressString'>>, 'DECRYPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Decrypt'>>, 'DECRYPT_RAW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.DecryptRaw'>>, 'DEGREES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Degrees'>>, 'DENSE_RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.DenseRank'>>, 'DI_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DiToDate'>>, 'DOT_PRODUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.DotProduct'>>, '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.Flatten'>>, 'FLOAT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Float64'>>, 'FLOOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Floor'>>, 'FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Format'>>, 'FROM_BASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FromBase'>>, 'FROM_BASE32': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FromBase32'>>, 'FROM_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FromBase64'>>, 'FROM_ISO8601_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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Generator'>>, 'GET_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.GetExtract'>>, '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': <function _build_extract_json_with_default_path.<locals>._builder>, 'JSON_EXTRACT_SCALAR': <function _build_extract_json_with_default_path.<locals>._builder>, 'JSON_FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONFormat'>>, 'JSON_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONKeysAtDepth'>>, 'J_S_O_N_KEYS_AT_DEPTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONKeysAtDepth'>>, 'J_S_O_N_OBJECT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONObject'>>, 'J_S_O_N_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONObjectAgg'>>, 'JSON_REMOVE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONRemove'>>, 'JSON_SET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONSet'>>, 'JSON_STRIP_NULLS': <function _build_json_strip_nulls>, 'J_S_O_N_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONTable'>>, 'JSON_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONType'>>, 'J_S_O_N_VALUE_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.query.JSONValueArray'>>, 'JAROWINKLER_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.JarowinklerSimilarity'>>, 'JUSTIFY_DAYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.JustifyDays'>>, 'JUSTIFY_HOURS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.JustifyHours'>>, 'JUSTIFY_INTERVAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.JustifyInterval'>>, 'KURTOSIS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Kurtosis'>>, 'LAG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Lag'>>, 'LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Last'>>, 'LAST_DAY': <function BigQueryParser.<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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Left'>>, 'LENGTH': <function BigQueryParser.<lambda>>, 'LEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Length'>>, 'CHAR_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Length'>>, 'CHARACTER_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Length'>>, 'LEVENSHTEIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Levenshtein'>>, 'LIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.List'>>, 'LN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Ln'>>, 'LOCALTIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Localtime'>>, 'LOCALTIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Localtimestamp'>>, 'LOG': <function build_logarithm>, 'LOGICAL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalAnd'>>, 'BOOL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalAnd'>>, 'BOOLAND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalAnd'>>, 'LOGICAL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalOr'>>, 'BOOL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalOr'>>, 'BOOLOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LogicalOr'>>, 'LOWER': <function build_lower>, 'LCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Lower'>>, 'LOWER_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.LowerHex'>>, 'MD5': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5Digest'>>, 'MD5_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5Digest'>>, 'M_D5_NUMBER_LOWER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5NumberLower64'>>, 'M_D5_NUMBER_UPPER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5NumberUpper64'>>, 'M_L_FORECAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.MLForecast'>>, 'M_L_TRANSLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.MLTranslate'>>, 'MAKE_INTERVAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.MakeInterval'>>, 'MANHATTAN_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.ManhattanDistance'>>, 'MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Map'>>, 'MAP_CAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapCat'>>, 'MAP_CONTAINS_KEY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapContainsKey'>>, 'MAP_DELETE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapDelete'>>, 'MAP_FROM_ENTRIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapFromEntries'>>, 'MAP_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapInsert'>>, 'MAP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapKeys'>>, 'MAP_PICK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapPick'>>, 'MAP_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapSize'>>, 'MATCH_AGAINST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MatchAgainst'>>, 'MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Max'>>, 'MEDIAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Median'>>, 'MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Min'>>, 'MINHASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Minhash'>>, 'MINHASH_COMBINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.MinhashCombine'>>, 'MINUTE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Minute'>>, 'MODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Mode'>>, 'MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Month'>>, 'MONTHNAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Monthname'>>, 'MONTHS_BETWEEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.MonthsBetween'>>, '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': <function _build_parse_datetime>, 'PARSE_IP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ParseIp'>>, 'PARSE_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ParseJSON'>>, 'JSON_PARSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ParseJSON'>>, 'PARSE_NUMERIC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ParseNumeric'>>, 'PARSE_TIME': <function BigQueryParser.<lambda>>, 'PARSE_URL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ParseUrl'>>, 'PERCENT_RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.PercentRank'>>, 'PERCENTILE_CONT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.PercentileCont'>>, 'PERCENTILE_DISC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.PercentileDisc'>>, 'PI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Pi'>>, 'POSEXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Posexplode'>>, 'POSEXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.PosexplodeOuter'>>, 'POWER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Pow'>>, 'POW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Pow'>>, 'PREDICT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Predict'>>, 'PREVIOUS_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.PreviousDay'>>, 'QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Quantile'>>, 'QUARTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Quarter'>>, 'RADIANS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Radians'>>, 'RAND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Rand'>>, 'RANDOM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Rand'>>, 'RANDN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Randn'>>, 'RANDSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Randstr'>>, 'RANGE_BUCKET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.RangeBucket'>>, 'RANGE_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.RangeN'>>, 'RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Rank'>>, 'READ_CSV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ReadCSV'>>, 'READ_PARQUET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ReadParquet'>>, 'REDUCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Reduce'>>, 'REG_DOMAIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.RegDomain'>>, 'REGEXP_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpCount'>>, 'REGEXP_EXTRACT': <function _build_regexp_extract.<locals>._builder>, 'REGEXP_EXTRACT_ALL': <function _build_regexp_extract.<locals>._builder>, 'REGEXP_FULL_MATCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpFullMatch'>>, 'REGEXP_I_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpILike'>>, 'REGEXP_INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpInstr'>>, 'REGEXP_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.RegexpLike'>>, 'REGEXP_REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpReplace'>>, 'REGEXP_SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpSplit'>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Replace'>>, 'REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Reverse'>>, 'RIGHT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Right'>>, 'RINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Rint'>>, 'ROUND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Round'>>, 'ROW_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RowNumber'>>, 'RTRIMMED_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RtrimmedLength'>>, 'SHA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA'>>, 'SHA1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA1Digest'>>, 'S_H_A1_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA1Digest'>>, 'SHA2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA2'>>, 'S_H_A2_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA2Digest'>>, 'SAFE_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeAdd'>>, 'SAFE_CONVERT_BYTES_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SafeConvertBytesToString'>>, 'SAFE_DIVIDE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeDivide'>>, 'SAFE_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.SafeFunc'>>, 'SAFE_MULTIPLY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeMultiply'>>, 'SAFE_NEGATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeNegate'>>, 'SAFE_SUBTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeSubtract'>>, 'SEARCH_IP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SearchIp'>>, 'SEC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sec'>>, 'SECH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sech'>>, 'SECOND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Second'>>, '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 BigQueryParser.<lambda>>, 'SPLIT_PART': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SplitPart'>>, '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.StddevSamp'>>, 'STR_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrPosition'>>, 'STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.StrToDate'>>, 'STR_TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrToMap'>>, 'STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.StrToTime'>>, 'STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.StrToUnix'>>, 'STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.String'>>, 'STRING_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StringToArray'>>, 'SPLIT_BY_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StringToArray'>>, 'STRIP_NULL_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.StripNullValue'>>, 'STRTOK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Strtok'>>, 'STRTOK_SPLIT_TO_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StrtokSplitToTable'>>, 'STRTOK_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StrtokToArray'>>, 'STRUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Struct'>>, 'STRUCT_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StructExtract'>>, 'STUFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Stuff'>>, 'INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Stuff'>>, 'SUBSTRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Substring'>>, 'SUBSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Substring'>>, 'SUBSTRING_INDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SubstringIndex'>>, 'SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Sum'>>, 'SYSTIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Systimestamp'>>, 'TAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Tan'>>, 'TANH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Tanh'>>, 'TIME': <function _build_time>, 'TIME_ADD': <function build_date_delta_with_interval.<locals>._builder>, 'TIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeDiff'>>, 'TIME_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeFromParts'>>, 'TIMEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeFromParts'>>, 'TIME_SLICE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeSlice'>>, 'TIME_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeStrToDate'>>, 'TIME_STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeStrToTime'>>, 'TIME_STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeStrToUnix'>>, 'TIME_SUB': <function build_date_delta_with_interval.<locals>._builder>, 'TIME_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeToStr'>>, 'TIME_TO_TIME_STR': <function Parser.<lambda>>, 'TIME_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeToUnix'>>, 'TIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeTrunc'>>, 'TIMESTAMP': <function _build_timestamp>, 'TIMESTAMP_ADD': <function build_date_delta_with_interval.<locals>._builder>, 'TIMESTAMPDIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampDiff'>>, 'TIMESTAMP_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampDiff'>>, 'TIMESTAMP_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampFromParts'>>, 'TIMESTAMPFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampFromParts'>>, 'TIMESTAMP_LTZ_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampLtzFromParts'>>, 'TIMESTAMPLTZFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampLtzFromParts'>>, 'TIMESTAMP_SUB': <function build_date_delta_with_interval.<locals>._builder>, 'TIMESTAMP_TRUNC': <function BigQueryParser.<lambda>>, 'TIMESTAMP_TZ_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampTzFromParts'>>, 'TIMESTAMPTZFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampTzFromParts'>>, 'TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ToArray'>>, 'TO_BASE32': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToBase32'>>, 'TO_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToBase64'>>, 'TO_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToBinary'>>, 'TO_BOOLEAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ToBoolean'>>, 'TO_CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToChar'>>, 'TO_CODE_POINTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToCodePoints'>>, 'TO_DAYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.ToDays'>>, 'TO_DECFLOAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToDecfloat'>>, 'TO_DOUBLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToDouble'>>, 'TO_FILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToFile'>>, 'TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ToMap'>>, 'TO_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToNumber'>>, 'TO_VARIANT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ToVariant'>>, 'TRANSFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Transform'>>, 'TRANSLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Translate'>>, 'TRIM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Trim'>>, 'TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Trunc'>>, 'TRUNCATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Trunc'>>, 'TRY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Try'>>, 'TRY_BASE64_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryBase64DecodeBinary'>>, 'TRY_BASE64_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryBase64DecodeString'>>, 'TRY_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.TryCast'>>, 'TRY_HEX_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryHexDecodeBinary'>>, 'TRY_HEX_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryHexDecodeString'>>, 'TRY_TO_DECFLOAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryToDecfloat'>>, 'TS_OR_DI_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDiToDi'>>, 'TS_OR_DS_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsAdd'>>, 'TS_OR_DS_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsDiff'>>, 'TS_OR_DS_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsToDate'>>, 'TS_OR_DS_TO_DATE_STR': <function Parser.<lambda>>, 'TS_OR_DS_TO_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsToDatetime'>>, 'TS_OR_DS_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsToTime'>>, 'TS_OR_DS_TO_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsToTimestamp'>>, 'TYPEOF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Typeof'>>, 'UNHEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Unhex'>>, 'UNICODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Unicode'>>, 'UNIFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Uniform'>>, 'UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixDate'>>, 'UNIX_MICROS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixMicros'>>, 'UNIX_MILLIS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixMillis'>>, 'UNIX_SECONDS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixSeconds'>>, 'UNIX_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixToStr'>>, 'UNIX_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixToTime'>>, 'UNIX_TO_TIME_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixToTimeStr'>>, 'UNNEST': <function Parser.<lambda>>, 'UPPER': <function build_upper>, 'UCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Upper'>>, 'UTC_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UtcDate'>>, 'UTC_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UtcTime'>>, 'UTC_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UtcTimestamp'>>, 'UUID': <function Parser.<lambda>>, 'GEN_RANDOM_UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Uuid'>>, 'GENERATE_UUID': <function Parser.<lambda>>, 'UUID_STRING': <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': <function BigQueryParser.<lambda>>, 'WEEK_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.WeekOfYear'>>, 'WEEKOFYEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.WeekOfYear'>>, 'WEEK_START': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.WeekStart'>>, '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>, 'LOG2': <function Parser.<lambda>>, 'LOG10': <function Parser.<lambda>>, 'LPAD': <function Parser.<lambda>>, 'LEFTPAD': <function Parser.<lambda>>, 'LTRIM': <function Parser.<lambda>>, 'MOD': <function build_mod>, 'RIGHTPAD': <function Parser.<lambda>>, 'RPAD': <function Parser.<lambda>>, 'RTRIM': <function Parser.<lambda>>, 'SCOPE_RESOLUTION': <function Parser.<lambda>>, 'STRPOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrPosition'>>, 'CHARINDEX': <function Parser.<lambda>>, 'INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrPosition'>>, 'LOCATE': <function Parser.<lambda>>, 'TO_HEX': <function _build_to_hex>, 'APPROX_TOP_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopK'>>, 'BIT_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseAndAgg'>>, 'BIT_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseOrAgg'>>, 'BIT_XOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseXorAgg'>>, 'BIT_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseCount'>>, 'BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBool'>>, 'CONTAINS_SUBSTR': <function _build_contains_substring>, 'DIV': <function binary_from_function.<locals>.<lambda>>, 'EDIT_DISTANCE': <function _build_levenshtein>, 'EMBED': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIEmbed'>>, 'FORMAT_DATE': <function _build_format_time.<locals>._builder>, 'GENERATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIGenerate'>>, 'GENERATE_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.GenerateSeries'>>, 'JSON_EXTRACT_STRING_ARRAY': <function _build_extract_json_with_default_path.<locals>._builder>, 'JSON_QUERY': <function build_extract_json_with_path.<locals>._builder>, 'JSON_QUERY_ARRAY': <function _build_extract_json_with_default_path.<locals>._builder>, 'JSON_VALUE': <function _build_extract_json_with_default_path.<locals>._builder>, 'JSON_VALUE_ARRAY': <function _build_extract_json_with_default_path.<locals>._builder>, 'NORMALIZE_AND_CASEFOLD': <function BigQueryParser.<lambda>>, 'OCTET_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ByteLength'>>, 'PARSE_DATE': <function _build_parse_date>, 'PARSE_TIMESTAMP': <function _build_parse_timestamp>, 'REGEXP_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.RegexpLike'>>, 'SHA256': <function BigQueryParser.<lambda>>, 'SHA512': <function BigQueryParser.<lambda>>, 'SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AISimilarity'>>, 'TIMESTAMP_MICROS': <function BigQueryParser.<lambda>>, 'TIMESTAMP_MILLIS': <function BigQueryParser.<lambda>>, 'TIMESTAMP_SECONDS': <function BigQueryParser.<lambda>>, 'TO_JSON': <function BigQueryParser.<lambda>>, 'TO_JSON_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONFormat'>>, 'FORMAT_DATETIME': <function _build_format_time.<locals>._builder>, 'FORMAT_TIMESTAMP': <function _build_format_time.<locals>._builder>, 'FORMAT_TIME': <function _build_format_time.<locals>._builder>, 'FROM_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Unhex'>>}
FUNCTION_PARSERS =
{'ARG_MAX': <function Parser.<dictcomp>.<lambda>>, 'ARGMAX': <function Parser.<dictcomp>.<lambda>>, 'MAX_BY': <function Parser.<dictcomp>.<lambda>>, 'ARG_MIN': <function Parser.<dictcomp>.<lambda>>, 'ARGMIN': <function Parser.<dictcomp>.<lambda>>, 'MIN_BY': <function Parser.<dictcomp>.<lambda>>, 'CAST': <function Parser.<lambda>>, 'CEIL': <function Parser.<lambda>>, 'CONVERT': <function Parser.<lambda>>, 'CHAR': <function Parser.<lambda>>, 'CHR': <function Parser.<lambda>>, 'DECODE': <function Parser.<lambda>>, 'EXTRACT': <function Parser.<lambda>>, 'FLOOR': <function Parser.<lambda>>, 'GAP_FILL': <function Parser.<lambda>>, 'INITCAP': <function Parser.<lambda>>, 'JSON_OBJECT': <function Parser.<lambda>>, 'JSON_OBJECTAGG': <function Parser.<lambda>>, 'JSON_TABLE': <function Parser.<lambda>>, 'MATCH': <function Parser.<lambda>>, 'NORMALIZE': <function Parser.<lambda>>, 'OPENJSON': <function Parser.<lambda>>, 'OVERLAY': <function Parser.<lambda>>, 'POSITION': <function Parser.<lambda>>, 'SAFE_CAST': <function Parser.<lambda>>, 'STRING_AGG': <function Parser.<lambda>>, 'SUBSTRING': <function Parser.<lambda>>, 'TRY_CAST': <function Parser.<lambda>>, 'TRY_CONVERT': <function Parser.<lambda>>, 'WEIGHT_STRING': <function Parser.<lambda>>, 'XMLELEMENT': <function Parser.<lambda>>, 'XMLTABLE': <function Parser.<lambda>>, 'ARRAY': <function BigQueryParser.<lambda>>, 'JSON_ARRAY': <function BigQueryParser.<lambda>>, 'MAKE_INTERVAL': <function BigQueryParser.<lambda>>, 'PREDICT': <function BigQueryParser.<lambda>>, 'TRANSLATE': <function BigQueryParser.<lambda>>, 'FEATURES_AT_TIME': <function BigQueryParser.<lambda>>, 'GENERATE_EMBEDDING': <function BigQueryParser.<lambda>>, 'GENERATE_TEXT_EMBEDDING': <function BigQueryParser.<lambda>>, 'GENERATE_TEXT': <function BigQueryParser.<lambda>>, 'GENERATE_TABLE': <function BigQueryParser.<lambda>>, 'GENERATE_BOOL': <function BigQueryParser.<lambda>>, 'GENERATE_INT': <function BigQueryParser.<lambda>>, 'GENERATE_DOUBLE': <function BigQueryParser.<lambda>>, 'VECTOR_SEARCH': <function BigQueryParser.<lambda>>, 'FORECAST': <function BigQueryParser.<lambda>>}
NO_PAREN_FUNCTIONS: ClassVar =
{<TokenType.CURRENT_DATE: 249>: <class 'sqlglot.expressions.temporal.CurrentDate'>, <TokenType.CURRENT_DATETIME: 250>: <class 'sqlglot.expressions.temporal.CurrentDatetime'>, <TokenType.CURRENT_TIME: 252>: <class 'sqlglot.expressions.temporal.CurrentTime'>, <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'>}
NESTED_TYPE_TOKENS: ClassVar =
{<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.TABLE: 84>, <TokenType.RANGE: 376>}
PROPERTY_PARSERS: ClassVar =
{'ALLOWED_VALUES': <function Parser.<lambda>>, 'ALGORITHM': <function Parser.<lambda>>, 'AUTO': <function Parser.<lambda>>, 'AUTO_INCREMENT': <function Parser.<lambda>>, 'BACKUP': <function Parser.<lambda>>, 'BLOCKCOMPRESSION': <function Parser.<lambda>>, '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 Parser.<lambda>>, 'LOCK': <function Parser.<lambda>>, 'LOCKING': <function Parser.<lambda>>, 'LOG': <function Parser.<lambda>>, 'MATERIALIZED': <function Parser.<lambda>>, 'MERGEBLOCKRATIO': <function Parser.<lambda>>, 'MODIFIES': <function Parser.<lambda>>, 'MULTISET': <function Parser.<lambda>>, 'NO': <function Parser.<lambda>>, 'ON': <function Parser.<lambda>>, 'ORDER BY': <function Parser.<lambda>>, 'OUTPUT': <function Parser.<lambda>>, 'PARTITION': <function Parser.<lambda>>, 'PARTITION BY': <function Parser.<lambda>>, 'PARTITIONED BY': <function Parser.<lambda>>, 'PARTITIONED_BY': <function Parser.<lambda>>, 'PRIMARY KEY': <function Parser.<lambda>>, 'RANGE': <function Parser.<lambda>>, 'READS': <function Parser.<lambda>>, 'REMOTE': <function Parser.<lambda>>, 'RETURNS': <function Parser.<lambda>>, 'STRICT': <function Parser.<lambda>>, 'STREAMING': <function Parser.<lambda>>, 'ROW': <function Parser.<lambda>>, 'ROW_FORMAT': <function Parser.<lambda>>, 'SAMPLE': <function Parser.<lambda>>, 'SECURE': <function Parser.<lambda>>, 'SECURITY': <function Parser.<lambda>>, 'SQL SECURITY': <function Parser.<lambda>>, 'SET': <function Parser.<lambda>>, 'SETTINGS': <function Parser.<lambda>>, 'SHARING': <function Parser.<lambda>>, 'SORTKEY': <function Parser.<lambda>>, 'SOURCE': <function Parser.<lambda>>, 'STABLE': <function Parser.<lambda>>, 'STORED': <function Parser.<lambda>>, 'SYSTEM_VERSIONING': <function Parser.<lambda>>, 'TBLPROPERTIES': <function Parser.<lambda>>, 'TEMP': <function Parser.<lambda>>, 'TEMPORARY': <function Parser.<lambda>>, 'TO': <function Parser.<lambda>>, 'TRANSIENT': <function Parser.<lambda>>, 'TRANSFORM': <function Parser.<lambda>>, 'TTL': <function Parser.<lambda>>, 'USING': <function Parser.<lambda>>, 'UNLOGGED': <function Parser.<lambda>>, 'VOLATILE': <function Parser.<lambda>>, 'WITH': <function Parser.<lambda>>, 'OPTIONS': <function BigQueryParser.<lambda>>}
CONSTRAINT_PARSERS: ClassVar =
{'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 Parser.<lambda>>, 'BUCKET': <function Parser.<lambda>>, 'TRUNCATE': <function Parser.<lambda>>, 'OPTIONS': <function BigQueryParser.<lambda>>}
RANGE_PARSERS: ClassVar =
{<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.RLIKE: 385>: <function binary_range_parser.<locals>._parse_binary_range>, <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>}
DASHED_TABLE_PART_FOLLOW_TOKENS: ClassVar =
{<TokenType.DOT: 8>, <TokenType.L_PAREN: 1>, <TokenType.R_PAREN: 2>}
STATEMENT_PARSERS: ClassVar =
{<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.PIVOT: 360>: <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.UNPIVOT: 423>: <function Parser.<lambda>>, <TokenType.UPDATE: 424>: <function Parser.<lambda>>, <TokenType.USE: 425>: <function Parser.<lambda>>, <TokenType.SEMICOLON: 19>: <function Parser.<lambda>>, <TokenType.ELSE: 270>: <function BigQueryParser.<lambda>>, <TokenType.END: 271>: <function BigQueryParser.<lambda>>, <TokenType.FOR: 283>: <function BigQueryParser.<lambda>>, <TokenType.EXPORT: 446>: <function BigQueryParser.<lambda>>}
BRACKET_OFFSETS: ClassVar =
{'OFFSET': (0, False), 'ORDINAL': (1, False), 'SAFE_OFFSET': (0, True), 'SAFE_ORDINAL': (1, True)}
Inherited Members
- sqlglot.parser.Parser
- Parser
- STRUCT_TYPE_TOKENS
- ENUM_TYPE_TOKENS
- AGGREGATE_TYPE_TOKENS
- TYPE_TOKENS
- SIGNED_TO_UNSIGNED_TYPE_TOKEN
- SUBQUERY_PREDICATES
- SUBQUERY_TOKENS
- RESERVED_TOKENS
- TEXT_MATCH_EXCLUDED_TOKENS
- DB_CREATABLES
- CREATABLES
- TRIGGER_EVENTS
- ALTERABLES
- COLON_PLACEHOLDER_TOKENS
- ARRAY_CONSTRUCTORS
- TRIM_TYPES
- IDENTIFIER_TOKENS
- BRACKETS
- COLUMN_POSTFIX_TOKENS
- TABLE_POSTFIX_TOKENS
- FUNC_TOKENS
- CONJUNCTION
- ASSIGNMENT
- DISJUNCTION
- EQUALITY
- COMPARISON
- BITWISE
- TERM
- FACTOR
- EXPONENT
- TIMES
- TIMESTAMPS
- SET_OPERATIONS
- JOIN_METHODS
- JOIN_SIDES
- JOIN_KINDS
- JOIN_HINTS
- SUPPORTS_DIRECTED_JOIN
- TABLE_TERMINATORS
- LAMBDAS
- TYPED_LAMBDA_ARGS
- LAMBDA_ARG_TERMINATORS
- COLUMN_OPERATORS
- JSON_OPERATORS
- CAST_COLUMN_OPERATORS
- EXPRESSION_PARSERS
- UNARY_PARSERS
- STRING_PARSERS
- NUMERIC_PARSERS
- PRIMARY_PARSERS
- PLACEHOLDER_PARSERS
- PIPE_SYNTAX_TRANSFORM_PARSERS
- ALTER_PARSERS
- ALTER_ALTER_PARSERS
- SCHEMA_UNNAMED_CONSTRAINTS
- 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
- SHOW_PARSERS
- TYPE_LITERAL_PARSERS
- TYPE_CONVERTERS
- DDL_SELECT_TOKENS
- PRE_VOLATILE_TOKENS
- TRANSACTION_KIND
- TRANSACTION_CHARACTERISTICS
- CONFLICT_ACTIONS
- TRIGGER_TIMING
- TRIGGER_DEFERRABLE
- CREATE_SEQUENCE
- ISOLATED_LOADING_OPTIONS
- USABLES
- CAST_ACTIONS
- SCHEMA_BINDING_OPTIONS
- PROCEDURE_OPTIONS
- EXECUTE_AS_OPTIONS
- KEY_CONSTRAINT_OPTIONS
- WINDOW_EXCLUDE_OPTIONS
- INSERT_ALTERNATIVES
- CLONE_KEYWORDS
- 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
- IDENTIFY_PIVOT_STRINGS
- UNPIVOT_VALUE_COLUMNS_FIRST
- PIVOT_COLUMN_NAMING
- TABLESAMPLE_CSV
- DEFAULT_SAMPLING_METHOD
- SET_REQUIRES_ASSIGNMENT_DELIMITER
- TRIM_PATTERN_FIRST
- STRING_ALIASES
- MODIFIERS_ATTACHED_TO_SET_OP
- SET_OP_MODIFIERS
- NO_PAREN_IF_COMMANDS
- JSON_ARROWS_REQUIRE_JSON_TYPE
- COLON_IS_VARIANT_EXTRACT
- COLON_CHAIN_IS_SINGLE_EXTRACT
- VALUES_FOLLOWED_BY_PAREN
- SUPPORTS_TABLE_QUERY
- 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
- ZONE_AWARE_TIMESTAMP_CONSTRUCTOR
- MAP_KEYS_ARE_ARBITRARY_EXPRESSIONS
- JSON_EXTRACT_REQUIRES_JSON_EXPRESSION
- ADD_JOIN_ON_TRUE
- SUPPORTS_OMITTED_INTERVAL_SPAN_UNIT
- SUPPORTS_NTH_VALUE_FROM_MODIFIER
- QUOTED_TYPES_TO_PRESERVE
- SHOW_TRIE
- SET_TRIE
- error_level
- error_message_context
- max_errors
- max_nodes
- dialect
- sql
- errors
- reset
- raise_error
- validate_expression
- parse
- parse_into
- check_errors
- expression
- parse_set_operation
- build_cast