sqlglot.parsers.tsql
1from __future__ import annotations 2 3import datetime 4import re 5import typing as t 6 7from sqlglot import exp, parser 8from sqlglot.dialects.dialect import ( 9 Dialect, 10 build_date_delta, 11 map_date_part, 12) 13from sqlglot.helper import seq_get 14from sqlglot.parser import build_coalesce 15from sqlglot.time import format_time 16from sqlglot.tokens import TokenType 17 18if t.TYPE_CHECKING: 19 from sqlglot._typing import E 20 from collections.abc import Collection 21 22FULL_FORMAT_TIME_MAPPING = { 23 "weekday": "%A", 24 "dw": "%A", 25 "w": "%A", 26 "month": "%B", 27 "mm": "%B", 28 "m": "%B", 29} 30 31DATE_DELTA_INTERVAL = { 32 "year": "year", 33 "yyyy": "year", 34 "yy": "year", 35 "quarter": "quarter", 36 "qq": "quarter", 37 "q": "quarter", 38 "month": "month", 39 "mm": "month", 40 "m": "month", 41 "week": "week", 42 "ww": "week", 43 "wk": "week", 44 "day": "day", 45 "dd": "day", 46 "d": "day", 47} 48 49DATE_FMT_RE = re.compile("([dD]{1,2})|([mM]{1,2})|([yY]{1,4})|([hH]{1,2})|([sS]{1,2})") 50 51# N = Numeric, C=Currency 52TRANSPILE_SAFE_NUMBER_FMT = {"N", "C"} 53 54DEFAULT_START_DATE = datetime.date(1900, 1, 1) 55 56# Unsupported options: 57# - OPTIMIZE FOR ( @variable_name { UNKNOWN | = <literal_constant> } [ , ...n ] ) 58# - TABLE HINT 59OPTIONS: parser.OPTIONS_TYPE = { 60 **dict.fromkeys( 61 ( 62 "DISABLE_OPTIMIZED_PLAN_FORCING", 63 "FAST", 64 "IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX", 65 "LABEL", 66 "MAXDOP", 67 "MAXRECURSION", 68 "MAX_GRANT_PERCENT", 69 "MIN_GRANT_PERCENT", 70 "NO_PERFORMANCE_SPOOL", 71 "QUERYTRACEON", 72 "RECOMPILE", 73 ), 74 tuple(), 75 ), 76 "CONCAT": ("UNION",), 77 "DISABLE": ("EXTERNALPUSHDOWN", "SCALEOUTEXECUTION"), 78 "EXPAND": ("VIEWS",), 79 "FORCE": ("EXTERNALPUSHDOWN", "ORDER", "SCALEOUTEXECUTION"), 80 "HASH": ("GROUP", "JOIN", "UNION"), 81 "KEEP": ("PLAN",), 82 "KEEPFIXED": ("PLAN",), 83 "LOOP": ("JOIN",), 84 "MERGE": ("JOIN", "UNION"), 85 "OPTIMIZE": (("FOR", "UNKNOWN"),), 86 "ORDER": ("GROUP",), 87 "PARAMETERIZATION": ("FORCED", "SIMPLE"), 88 "ROBUST": ("PLAN",), 89 "USE": ("PLAN",), 90} 91 92 93XML_OPTIONS: parser.OPTIONS_TYPE = { 94 **dict.fromkeys( 95 ( 96 "AUTO", 97 "EXPLICIT", 98 "TYPE", 99 ), 100 tuple(), 101 ), 102 "ELEMENTS": ( 103 "XSINIL", 104 "ABSENT", 105 ), 106 "BINARY": ("BASE64",), 107} 108 109 110OPTIONS_THAT_REQUIRE_EQUAL = ("MAX_GRANT_PERCENT", "MIN_GRANT_PERCENT", "LABEL") 111 112 113def _build_formatted_time( 114 exp_class: type[E], full_format_mapping: bool | None = None 115) -> t.Callable[[list], E]: 116 def _builder(args: list) -> E: 117 fmt = seq_get(args, 0) 118 if isinstance(fmt, exp.Expr): 119 from sqlglot.dialects.tsql import TSQL 120 121 fmt = exp.Literal.string( 122 format_time( 123 fmt.name.lower(), 124 ( 125 {**TSQL.TIME_MAPPING, **FULL_FORMAT_TIME_MAPPING} 126 if full_format_mapping 127 else TSQL.TIME_MAPPING 128 ), 129 ) 130 ) 131 132 this = seq_get(args, 1) 133 if isinstance(this, exp.Expr): 134 this = exp.cast(this, exp.DType.DATETIME2) 135 136 return exp_class(this=this, format=fmt) 137 138 return _builder 139 140 141def _build_format(args: list) -> exp.NumberToStr | exp.TimeToStr: 142 this = seq_get(args, 0) 143 fmt = seq_get(args, 1) 144 culture = seq_get(args, 2) 145 146 number_fmt = fmt and (fmt.name in TRANSPILE_SAFE_NUMBER_FMT or not DATE_FMT_RE.search(fmt.name)) 147 148 if number_fmt: 149 return exp.NumberToStr(this=this, format=fmt, culture=culture) 150 151 if fmt: 152 from sqlglot.dialects.tsql import TSQL 153 154 fmt = exp.Literal.string( 155 format_time(fmt.name, TSQL.FORMAT_TIME_MAPPING) 156 if len(fmt.name) == 1 157 else format_time(fmt.name, TSQL.TIME_MAPPING) 158 ) 159 160 return exp.TimeToStr(this=this, format=fmt, culture=culture) 161 162 163def _build_eomonth(args: list) -> exp.LastDay: 164 date = exp.TsOrDsToDate(this=seq_get(args, 0)) 165 month_lag = seq_get(args, 1) 166 167 if month_lag is None: 168 this: exp.Expr = date 169 else: 170 unit = DATE_DELTA_INTERVAL.get("month") 171 this = exp.DateAdd(this=date, expression=month_lag, unit=unit and exp.var(unit)) 172 173 return exp.LastDay(this=this) 174 175 176def _build_hashbytes(args: list) -> exp.Expr: 177 kind, data = args 178 kind = kind.name.upper() if kind.is_string else "" 179 180 if kind == "MD5": 181 args.pop(0) 182 return exp.MD5(this=data) 183 if kind in ("SHA", "SHA1"): 184 args.pop(0) 185 return exp.SHA(this=data) 186 if kind == "SHA2_256": 187 return exp.SHA2(this=data, length=exp.Literal.number(256)) 188 if kind == "SHA2_512": 189 return exp.SHA2(this=data, length=exp.Literal.number(512)) 190 191 return exp.func("HASHBYTES", *args) 192 193 194def _build_date_delta( 195 exp_class: type[E], unit_mapping: dict[str, str] | None = None, big_int: bool = False 196) -> t.Callable[[list], E]: 197 def _builder(args: list) -> E: 198 unit = seq_get(args, 0) 199 if unit and unit_mapping: 200 unit = exp.var(unit_mapping.get(unit.name.lower(), unit.name)) 201 202 start_date = seq_get(args, 1) 203 if start_date and start_date.is_number: 204 # Numeric types are valid DATETIME values 205 if start_date.is_int: 206 adds = DEFAULT_START_DATE + datetime.timedelta(days=start_date.to_py()) 207 start_date = exp.Literal.string(adds.strftime("%F")) 208 else: 209 # We currently don't handle float values, i.e. they're not converted to equivalent DATETIMEs. 210 # This is not a problem when generating T-SQL code, it is when transpiling to other dialects. 211 return exp_class( 212 this=seq_get(args, 2), expression=start_date, unit=unit, big_int=big_int 213 ) 214 215 return exp_class( 216 this=exp.TimeStrToTime(this=seq_get(args, 2)), 217 expression=exp.TimeStrToTime(this=start_date), 218 unit=unit, 219 big_int=big_int, 220 ) 221 222 return _builder 223 224 225# https://learn.microsoft.com/en-us/sql/t-sql/functions/datetimefromparts-transact-sql?view=sql-server-ver16#syntax 226def _build_datetimefromparts(args: list) -> exp.TimestampFromParts: 227 return exp.TimestampFromParts( 228 year=seq_get(args, 0), 229 month=seq_get(args, 1), 230 day=seq_get(args, 2), 231 hour=seq_get(args, 3), 232 min=seq_get(args, 4), 233 sec=seq_get(args, 5), 234 milli=seq_get(args, 6), 235 ) 236 237 238# https://learn.microsoft.com/en-us/sql/t-sql/functions/timefromparts-transact-sql?view=sql-server-ver16#syntax 239def _build_timefromparts(args: list) -> exp.TimeFromParts: 240 return exp.TimeFromParts( 241 hour=seq_get(args, 0), 242 min=seq_get(args, 1), 243 sec=seq_get(args, 2), 244 fractions=seq_get(args, 3), 245 precision=seq_get(args, 4), 246 ) 247 248 249def _build_with_arg_as_text( 250 klass: type[exp.Expr], 251) -> t.Callable[[list[exp.Expr]], exp.Expr]: 252 def _parse(args: list[exp.Expr]) -> exp.Expr: 253 this = seq_get(args, 0) 254 255 if this and not this.is_string: 256 this = exp.cast(this, exp.DType.TEXT) 257 258 expression = seq_get(args, 1) 259 kwargs = {"this": this} 260 261 if expression: 262 kwargs["expression"] = expression 263 264 return klass(**kwargs) 265 266 return _parse 267 268 269# https://learn.microsoft.com/en-us/sql/t-sql/functions/parsename-transact-sql?view=sql-server-ver16 270def _build_parsename(args: list) -> exp.SplitPart | exp.Anonymous: 271 # PARSENAME(...) will be stored into exp.SplitPart if: 272 # - All args are literals 273 # - The part index (2nd arg) is <= 4 (max valid value, otherwise TSQL returns NULL) 274 if len(args) == 2 and all(isinstance(arg, exp.Literal) for arg in args): 275 this = args[0] 276 part_index = args[1] 277 split_count = len(this.name.split(".")) 278 if split_count <= 4: 279 return exp.SplitPart( 280 this=this, 281 delimiter=exp.Literal.string("."), 282 part_index=exp.Literal.number(split_count + 1 - part_index.to_py()), 283 ) 284 285 return exp.Anonymous(this="PARSENAME", expressions=args) 286 287 288def _build_json_query(args: list, dialect: Dialect) -> exp.JSONExtract: 289 if len(args) == 1: 290 # The default value for path is '$'. As a result, if you don't provide a 291 # value for path, JSON_QUERY returns the input expression. 292 args.append(exp.Literal.string("$")) 293 294 return parser.build_extract_json_with_path(exp.JSONExtract)(args, dialect) 295 296 297def _build_datetrunc(args: list) -> exp.TimestampTrunc: 298 unit = seq_get(args, 0) 299 this = seq_get(args, 1) 300 301 if this and this.is_string: 302 this = exp.cast(this, exp.DType.DATETIME2) 303 304 return exp.TimestampTrunc(this=this, unit=unit) 305 306 307class TSQLParser(parser.Parser): 308 SET_REQUIRES_ASSIGNMENT_DELIMITER = False 309 LOG_DEFAULTS_TO_LN = True 310 STRING_ALIASES = True 311 NO_PAREN_IF_COMMANDS = False 312 313 NO_PAREN_FUNCTIONS = { 314 **parser.Parser.NO_PAREN_FUNCTIONS, 315 TokenType.SESSION_USER: exp.SessionUser, 316 } 317 318 QUERY_MODIFIER_PARSERS = { 319 **parser.Parser.QUERY_MODIFIER_PARSERS, 320 TokenType.OPTION: lambda self: ("options", self._parse_options()), 321 TokenType.FOR: lambda self: ("for_", self._parse_for()), 322 } 323 324 # T-SQL does not allow BEGIN to be used as an identifier 325 ID_VAR_TOKENS = parser.Parser.ID_VAR_TOKENS - {TokenType.BEGIN} 326 ALIAS_TOKENS = parser.Parser.ALIAS_TOKENS - {TokenType.BEGIN} 327 TABLE_ALIAS_TOKENS = (parser.Parser.TABLE_ALIAS_TOKENS | {TokenType.ANTI, TokenType.SEMI}) - { 328 TokenType.BEGIN 329 } 330 COMMENT_TABLE_ALIAS_TOKENS = parser.Parser.COMMENT_TABLE_ALIAS_TOKENS - {TokenType.BEGIN} 331 UPDATE_ALIAS_TOKENS = parser.Parser.UPDATE_ALIAS_TOKENS - {TokenType.BEGIN} 332 333 FUNCTIONS = { 334 **parser.Parser.FUNCTIONS, 335 "ATN2": exp.Atan2.from_arg_list, 336 "CHARINDEX": lambda args: exp.StrPosition( 337 this=seq_get(args, 1), 338 substr=seq_get(args, 0), 339 position=seq_get(args, 2), 340 ), 341 "COUNT": lambda args: exp.Count(this=seq_get(args, 0), expressions=args[1:], big_int=False), 342 "COUNT_BIG": lambda args: exp.Count( 343 this=seq_get(args, 0), expressions=args[1:], big_int=True 344 ), 345 "DATEADD": build_date_delta(exp.DateAdd, unit_mapping=DATE_DELTA_INTERVAL), 346 "DATEDIFF": _build_date_delta(exp.DateDiff, unit_mapping=DATE_DELTA_INTERVAL), 347 "DATEDIFF_BIG": _build_date_delta( 348 exp.DateDiff, unit_mapping=DATE_DELTA_INTERVAL, big_int=True 349 ), 350 "DATENAME": _build_formatted_time(exp.TimeToStr, full_format_mapping=True), 351 "DATETIMEFROMPARTS": _build_datetimefromparts, 352 "EOMONTH": _build_eomonth, 353 "FORMAT": _build_format, 354 "GETDATE": exp.CurrentTimestamp.from_arg_list, 355 "HASHBYTES": _build_hashbytes, 356 "ISNULL": lambda args: build_coalesce(args=args, is_null=True), 357 "JSON_QUERY": _build_json_query, 358 "JSON_VALUE": parser.build_extract_json_with_path(exp.JSONExtractScalar), 359 "LEN": _build_with_arg_as_text(exp.Length), 360 "LEFT": _build_with_arg_as_text(exp.Left), 361 "NEWID": exp.Uuid.from_arg_list, 362 "RIGHT": _build_with_arg_as_text(exp.Right), 363 "PARSENAME": _build_parsename, 364 "REPLICATE": exp.Repeat.from_arg_list, 365 "SCHEMA_NAME": exp.CurrentSchema.from_arg_list, 366 "SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)), 367 "SYSDATETIME": exp.CurrentTimestamp.from_arg_list, 368 "SUSER_NAME": exp.CurrentUser.from_arg_list, 369 "SUSER_SNAME": exp.CurrentUser.from_arg_list, 370 "SYSDATETIMEOFFSET": exp.CurrentTimestampLTZ.from_arg_list, 371 "SYSTEM_USER": exp.CurrentUser.from_arg_list, 372 "TIMEFROMPARTS": _build_timefromparts, 373 "DATETRUNC": _build_datetrunc, 374 } 375 376 JOIN_HINTS = {"LOOP", "HASH", "MERGE", "REMOTE"} 377 378 PROCEDURE_OPTIONS = dict.fromkeys( 379 ("ENCRYPTION", "RECOMPILE", "SCHEMABINDING", "NATIVE_COMPILATION", "EXECUTE"), tuple() 380 ) 381 382 COLUMN_DEFINITION_MODES = {"OUT", "OUTPUT", "READONLY"} 383 384 RETURNS_TABLE_TOKENS = parser.Parser.ID_VAR_TOKENS - { 385 TokenType.TABLE, 386 *parser.Parser.TYPE_TOKENS, 387 } 388 389 STATEMENT_PARSERS = { 390 **parser.Parser.STATEMENT_PARSERS, 391 TokenType.DECLARE: lambda self: self._parse_declare(), 392 TokenType.EXECUTE: lambda self: self._parse_execute(), 393 } 394 395 RANGE_PARSERS = { 396 **parser.Parser.RANGE_PARSERS, 397 TokenType.DCOLON: lambda self, this: self.expression( 398 exp.ScopeResolution( 399 this=this, expression=self._parse_function() or self._parse_var(any_token=True) 400 ) 401 ), 402 } 403 404 NO_PAREN_FUNCTION_PARSERS = { 405 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 406 "NEXT": lambda self: self._parse_next_value_for(), 407 } 408 409 FUNCTION_PARSERS = { 410 **parser.Parser.FUNCTION_PARSERS, 411 "JSON_ARRAYAGG": lambda self: self.expression( 412 exp.JSONArrayAgg( 413 this=self._parse_bitwise(), 414 order=self._parse_order(), 415 null_handling=self._parse_on_handling("NULL", "NULL", "ABSENT"), 416 ) 417 ), 418 "DATEPART": lambda self: self._parse_datepart(), 419 } 420 421 # The DCOLON (::) operator serves as a scope resolution (exp.ScopeResolution) operator in T-SQL 422 COLUMN_OPERATORS = { 423 **parser.Parser.COLUMN_OPERATORS, 424 TokenType.DCOLON: lambda self, this, to: ( 425 self.expression(exp.Cast(this=this, to=to)) 426 if isinstance(to, exp.DataType) and to.this != exp.DType.USERDEFINED 427 else self.expression(exp.ScopeResolution(this=this, expression=to)) 428 ), 429 } 430 431 SET_OP_MODIFIERS = {"offset"} 432 433 ODBC_DATETIME_LITERALS = { 434 "d": exp.Date, 435 "t": exp.Time, 436 "ts": exp.Timestamp, 437 } 438 439 def _parse_execute(self) -> exp.Execute: 440 execute = self.expression( 441 exp.Execute( 442 this=self._parse_table(schema=True), 443 expressions=self._parse_csv(self._parse_expression), 444 ) 445 ) 446 447 if execute.name.lower() == "sp_executesql": 448 execute = self.expression(exp.ExecuteSql(**execute.args)) 449 450 return execute 451 452 def _parse_datepart(self) -> exp.Extract: 453 this = self._parse_var(tokens=[TokenType.IDENTIFIER]) 454 expression = self._match(TokenType.COMMA) and self._parse_bitwise() 455 name = map_date_part(this, self.dialect) 456 457 return self.expression(exp.Extract(this=name, expression=expression)) 458 459 def _parse_alter_table_set(self) -> exp.AlterSet: 460 return self._parse_wrapped(super()._parse_alter_table_set) 461 462 def _parse_wrapped_select(self, table: bool = False) -> exp.Expr | None: 463 if self._match(TokenType.MERGE): 464 comments = self._prev_comments 465 merge = self._parse_merge() 466 merge.add_comments(comments, prepend=True) 467 return merge 468 469 return super()._parse_wrapped_select(table=table) 470 471 def _parse_dcolon(self) -> exp.Expr | None: 472 # We want to use _parse_types() if the first token after :: is a known type, 473 # otherwise we could parse something like x::varchar(max) into a function 474 if self._match_set(self.TYPE_TOKENS, advance=False): 475 return self._parse_types() 476 477 return self._parse_function() or self._parse_types() 478 479 def _parse_options(self) -> list[exp.Expr] | None: 480 if not self._match(TokenType.OPTION): 481 return None 482 483 def _parse_option() -> exp.Expr | None: 484 option = self._parse_var_from_options(OPTIONS) 485 if not option: 486 return None 487 488 self._match(TokenType.EQ) 489 return self.expression( 490 exp.QueryOption(this=option, expression=self._parse_primary_or_var()) 491 ) 492 493 return self._parse_wrapped_csv(_parse_option) 494 495 def _parse_xml_key_value_option(self) -> exp.XMLKeyValueOption: 496 this = self._parse_primary_or_var() 497 if self._match(TokenType.L_PAREN, advance=False): 498 expression = self._parse_wrapped(self._parse_string) 499 else: 500 expression = None 501 502 return exp.XMLKeyValueOption(this=this, expression=expression) 503 504 def _parse_for(self) -> list[exp.Expr] | None: 505 if not self._match_pair(TokenType.FOR, TokenType.XML): 506 return None 507 508 def _parse_for_xml() -> exp.Expr | None: 509 return self.expression( 510 exp.QueryOption( 511 this=self._parse_var_from_options(XML_OPTIONS, raise_unmatched=False) 512 or self._parse_xml_key_value_option() 513 ) 514 ) 515 516 return self._parse_csv(_parse_for_xml) 517 518 def _parse_projections( 519 self, 520 ) -> tuple[list[exp.Expr], list[exp.Expr] | None]: 521 """ 522 T-SQL supports the syntax alias = expression in the SELECT's projection list, 523 so we transform all parsed Selects to convert their EQ projections into Aliases. 524 525 See: https://learn.microsoft.com/en-us/sql/t-sql/queries/select-clause-transact-sql?view=sql-server-ver16#syntax 526 """ 527 projections, _ = super()._parse_projections() 528 return [ 529 ( 530 exp.alias_(projection.expression, projection.this.this, copy=False) 531 if isinstance(projection, exp.EQ) and isinstance(projection.this, exp.Column) 532 else projection 533 ) 534 for projection in projections 535 ], None 536 537 def _parse_commit_or_rollback(self) -> exp.Commit | exp.Rollback: 538 """Applies to SQL Server and Azure SQL Database 539 COMMIT [ { TRAN | TRANSACTION } 540 [ transaction_name | @tran_name_variable ] ] 541 [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ] 542 543 ROLLBACK { TRAN | TRANSACTION } 544 [ transaction_name | @tran_name_variable 545 | savepoint_name | @savepoint_variable ] 546 """ 547 rollback = self._prev.token_type == TokenType.ROLLBACK 548 549 self._match_texts(("TRAN", "TRANSACTION")) 550 this = self._parse_id_var() 551 552 if rollback: 553 return self.expression(exp.Rollback(this=this)) 554 555 durability = None 556 if self._match_pair(TokenType.WITH, TokenType.L_PAREN): 557 self._match_text_seq("DELAYED_DURABILITY") 558 self._match(TokenType.EQ) 559 560 if self._match_text_seq("OFF"): 561 durability = False 562 else: 563 self._match(TokenType.ON) 564 durability = True 565 566 self._match_r_paren() 567 568 return self.expression(exp.Commit(this=this, durability=durability)) 569 570 def _parse_transaction(self) -> exp.Transaction | exp.Command: 571 """Applies to SQL Server and Azure SQL Database 572 BEGIN { TRAN | TRANSACTION } 573 [ { transaction_name | @tran_name_variable } 574 [ WITH MARK [ 'description' ] ] 575 ] 576 """ 577 if self._match_texts(("TRAN", "TRANSACTION")): 578 transaction = self.expression(exp.Transaction(this=self._parse_id_var())) 579 if self._match_text_seq("WITH", "MARK"): 580 transaction.set("mark", self._parse_string()) 581 582 return transaction 583 584 return self._parse_as_command(self._prev) 585 586 def _parse_returns(self) -> exp.ReturnsProperty: 587 table = self._parse_id_var(any_token=False, tokens=self.RETURNS_TABLE_TOKENS) 588 returns = super()._parse_returns() 589 returns.set("table", table) 590 return returns 591 592 def _parse_convert(self, strict: bool, safe: bool | None = None) -> exp.Expr | None: 593 this = self._parse_types() 594 self._match(TokenType.COMMA) 595 args = [this, *self._parse_csv(self._parse_assignment)] 596 convert = exp.Convert.from_arg_list(args) 597 convert.set("safe", safe) 598 return convert 599 600 def _parse_column_def( 601 self, this: exp.Expr | None, computed_column: bool = True 602 ) -> exp.Expr | None: 603 this = super()._parse_column_def(this=this, computed_column=computed_column) 604 if not this: 605 return None 606 if self._match(TokenType.EQ): 607 this.set("default", self._parse_disjunction()) 608 if self._match_texts(self.COLUMN_DEFINITION_MODES): 609 this.set("output", self._prev.text) 610 return this 611 612 def _parse_user_defined_function(self, kind: TokenType | None = None) -> exp.Expr | None: 613 this = super()._parse_user_defined_function(kind=kind) 614 615 if kind == TokenType.FUNCTION or isinstance(this, exp.UserDefinedFunction): 616 return this 617 618 if kind == TokenType.PROCEDURE and this: 619 expressions = this.expressions 620 if not ( 621 expressions or self._match_set((TokenType.ALIAS, TokenType.WITH), advance=False) 622 ): 623 expressions = self._parse_csv(self._parse_function_parameter) 624 625 return self.expression( 626 exp.StoredProcedure( 627 this=this if isinstance(this, exp.Table) else this.this, 628 expressions=expressions, 629 wrapped=this.args.get("wrapped"), 630 ) 631 ) 632 633 return self.expression(exp.UserDefinedFunction(this=this)) 634 635 def _parse_into(self) -> exp.Into | None: 636 into = super()._parse_into() 637 638 table = isinstance(into, exp.Into) and into.find(exp.Table) 639 if isinstance(table, exp.Table): 640 table_identifier = table.this 641 if table_identifier.args.get("temporary"): 642 # Promote the temporary property from the Identifier to the Into expression 643 t.cast(exp.Into, into).set("temporary", True) 644 645 return into 646 647 def _parse_id_var( 648 self, 649 any_token: bool = True, 650 tokens: Collection[TokenType] | None = None, 651 ) -> exp.Expr | None: 652 is_temporary = self._match(TokenType.HASH) 653 is_global = is_temporary and self._match(TokenType.HASH) 654 655 this = super()._parse_id_var(any_token=any_token, tokens=tokens) 656 if this: 657 if is_global: 658 this.set("global_", True) 659 elif is_temporary: 660 this.set("temporary", True) 661 662 return this 663 664 def _parse_create(self) -> exp.Create | exp.Command: 665 create = super()._parse_create() 666 667 if isinstance(create, exp.Create): 668 table = create.this.this if isinstance(create.this, exp.Schema) else create.this 669 if isinstance(table, exp.Table) and table.this and table.this.args.get("temporary"): 670 if not create.args.get("properties"): 671 create.set("properties", exp.Properties(expressions=[])) 672 673 create.args["properties"].append("expressions", exp.TemporaryProperty()) 674 675 return create 676 677 def _parse_if(self) -> exp.Expr | None: 678 this = self._parse_condition() 679 true = self._parse_block() 680 681 false = self._match(TokenType.ELSE) and self._parse_block() 682 683 return self.expression(exp.IfBlock(this=this, true=true, false=false)) 684 685 def _parse_unique(self) -> exp.UniqueColumnConstraint: 686 if self._match_texts(("CLUSTERED", "NONCLUSTERED")): 687 this = self.CONSTRAINT_PARSERS[self._prev.text.upper()](self) 688 else: 689 this = self._parse_schema(self._parse_id_var(any_token=False)) 690 691 return self.expression(exp.UniqueColumnConstraint(this=this)) 692 693 def _parse_update(self) -> exp.Update: 694 expression = super()._parse_update() 695 expression.set("options", self._parse_options()) 696 return expression 697 698 def _parse_partition(self) -> exp.Partition | None: 699 if not self._match_text_seq("WITH", "(", "PARTITIONS"): 700 return None 701 702 def parse_range(): 703 low = self._parse_bitwise() 704 high = self._parse_bitwise() if self._match_text_seq("TO") else None 705 706 return self.expression(exp.PartitionRange(this=low, expression=high)) if high else low 707 708 partition = self.expression(exp.Partition(expressions=self._parse_wrapped_csv(parse_range))) 709 710 self._match_r_paren() 711 712 return partition 713 714 def _parse_alter_table_alter(self) -> exp.Expr | None: 715 expression = super()._parse_alter_table_alter() 716 717 if expression is not None: 718 collation = expression.args.get("collate") 719 if isinstance(collation, exp.Column) and isinstance(collation.this, exp.Identifier): 720 identifier = collation.this 721 collation.set("this", exp.Var(this=identifier.name)) 722 723 return expression 724 725 def _parse_primary_key_part(self) -> exp.Expr | None: 726 return self._parse_ordered()
FULL_FORMAT_TIME_MAPPING =
{'weekday': '%A', 'dw': '%A', 'w': '%A', 'month': '%B', 'mm': '%B', 'm': '%B'}
DATE_DELTA_INTERVAL =
{'year': 'year', 'yyyy': 'year', 'yy': 'year', 'quarter': 'quarter', 'qq': 'quarter', 'q': 'quarter', 'month': 'month', 'mm': 'month', 'm': 'month', 'week': 'week', 'ww': 'week', 'wk': 'week', 'day': 'day', 'dd': 'day', 'd': 'day'}
DATE_FMT_RE =
re.compile('([dD]{1,2})|([mM]{1,2})|([yY]{1,4})|([hH]{1,2})|([sS]{1,2})')
TRANSPILE_SAFE_NUMBER_FMT =
{'C', 'N'}
DEFAULT_START_DATE =
datetime.date(1900, 1, 1)
OPTIONS: dict[str, Sequence[typing.Union[Sequence[str], str]]] =
{'DISABLE_OPTIMIZED_PLAN_FORCING': (), 'FAST': (), 'IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX': (), 'LABEL': (), 'MAXDOP': (), 'MAXRECURSION': (), 'MAX_GRANT_PERCENT': (), 'MIN_GRANT_PERCENT': (), 'NO_PERFORMANCE_SPOOL': (), 'QUERYTRACEON': (), 'RECOMPILE': (), 'CONCAT': ('UNION',), 'DISABLE': ('EXTERNALPUSHDOWN', 'SCALEOUTEXECUTION'), 'EXPAND': ('VIEWS',), 'FORCE': ('EXTERNALPUSHDOWN', 'ORDER', 'SCALEOUTEXECUTION'), 'HASH': ('GROUP', 'JOIN', 'UNION'), 'KEEP': ('PLAN',), 'KEEPFIXED': ('PLAN',), 'LOOP': ('JOIN',), 'MERGE': ('JOIN', 'UNION'), 'OPTIMIZE': (('FOR', 'UNKNOWN'),), 'ORDER': ('GROUP',), 'PARAMETERIZATION': ('FORCED', 'SIMPLE'), 'ROBUST': ('PLAN',), 'USE': ('PLAN',)}
XML_OPTIONS: dict[str, Sequence[typing.Union[Sequence[str], str]]] =
{'AUTO': (), 'EXPLICIT': (), 'TYPE': (), 'ELEMENTS': ('XSINIL', 'ABSENT'), 'BINARY': ('BASE64',)}
OPTIONS_THAT_REQUIRE_EQUAL =
('MAX_GRANT_PERCENT', 'MIN_GRANT_PERCENT', 'LABEL')
308class TSQLParser(parser.Parser): 309 SET_REQUIRES_ASSIGNMENT_DELIMITER = False 310 LOG_DEFAULTS_TO_LN = True 311 STRING_ALIASES = True 312 NO_PAREN_IF_COMMANDS = False 313 314 NO_PAREN_FUNCTIONS = { 315 **parser.Parser.NO_PAREN_FUNCTIONS, 316 TokenType.SESSION_USER: exp.SessionUser, 317 } 318 319 QUERY_MODIFIER_PARSERS = { 320 **parser.Parser.QUERY_MODIFIER_PARSERS, 321 TokenType.OPTION: lambda self: ("options", self._parse_options()), 322 TokenType.FOR: lambda self: ("for_", self._parse_for()), 323 } 324 325 # T-SQL does not allow BEGIN to be used as an identifier 326 ID_VAR_TOKENS = parser.Parser.ID_VAR_TOKENS - {TokenType.BEGIN} 327 ALIAS_TOKENS = parser.Parser.ALIAS_TOKENS - {TokenType.BEGIN} 328 TABLE_ALIAS_TOKENS = (parser.Parser.TABLE_ALIAS_TOKENS | {TokenType.ANTI, TokenType.SEMI}) - { 329 TokenType.BEGIN 330 } 331 COMMENT_TABLE_ALIAS_TOKENS = parser.Parser.COMMENT_TABLE_ALIAS_TOKENS - {TokenType.BEGIN} 332 UPDATE_ALIAS_TOKENS = parser.Parser.UPDATE_ALIAS_TOKENS - {TokenType.BEGIN} 333 334 FUNCTIONS = { 335 **parser.Parser.FUNCTIONS, 336 "ATN2": exp.Atan2.from_arg_list, 337 "CHARINDEX": lambda args: exp.StrPosition( 338 this=seq_get(args, 1), 339 substr=seq_get(args, 0), 340 position=seq_get(args, 2), 341 ), 342 "COUNT": lambda args: exp.Count(this=seq_get(args, 0), expressions=args[1:], big_int=False), 343 "COUNT_BIG": lambda args: exp.Count( 344 this=seq_get(args, 0), expressions=args[1:], big_int=True 345 ), 346 "DATEADD": build_date_delta(exp.DateAdd, unit_mapping=DATE_DELTA_INTERVAL), 347 "DATEDIFF": _build_date_delta(exp.DateDiff, unit_mapping=DATE_DELTA_INTERVAL), 348 "DATEDIFF_BIG": _build_date_delta( 349 exp.DateDiff, unit_mapping=DATE_DELTA_INTERVAL, big_int=True 350 ), 351 "DATENAME": _build_formatted_time(exp.TimeToStr, full_format_mapping=True), 352 "DATETIMEFROMPARTS": _build_datetimefromparts, 353 "EOMONTH": _build_eomonth, 354 "FORMAT": _build_format, 355 "GETDATE": exp.CurrentTimestamp.from_arg_list, 356 "HASHBYTES": _build_hashbytes, 357 "ISNULL": lambda args: build_coalesce(args=args, is_null=True), 358 "JSON_QUERY": _build_json_query, 359 "JSON_VALUE": parser.build_extract_json_with_path(exp.JSONExtractScalar), 360 "LEN": _build_with_arg_as_text(exp.Length), 361 "LEFT": _build_with_arg_as_text(exp.Left), 362 "NEWID": exp.Uuid.from_arg_list, 363 "RIGHT": _build_with_arg_as_text(exp.Right), 364 "PARSENAME": _build_parsename, 365 "REPLICATE": exp.Repeat.from_arg_list, 366 "SCHEMA_NAME": exp.CurrentSchema.from_arg_list, 367 "SQUARE": lambda args: exp.Pow(this=seq_get(args, 0), expression=exp.Literal.number(2)), 368 "SYSDATETIME": exp.CurrentTimestamp.from_arg_list, 369 "SUSER_NAME": exp.CurrentUser.from_arg_list, 370 "SUSER_SNAME": exp.CurrentUser.from_arg_list, 371 "SYSDATETIMEOFFSET": exp.CurrentTimestampLTZ.from_arg_list, 372 "SYSTEM_USER": exp.CurrentUser.from_arg_list, 373 "TIMEFROMPARTS": _build_timefromparts, 374 "DATETRUNC": _build_datetrunc, 375 } 376 377 JOIN_HINTS = {"LOOP", "HASH", "MERGE", "REMOTE"} 378 379 PROCEDURE_OPTIONS = dict.fromkeys( 380 ("ENCRYPTION", "RECOMPILE", "SCHEMABINDING", "NATIVE_COMPILATION", "EXECUTE"), tuple() 381 ) 382 383 COLUMN_DEFINITION_MODES = {"OUT", "OUTPUT", "READONLY"} 384 385 RETURNS_TABLE_TOKENS = parser.Parser.ID_VAR_TOKENS - { 386 TokenType.TABLE, 387 *parser.Parser.TYPE_TOKENS, 388 } 389 390 STATEMENT_PARSERS = { 391 **parser.Parser.STATEMENT_PARSERS, 392 TokenType.DECLARE: lambda self: self._parse_declare(), 393 TokenType.EXECUTE: lambda self: self._parse_execute(), 394 } 395 396 RANGE_PARSERS = { 397 **parser.Parser.RANGE_PARSERS, 398 TokenType.DCOLON: lambda self, this: self.expression( 399 exp.ScopeResolution( 400 this=this, expression=self._parse_function() or self._parse_var(any_token=True) 401 ) 402 ), 403 } 404 405 NO_PAREN_FUNCTION_PARSERS = { 406 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 407 "NEXT": lambda self: self._parse_next_value_for(), 408 } 409 410 FUNCTION_PARSERS = { 411 **parser.Parser.FUNCTION_PARSERS, 412 "JSON_ARRAYAGG": lambda self: self.expression( 413 exp.JSONArrayAgg( 414 this=self._parse_bitwise(), 415 order=self._parse_order(), 416 null_handling=self._parse_on_handling("NULL", "NULL", "ABSENT"), 417 ) 418 ), 419 "DATEPART": lambda self: self._parse_datepart(), 420 } 421 422 # The DCOLON (::) operator serves as a scope resolution (exp.ScopeResolution) operator in T-SQL 423 COLUMN_OPERATORS = { 424 **parser.Parser.COLUMN_OPERATORS, 425 TokenType.DCOLON: lambda self, this, to: ( 426 self.expression(exp.Cast(this=this, to=to)) 427 if isinstance(to, exp.DataType) and to.this != exp.DType.USERDEFINED 428 else self.expression(exp.ScopeResolution(this=this, expression=to)) 429 ), 430 } 431 432 SET_OP_MODIFIERS = {"offset"} 433 434 ODBC_DATETIME_LITERALS = { 435 "d": exp.Date, 436 "t": exp.Time, 437 "ts": exp.Timestamp, 438 } 439 440 def _parse_execute(self) -> exp.Execute: 441 execute = self.expression( 442 exp.Execute( 443 this=self._parse_table(schema=True), 444 expressions=self._parse_csv(self._parse_expression), 445 ) 446 ) 447 448 if execute.name.lower() == "sp_executesql": 449 execute = self.expression(exp.ExecuteSql(**execute.args)) 450 451 return execute 452 453 def _parse_datepart(self) -> exp.Extract: 454 this = self._parse_var(tokens=[TokenType.IDENTIFIER]) 455 expression = self._match(TokenType.COMMA) and self._parse_bitwise() 456 name = map_date_part(this, self.dialect) 457 458 return self.expression(exp.Extract(this=name, expression=expression)) 459 460 def _parse_alter_table_set(self) -> exp.AlterSet: 461 return self._parse_wrapped(super()._parse_alter_table_set) 462 463 def _parse_wrapped_select(self, table: bool = False) -> exp.Expr | None: 464 if self._match(TokenType.MERGE): 465 comments = self._prev_comments 466 merge = self._parse_merge() 467 merge.add_comments(comments, prepend=True) 468 return merge 469 470 return super()._parse_wrapped_select(table=table) 471 472 def _parse_dcolon(self) -> exp.Expr | None: 473 # We want to use _parse_types() if the first token after :: is a known type, 474 # otherwise we could parse something like x::varchar(max) into a function 475 if self._match_set(self.TYPE_TOKENS, advance=False): 476 return self._parse_types() 477 478 return self._parse_function() or self._parse_types() 479 480 def _parse_options(self) -> list[exp.Expr] | None: 481 if not self._match(TokenType.OPTION): 482 return None 483 484 def _parse_option() -> exp.Expr | None: 485 option = self._parse_var_from_options(OPTIONS) 486 if not option: 487 return None 488 489 self._match(TokenType.EQ) 490 return self.expression( 491 exp.QueryOption(this=option, expression=self._parse_primary_or_var()) 492 ) 493 494 return self._parse_wrapped_csv(_parse_option) 495 496 def _parse_xml_key_value_option(self) -> exp.XMLKeyValueOption: 497 this = self._parse_primary_or_var() 498 if self._match(TokenType.L_PAREN, advance=False): 499 expression = self._parse_wrapped(self._parse_string) 500 else: 501 expression = None 502 503 return exp.XMLKeyValueOption(this=this, expression=expression) 504 505 def _parse_for(self) -> list[exp.Expr] | None: 506 if not self._match_pair(TokenType.FOR, TokenType.XML): 507 return None 508 509 def _parse_for_xml() -> exp.Expr | None: 510 return self.expression( 511 exp.QueryOption( 512 this=self._parse_var_from_options(XML_OPTIONS, raise_unmatched=False) 513 or self._parse_xml_key_value_option() 514 ) 515 ) 516 517 return self._parse_csv(_parse_for_xml) 518 519 def _parse_projections( 520 self, 521 ) -> tuple[list[exp.Expr], list[exp.Expr] | None]: 522 """ 523 T-SQL supports the syntax alias = expression in the SELECT's projection list, 524 so we transform all parsed Selects to convert their EQ projections into Aliases. 525 526 See: https://learn.microsoft.com/en-us/sql/t-sql/queries/select-clause-transact-sql?view=sql-server-ver16#syntax 527 """ 528 projections, _ = super()._parse_projections() 529 return [ 530 ( 531 exp.alias_(projection.expression, projection.this.this, copy=False) 532 if isinstance(projection, exp.EQ) and isinstance(projection.this, exp.Column) 533 else projection 534 ) 535 for projection in projections 536 ], None 537 538 def _parse_commit_or_rollback(self) -> exp.Commit | exp.Rollback: 539 """Applies to SQL Server and Azure SQL Database 540 COMMIT [ { TRAN | TRANSACTION } 541 [ transaction_name | @tran_name_variable ] ] 542 [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ] 543 544 ROLLBACK { TRAN | TRANSACTION } 545 [ transaction_name | @tran_name_variable 546 | savepoint_name | @savepoint_variable ] 547 """ 548 rollback = self._prev.token_type == TokenType.ROLLBACK 549 550 self._match_texts(("TRAN", "TRANSACTION")) 551 this = self._parse_id_var() 552 553 if rollback: 554 return self.expression(exp.Rollback(this=this)) 555 556 durability = None 557 if self._match_pair(TokenType.WITH, TokenType.L_PAREN): 558 self._match_text_seq("DELAYED_DURABILITY") 559 self._match(TokenType.EQ) 560 561 if self._match_text_seq("OFF"): 562 durability = False 563 else: 564 self._match(TokenType.ON) 565 durability = True 566 567 self._match_r_paren() 568 569 return self.expression(exp.Commit(this=this, durability=durability)) 570 571 def _parse_transaction(self) -> exp.Transaction | exp.Command: 572 """Applies to SQL Server and Azure SQL Database 573 BEGIN { TRAN | TRANSACTION } 574 [ { transaction_name | @tran_name_variable } 575 [ WITH MARK [ 'description' ] ] 576 ] 577 """ 578 if self._match_texts(("TRAN", "TRANSACTION")): 579 transaction = self.expression(exp.Transaction(this=self._parse_id_var())) 580 if self._match_text_seq("WITH", "MARK"): 581 transaction.set("mark", self._parse_string()) 582 583 return transaction 584 585 return self._parse_as_command(self._prev) 586 587 def _parse_returns(self) -> exp.ReturnsProperty: 588 table = self._parse_id_var(any_token=False, tokens=self.RETURNS_TABLE_TOKENS) 589 returns = super()._parse_returns() 590 returns.set("table", table) 591 return returns 592 593 def _parse_convert(self, strict: bool, safe: bool | None = None) -> exp.Expr | None: 594 this = self._parse_types() 595 self._match(TokenType.COMMA) 596 args = [this, *self._parse_csv(self._parse_assignment)] 597 convert = exp.Convert.from_arg_list(args) 598 convert.set("safe", safe) 599 return convert 600 601 def _parse_column_def( 602 self, this: exp.Expr | None, computed_column: bool = True 603 ) -> exp.Expr | None: 604 this = super()._parse_column_def(this=this, computed_column=computed_column) 605 if not this: 606 return None 607 if self._match(TokenType.EQ): 608 this.set("default", self._parse_disjunction()) 609 if self._match_texts(self.COLUMN_DEFINITION_MODES): 610 this.set("output", self._prev.text) 611 return this 612 613 def _parse_user_defined_function(self, kind: TokenType | None = None) -> exp.Expr | None: 614 this = super()._parse_user_defined_function(kind=kind) 615 616 if kind == TokenType.FUNCTION or isinstance(this, exp.UserDefinedFunction): 617 return this 618 619 if kind == TokenType.PROCEDURE and this: 620 expressions = this.expressions 621 if not ( 622 expressions or self._match_set((TokenType.ALIAS, TokenType.WITH), advance=False) 623 ): 624 expressions = self._parse_csv(self._parse_function_parameter) 625 626 return self.expression( 627 exp.StoredProcedure( 628 this=this if isinstance(this, exp.Table) else this.this, 629 expressions=expressions, 630 wrapped=this.args.get("wrapped"), 631 ) 632 ) 633 634 return self.expression(exp.UserDefinedFunction(this=this)) 635 636 def _parse_into(self) -> exp.Into | None: 637 into = super()._parse_into() 638 639 table = isinstance(into, exp.Into) and into.find(exp.Table) 640 if isinstance(table, exp.Table): 641 table_identifier = table.this 642 if table_identifier.args.get("temporary"): 643 # Promote the temporary property from the Identifier to the Into expression 644 t.cast(exp.Into, into).set("temporary", True) 645 646 return into 647 648 def _parse_id_var( 649 self, 650 any_token: bool = True, 651 tokens: Collection[TokenType] | None = None, 652 ) -> exp.Expr | None: 653 is_temporary = self._match(TokenType.HASH) 654 is_global = is_temporary and self._match(TokenType.HASH) 655 656 this = super()._parse_id_var(any_token=any_token, tokens=tokens) 657 if this: 658 if is_global: 659 this.set("global_", True) 660 elif is_temporary: 661 this.set("temporary", True) 662 663 return this 664 665 def _parse_create(self) -> exp.Create | exp.Command: 666 create = super()._parse_create() 667 668 if isinstance(create, exp.Create): 669 table = create.this.this if isinstance(create.this, exp.Schema) else create.this 670 if isinstance(table, exp.Table) and table.this and table.this.args.get("temporary"): 671 if not create.args.get("properties"): 672 create.set("properties", exp.Properties(expressions=[])) 673 674 create.args["properties"].append("expressions", exp.TemporaryProperty()) 675 676 return create 677 678 def _parse_if(self) -> exp.Expr | None: 679 this = self._parse_condition() 680 true = self._parse_block() 681 682 false = self._match(TokenType.ELSE) and self._parse_block() 683 684 return self.expression(exp.IfBlock(this=this, true=true, false=false)) 685 686 def _parse_unique(self) -> exp.UniqueColumnConstraint: 687 if self._match_texts(("CLUSTERED", "NONCLUSTERED")): 688 this = self.CONSTRAINT_PARSERS[self._prev.text.upper()](self) 689 else: 690 this = self._parse_schema(self._parse_id_var(any_token=False)) 691 692 return self.expression(exp.UniqueColumnConstraint(this=this)) 693 694 def _parse_update(self) -> exp.Update: 695 expression = super()._parse_update() 696 expression.set("options", self._parse_options()) 697 return expression 698 699 def _parse_partition(self) -> exp.Partition | None: 700 if not self._match_text_seq("WITH", "(", "PARTITIONS"): 701 return None 702 703 def parse_range(): 704 low = self._parse_bitwise() 705 high = self._parse_bitwise() if self._match_text_seq("TO") else None 706 707 return self.expression(exp.PartitionRange(this=low, expression=high)) if high else low 708 709 partition = self.expression(exp.Partition(expressions=self._parse_wrapped_csv(parse_range))) 710 711 self._match_r_paren() 712 713 return partition 714 715 def _parse_alter_table_alter(self) -> exp.Expr | None: 716 expression = super()._parse_alter_table_alter() 717 718 if expression is not None: 719 collation = expression.args.get("collate") 720 if isinstance(collation, exp.Column) and isinstance(collation.this, exp.Identifier): 721 identifier = collation.this 722 collation.set("this", exp.Var(this=identifier.name)) 723 724 return expression 725 726 def _parse_primary_key_part(self) -> exp.Expr | None: 727 return self._parse_ordered()
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.
NO_PAREN_FUNCTIONS =
{<TokenType.CURRENT_DATE: 244>: <class 'sqlglot.expressions.temporal.CurrentDate'>, <TokenType.CURRENT_DATETIME: 245>: <class 'sqlglot.expressions.temporal.CurrentDate'>, <TokenType.CURRENT_TIME: 247>: <class 'sqlglot.expressions.temporal.CurrentTime'>, <TokenType.CURRENT_TIMESTAMP: 248>: <class 'sqlglot.expressions.temporal.CurrentTimestamp'>, <TokenType.CURRENT_USER: 249>: <class 'sqlglot.expressions.functions.CurrentUser'>, <TokenType.CURRENT_ROLE: 250>: <class 'sqlglot.expressions.functions.CurrentRole'>, <TokenType.SESSION_USER: 59>: <class 'sqlglot.expressions.functions.SessionUser'>}
QUERY_MODIFIER_PARSERS =
{<TokenType.MATCH_RECOGNIZE: 323>: <function Parser.<lambda>>, <TokenType.PREWHERE: 358>: <function Parser.<lambda>>, <TokenType.WHERE: 423>: <function Parser.<lambda>>, <TokenType.GROUP_BY: 287>: <function Parser.<lambda>>, <TokenType.HAVING: 289>: <function Parser.<lambda>>, <TokenType.QUALIFY: 364>: <function Parser.<lambda>>, <TokenType.WINDOW: 424>: <function Parser.<lambda>>, <TokenType.ORDER_BY: 338>: <function Parser.<lambda>>, <TokenType.LIMIT: 316>: <function Parser.<lambda>>, <TokenType.FETCH: 270>: <function Parser.<lambda>>, <TokenType.OFFSET: 334>: <function Parser.<lambda>>, <TokenType.FOR: 276>: <function TSQLParser.<lambda>>, <TokenType.LOCK: 319>: <function Parser.<lambda>>, <TokenType.TABLE_SAMPLE: 401>: <function Parser.<lambda>>, <TokenType.USING: 415>: <function Parser.<lambda>>, <TokenType.CLUSTER_BY: 233>: <function Parser.<lambda>>, <TokenType.DISTRIBUTE_BY: 260>: <function Parser.<lambda>>, <TokenType.SORT_BY: 393>: <function Parser.<lambda>>, <TokenType.CONNECT_BY: 238>: <function Parser.<lambda>>, <TokenType.START_WITH: 396>: <function Parser.<lambda>>, <TokenType.OPTION: 432>: <function TSQLParser.<lambda>>}
ID_VAR_TOKENS =
{<TokenType.SESSION: 57>, <TokenType.SESSION_USER: 59>, <TokenType.IDENTIFIER: 77>, <TokenType.DATABASE: 78>, <TokenType.COLUMN: 79>, <TokenType.SCHEMA: 81>, <TokenType.TABLE: 82>, <TokenType.WAREHOUSE: 83>, <TokenType.STAGE: 84>, <TokenType.STREAM: 85>, <TokenType.STREAMLIT: 86>, <TokenType.VAR: 87>, <TokenType.BIT: 95>, <TokenType.BOOLEAN: 96>, <TokenType.TINYINT: 97>, <TokenType.UTINYINT: 98>, <TokenType.SMALLINT: 99>, <TokenType.USMALLINT: 100>, <TokenType.MEDIUMINT: 101>, <TokenType.UMEDIUMINT: 102>, <TokenType.INT: 103>, <TokenType.UINT: 104>, <TokenType.BIGINT: 105>, <TokenType.UBIGINT: 106>, <TokenType.BIGNUM: 107>, <TokenType.INT128: 108>, <TokenType.UINT128: 109>, <TokenType.INT256: 110>, <TokenType.UINT256: 111>, <TokenType.FLOAT: 112>, <TokenType.DOUBLE: 113>, <TokenType.UDOUBLE: 114>, <TokenType.DECIMAL: 115>, <TokenType.DECIMAL32: 116>, <TokenType.DECIMAL64: 117>, <TokenType.DECIMAL128: 118>, <TokenType.DECIMAL256: 119>, <TokenType.DECFLOAT: 120>, <TokenType.UDECIMAL: 121>, <TokenType.BIGDECIMAL: 122>, <TokenType.CHAR: 123>, <TokenType.NCHAR: 124>, <TokenType.VARCHAR: 125>, <TokenType.NVARCHAR: 126>, <TokenType.BPCHAR: 127>, <TokenType.TEXT: 128>, <TokenType.MEDIUMTEXT: 129>, <TokenType.LONGTEXT: 130>, <TokenType.BLOB: 131>, <TokenType.MEDIUMBLOB: 132>, <TokenType.LONGBLOB: 133>, <TokenType.TINYBLOB: 134>, <TokenType.TINYTEXT: 135>, <TokenType.NAME: 136>, <TokenType.BINARY: 137>, <TokenType.VARBINARY: 138>, <TokenType.JSON: 139>, <TokenType.JSONB: 140>, <TokenType.TIME: 141>, <TokenType.TIMETZ: 142>, <TokenType.TIME_NS: 143>, <TokenType.TIMESTAMP: 144>, <TokenType.TIMESTAMPTZ: 145>, <TokenType.TIMESTAMPLTZ: 146>, <TokenType.TIMESTAMPNTZ: 147>, <TokenType.TIMESTAMP_S: 148>, <TokenType.TIMESTAMP_MS: 149>, <TokenType.TIMESTAMP_NS: 150>, <TokenType.DATETIME: 151>, <TokenType.DATETIME2: 152>, <TokenType.DATETIME64: 153>, <TokenType.SMALLDATETIME: 154>, <TokenType.DATE: 155>, <TokenType.DATE32: 156>, <TokenType.INT4RANGE: 157>, <TokenType.INT4MULTIRANGE: 158>, <TokenType.INT8RANGE: 159>, <TokenType.INT8MULTIRANGE: 160>, <TokenType.NUMRANGE: 161>, <TokenType.NUMMULTIRANGE: 162>, <TokenType.TSRANGE: 163>, <TokenType.TSMULTIRANGE: 164>, <TokenType.TSTZRANGE: 165>, <TokenType.TSTZMULTIRANGE: 166>, <TokenType.DATERANGE: 167>, <TokenType.DATEMULTIRANGE: 168>, <TokenType.UUID: 169>, <TokenType.GEOGRAPHY: 170>, <TokenType.GEOGRAPHYPOINT: 171>, <TokenType.NULLABLE: 172>, <TokenType.GEOMETRY: 173>, <TokenType.POINT: 174>, <TokenType.RING: 175>, <TokenType.LINESTRING: 176>, <TokenType.LOCALTIME: 177>, <TokenType.LOCALTIMESTAMP: 178>, <TokenType.MULTILINESTRING: 180>, <TokenType.POLYGON: 181>, <TokenType.MULTIPOLYGON: 182>, <TokenType.HLLSKETCH: 183>, <TokenType.HSTORE: 184>, <TokenType.SUPER: 185>, <TokenType.SERIAL: 186>, <TokenType.SMALLSERIAL: 187>, <TokenType.BIGSERIAL: 188>, <TokenType.XML: 189>, <TokenType.YEAR: 190>, <TokenType.USERDEFINED: 191>, <TokenType.MONEY: 192>, <TokenType.SMALLMONEY: 193>, <TokenType.ROWVERSION: 194>, <TokenType.IMAGE: 195>, <TokenType.VARIANT: 196>, <TokenType.OBJECT: 197>, <TokenType.INET: 198>, <TokenType.IPADDRESS: 199>, <TokenType.IPPREFIX: 200>, <TokenType.IPV4: 201>, <TokenType.IPV6: 202>, <TokenType.ENUM: 203>, <TokenType.ENUM8: 204>, <TokenType.ENUM16: 205>, <TokenType.FIXEDSTRING: 206>, <TokenType.LOWCARDINALITY: 207>, <TokenType.NESTED: 208>, <TokenType.AGGREGATEFUNCTION: 209>, <TokenType.SIMPLEAGGREGATEFUNCTION: 210>, <TokenType.TDIGEST: 211>, <TokenType.UNKNOWN: 212>, <TokenType.VECTOR: 213>, <TokenType.DYNAMIC: 214>, <TokenType.VOID: 215>, <TokenType.ALL: 218>, <TokenType.ANTI: 219>, <TokenType.ANY: 220>, <TokenType.APPLY: 221>, <TokenType.ARRAY: 222>, <TokenType.ASC: 223>, <TokenType.ASOF: 224>, <TokenType.ATTACH: 225>, <TokenType.AUTO_INCREMENT: 226>, <TokenType.CACHE: 230>, <TokenType.CASE: 231>, <TokenType.COLLATE: 234>, <TokenType.COMMAND: 235>, <TokenType.COMMENT: 236>, <TokenType.COMMIT: 237>, <TokenType.CONSTRAINT: 239>, <TokenType.COPY: 240>, <TokenType.CUBE: 243>, <TokenType.CURRENT_DATE: 244>, <TokenType.CURRENT_DATETIME: 245>, <TokenType.CURRENT_SCHEMA: 246>, <TokenType.CURRENT_TIME: 247>, <TokenType.CURRENT_TIMESTAMP: 248>, <TokenType.CURRENT_USER: 249>, <TokenType.CURRENT_ROLE: 250>, <TokenType.CURRENT_CATALOG: 251>, <TokenType.DEFAULT: 253>, <TokenType.DELETE: 254>, <TokenType.DESC: 255>, <TokenType.DESCRIBE: 256>, <TokenType.DETACH: 257>, <TokenType.DICTIONARY: 258>, <TokenType.DIV: 261>, <TokenType.END: 264>, <TokenType.ESCAPE: 265>, <TokenType.EXECUTE: 267>, <TokenType.EXISTS: 268>, <TokenType.FALSE: 269>, <TokenType.FILE: 271>, <TokenType.FILE_FORMAT: 272>, <TokenType.FILTER: 273>, <TokenType.FINAL: 274>, <TokenType.FIRST: 275>, <TokenType.FOREIGN_KEY: 278>, <TokenType.FORMAT: 279>, <TokenType.FULL: 281>, <TokenType.FUNCTION: 282>, <TokenType.GET: 283>, <TokenType.INDEX: 294>, <TokenType.INTERVAL: 301>, <TokenType.IS: 305>, <TokenType.ISNULL: 306>, <TokenType.KEEP: 309>, <TokenType.KILL: 311>, <TokenType.LEFT: 314>, <TokenType.LIMIT: 316>, <TokenType.LIST: 317>, <TokenType.LOAD: 318>, <TokenType.LOCK: 319>, <TokenType.MAP: 320>, <TokenType.MATCH: 321>, <TokenType.MERGE: 325>, <TokenType.MODEL: 327>, <TokenType.NATURAL: 328>, <TokenType.NEXT: 329>, <TokenType.NOTHING: 330>, <TokenType.NULL: 332>, <TokenType.OBJECT_IDENTIFIER: 333>, <TokenType.OFFSET: 334>, <TokenType.OPERATOR: 337>, <TokenType.ORDINALITY: 341>, <TokenType.INOUT: 343>, <TokenType.OVER: 345>, <TokenType.OVERLAPS: 346>, <TokenType.OVERWRITE: 347>, <TokenType.PARTITION: 349>, <TokenType.PERCENT: 351>, <TokenType.PIVOT: 352>, <TokenType.PRAGMA: 357>, <TokenType.PROCEDURE: 360>, <TokenType.PSEUDO_TYPE: 362>, <TokenType.PUT: 363>, <TokenType.RANGE: 367>, <TokenType.RECURSIVE: 368>, <TokenType.REFRESH: 369>, <TokenType.RENAME: 370>, <TokenType.REPLACE: 371>, <TokenType.REFERENCES: 374>, <TokenType.RIGHT: 375>, <TokenType.ROLLUP: 379>, <TokenType.ROW: 380>, <TokenType.ROWS: 381>, <TokenType.SEMI: 384>, <TokenType.SEQUENCE: 386>, <TokenType.SET: 388>, <TokenType.SETTINGS: 389>, <TokenType.SHOW: 390>, <TokenType.SOME: 392>, <TokenType.STORAGE_INTEGRATION: 397>, <TokenType.STRAIGHT_JOIN: 398>, <TokenType.STRUCT: 399>, <TokenType.TAG: 402>, <TokenType.TEMPORARY: 403>, <TokenType.TOP: 404>, <TokenType.TRUE: 406>, <TokenType.TRUNCATE: 407>, <TokenType.TRIGGER: 408>, <TokenType.UNNEST: 411>, <TokenType.UNPIVOT: 412>, <TokenType.UPDATE: 413>, <TokenType.USE: 414>, <TokenType.VIEW: 418>, <TokenType.SEMANTIC_VIEW: 419>, <TokenType.VOLATILE: 420>, <TokenType.WINDOW: 424>, <TokenType.UNIQUE: 426>, <TokenType.SINK: 433>, <TokenType.SOURCE: 434>, <TokenType.ANALYZE: 435>, <TokenType.NAMESPACE: 436>, <TokenType.EXPORT: 437>}
ALIAS_TOKENS =
{<TokenType.SESSION: 57>, <TokenType.SESSION_USER: 59>, <TokenType.IDENTIFIER: 77>, <TokenType.DATABASE: 78>, <TokenType.COLUMN: 79>, <TokenType.SCHEMA: 81>, <TokenType.TABLE: 82>, <TokenType.WAREHOUSE: 83>, <TokenType.STAGE: 84>, <TokenType.STREAM: 85>, <TokenType.STREAMLIT: 86>, <TokenType.VAR: 87>, <TokenType.BIT: 95>, <TokenType.BOOLEAN: 96>, <TokenType.TINYINT: 97>, <TokenType.UTINYINT: 98>, <TokenType.SMALLINT: 99>, <TokenType.USMALLINT: 100>, <TokenType.MEDIUMINT: 101>, <TokenType.UMEDIUMINT: 102>, <TokenType.INT: 103>, <TokenType.UINT: 104>, <TokenType.BIGINT: 105>, <TokenType.UBIGINT: 106>, <TokenType.BIGNUM: 107>, <TokenType.INT128: 108>, <TokenType.UINT128: 109>, <TokenType.INT256: 110>, <TokenType.UINT256: 111>, <TokenType.FLOAT: 112>, <TokenType.DOUBLE: 113>, <TokenType.UDOUBLE: 114>, <TokenType.DECIMAL: 115>, <TokenType.DECIMAL32: 116>, <TokenType.DECIMAL64: 117>, <TokenType.DECIMAL128: 118>, <TokenType.DECIMAL256: 119>, <TokenType.DECFLOAT: 120>, <TokenType.UDECIMAL: 121>, <TokenType.BIGDECIMAL: 122>, <TokenType.CHAR: 123>, <TokenType.NCHAR: 124>, <TokenType.VARCHAR: 125>, <TokenType.NVARCHAR: 126>, <TokenType.BPCHAR: 127>, <TokenType.TEXT: 128>, <TokenType.MEDIUMTEXT: 129>, <TokenType.LONGTEXT: 130>, <TokenType.BLOB: 131>, <TokenType.MEDIUMBLOB: 132>, <TokenType.LONGBLOB: 133>, <TokenType.TINYBLOB: 134>, <TokenType.TINYTEXT: 135>, <TokenType.NAME: 136>, <TokenType.BINARY: 137>, <TokenType.VARBINARY: 138>, <TokenType.JSON: 139>, <TokenType.JSONB: 140>, <TokenType.TIME: 141>, <TokenType.TIMETZ: 142>, <TokenType.TIME_NS: 143>, <TokenType.TIMESTAMP: 144>, <TokenType.TIMESTAMPTZ: 145>, <TokenType.TIMESTAMPLTZ: 146>, <TokenType.TIMESTAMPNTZ: 147>, <TokenType.TIMESTAMP_S: 148>, <TokenType.TIMESTAMP_MS: 149>, <TokenType.TIMESTAMP_NS: 150>, <TokenType.DATETIME: 151>, <TokenType.DATETIME2: 152>, <TokenType.DATETIME64: 153>, <TokenType.SMALLDATETIME: 154>, <TokenType.DATE: 155>, <TokenType.DATE32: 156>, <TokenType.INT4RANGE: 157>, <TokenType.INT4MULTIRANGE: 158>, <TokenType.INT8RANGE: 159>, <TokenType.INT8MULTIRANGE: 160>, <TokenType.NUMRANGE: 161>, <TokenType.NUMMULTIRANGE: 162>, <TokenType.TSRANGE: 163>, <TokenType.TSMULTIRANGE: 164>, <TokenType.TSTZRANGE: 165>, <TokenType.TSTZMULTIRANGE: 166>, <TokenType.DATERANGE: 167>, <TokenType.DATEMULTIRANGE: 168>, <TokenType.UUID: 169>, <TokenType.GEOGRAPHY: 170>, <TokenType.GEOGRAPHYPOINT: 171>, <TokenType.NULLABLE: 172>, <TokenType.GEOMETRY: 173>, <TokenType.POINT: 174>, <TokenType.RING: 175>, <TokenType.LINESTRING: 176>, <TokenType.LOCALTIME: 177>, <TokenType.LOCALTIMESTAMP: 178>, <TokenType.MULTILINESTRING: 180>, <TokenType.POLYGON: 181>, <TokenType.MULTIPOLYGON: 182>, <TokenType.HLLSKETCH: 183>, <TokenType.HSTORE: 184>, <TokenType.SUPER: 185>, <TokenType.SERIAL: 186>, <TokenType.SMALLSERIAL: 187>, <TokenType.BIGSERIAL: 188>, <TokenType.XML: 189>, <TokenType.YEAR: 190>, <TokenType.USERDEFINED: 191>, <TokenType.MONEY: 192>, <TokenType.SMALLMONEY: 193>, <TokenType.ROWVERSION: 194>, <TokenType.IMAGE: 195>, <TokenType.VARIANT: 196>, <TokenType.OBJECT: 197>, <TokenType.INET: 198>, <TokenType.IPADDRESS: 199>, <TokenType.IPPREFIX: 200>, <TokenType.IPV4: 201>, <TokenType.IPV6: 202>, <TokenType.ENUM: 203>, <TokenType.ENUM8: 204>, <TokenType.ENUM16: 205>, <TokenType.FIXEDSTRING: 206>, <TokenType.LOWCARDINALITY: 207>, <TokenType.NESTED: 208>, <TokenType.AGGREGATEFUNCTION: 209>, <TokenType.SIMPLEAGGREGATEFUNCTION: 210>, <TokenType.TDIGEST: 211>, <TokenType.UNKNOWN: 212>, <TokenType.VECTOR: 213>, <TokenType.DYNAMIC: 214>, <TokenType.VOID: 215>, <TokenType.ALL: 218>, <TokenType.ANTI: 219>, <TokenType.ANY: 220>, <TokenType.APPLY: 221>, <TokenType.ARRAY: 222>, <TokenType.ASC: 223>, <TokenType.ASOF: 224>, <TokenType.ATTACH: 225>, <TokenType.AUTO_INCREMENT: 226>, <TokenType.CACHE: 230>, <TokenType.CASE: 231>, <TokenType.COLLATE: 234>, <TokenType.COMMAND: 235>, <TokenType.COMMENT: 236>, <TokenType.COMMIT: 237>, <TokenType.CONSTRAINT: 239>, <TokenType.COPY: 240>, <TokenType.CUBE: 243>, <TokenType.CURRENT_DATE: 244>, <TokenType.CURRENT_DATETIME: 245>, <TokenType.CURRENT_SCHEMA: 246>, <TokenType.CURRENT_TIME: 247>, <TokenType.CURRENT_TIMESTAMP: 248>, <TokenType.CURRENT_USER: 249>, <TokenType.CURRENT_ROLE: 250>, <TokenType.CURRENT_CATALOG: 251>, <TokenType.DEFAULT: 253>, <TokenType.DELETE: 254>, <TokenType.DESC: 255>, <TokenType.DESCRIBE: 256>, <TokenType.DETACH: 257>, <TokenType.DICTIONARY: 258>, <TokenType.DIV: 261>, <TokenType.END: 264>, <TokenType.ESCAPE: 265>, <TokenType.EXECUTE: 267>, <TokenType.EXISTS: 268>, <TokenType.FALSE: 269>, <TokenType.FILE: 271>, <TokenType.FILE_FORMAT: 272>, <TokenType.FILTER: 273>, <TokenType.FINAL: 274>, <TokenType.FIRST: 275>, <TokenType.FOREIGN_KEY: 278>, <TokenType.FORMAT: 279>, <TokenType.FULL: 281>, <TokenType.FUNCTION: 282>, <TokenType.GET: 283>, <TokenType.INDEX: 294>, <TokenType.INTERVAL: 301>, <TokenType.IS: 305>, <TokenType.ISNULL: 306>, <TokenType.KEEP: 309>, <TokenType.KILL: 311>, <TokenType.LEFT: 314>, <TokenType.LIMIT: 316>, <TokenType.LIST: 317>, <TokenType.LOAD: 318>, <TokenType.LOCK: 319>, <TokenType.MAP: 320>, <TokenType.MATCH: 321>, <TokenType.MERGE: 325>, <TokenType.MODEL: 327>, <TokenType.NATURAL: 328>, <TokenType.NEXT: 329>, <TokenType.NOTHING: 330>, <TokenType.NULL: 332>, <TokenType.OBJECT_IDENTIFIER: 333>, <TokenType.OFFSET: 334>, <TokenType.OPERATOR: 337>, <TokenType.ORDINALITY: 341>, <TokenType.INOUT: 343>, <TokenType.OVER: 345>, <TokenType.OVERLAPS: 346>, <TokenType.OVERWRITE: 347>, <TokenType.PARTITION: 349>, <TokenType.PERCENT: 351>, <TokenType.PIVOT: 352>, <TokenType.PRAGMA: 357>, <TokenType.PROCEDURE: 360>, <TokenType.PSEUDO_TYPE: 362>, <TokenType.PUT: 363>, <TokenType.RANGE: 367>, <TokenType.RECURSIVE: 368>, <TokenType.REFRESH: 369>, <TokenType.RENAME: 370>, <TokenType.REPLACE: 371>, <TokenType.REFERENCES: 374>, <TokenType.RIGHT: 375>, <TokenType.ROLLUP: 379>, <TokenType.ROW: 380>, <TokenType.ROWS: 381>, <TokenType.SEMI: 384>, <TokenType.SEQUENCE: 386>, <TokenType.SET: 388>, <TokenType.SETTINGS: 389>, <TokenType.SHOW: 390>, <TokenType.SOME: 392>, <TokenType.STORAGE_INTEGRATION: 397>, <TokenType.STRAIGHT_JOIN: 398>, <TokenType.STRUCT: 399>, <TokenType.TAG: 402>, <TokenType.TEMPORARY: 403>, <TokenType.TOP: 404>, <TokenType.TRUE: 406>, <TokenType.TRUNCATE: 407>, <TokenType.TRIGGER: 408>, <TokenType.UNNEST: 411>, <TokenType.UNPIVOT: 412>, <TokenType.UPDATE: 413>, <TokenType.USE: 414>, <TokenType.VIEW: 418>, <TokenType.SEMANTIC_VIEW: 419>, <TokenType.VOLATILE: 420>, <TokenType.WINDOW: 424>, <TokenType.UNIQUE: 426>, <TokenType.SINK: 433>, <TokenType.SOURCE: 434>, <TokenType.ANALYZE: 435>, <TokenType.NAMESPACE: 436>, <TokenType.EXPORT: 437>}
TABLE_ALIAS_TOKENS =
{<TokenType.SESSION: 57>, <TokenType.SESSION_USER: 59>, <TokenType.IDENTIFIER: 77>, <TokenType.DATABASE: 78>, <TokenType.COLUMN: 79>, <TokenType.SCHEMA: 81>, <TokenType.TABLE: 82>, <TokenType.WAREHOUSE: 83>, <TokenType.STAGE: 84>, <TokenType.STREAM: 85>, <TokenType.STREAMLIT: 86>, <TokenType.VAR: 87>, <TokenType.BIT: 95>, <TokenType.BOOLEAN: 96>, <TokenType.TINYINT: 97>, <TokenType.UTINYINT: 98>, <TokenType.SMALLINT: 99>, <TokenType.USMALLINT: 100>, <TokenType.MEDIUMINT: 101>, <TokenType.UMEDIUMINT: 102>, <TokenType.INT: 103>, <TokenType.UINT: 104>, <TokenType.BIGINT: 105>, <TokenType.UBIGINT: 106>, <TokenType.BIGNUM: 107>, <TokenType.INT128: 108>, <TokenType.UINT128: 109>, <TokenType.INT256: 110>, <TokenType.UINT256: 111>, <TokenType.FLOAT: 112>, <TokenType.DOUBLE: 113>, <TokenType.UDOUBLE: 114>, <TokenType.DECIMAL: 115>, <TokenType.DECIMAL32: 116>, <TokenType.DECIMAL64: 117>, <TokenType.DECIMAL128: 118>, <TokenType.DECIMAL256: 119>, <TokenType.DECFLOAT: 120>, <TokenType.UDECIMAL: 121>, <TokenType.BIGDECIMAL: 122>, <TokenType.CHAR: 123>, <TokenType.NCHAR: 124>, <TokenType.VARCHAR: 125>, <TokenType.NVARCHAR: 126>, <TokenType.BPCHAR: 127>, <TokenType.TEXT: 128>, <TokenType.MEDIUMTEXT: 129>, <TokenType.LONGTEXT: 130>, <TokenType.BLOB: 131>, <TokenType.MEDIUMBLOB: 132>, <TokenType.LONGBLOB: 133>, <TokenType.TINYBLOB: 134>, <TokenType.TINYTEXT: 135>, <TokenType.NAME: 136>, <TokenType.BINARY: 137>, <TokenType.VARBINARY: 138>, <TokenType.JSON: 139>, <TokenType.JSONB: 140>, <TokenType.TIME: 141>, <TokenType.TIMETZ: 142>, <TokenType.TIME_NS: 143>, <TokenType.TIMESTAMP: 144>, <TokenType.TIMESTAMPTZ: 145>, <TokenType.TIMESTAMPLTZ: 146>, <TokenType.TIMESTAMPNTZ: 147>, <TokenType.TIMESTAMP_S: 148>, <TokenType.TIMESTAMP_MS: 149>, <TokenType.TIMESTAMP_NS: 150>, <TokenType.DATETIME: 151>, <TokenType.DATETIME2: 152>, <TokenType.DATETIME64: 153>, <TokenType.SMALLDATETIME: 154>, <TokenType.DATE: 155>, <TokenType.DATE32: 156>, <TokenType.INT4RANGE: 157>, <TokenType.INT4MULTIRANGE: 158>, <TokenType.INT8RANGE: 159>, <TokenType.INT8MULTIRANGE: 160>, <TokenType.NUMRANGE: 161>, <TokenType.NUMMULTIRANGE: 162>, <TokenType.TSRANGE: 163>, <TokenType.TSMULTIRANGE: 164>, <TokenType.TSTZRANGE: 165>, <TokenType.TSTZMULTIRANGE: 166>, <TokenType.DATERANGE: 167>, <TokenType.DATEMULTIRANGE: 168>, <TokenType.UUID: 169>, <TokenType.GEOGRAPHY: 170>, <TokenType.GEOGRAPHYPOINT: 171>, <TokenType.NULLABLE: 172>, <TokenType.GEOMETRY: 173>, <TokenType.POINT: 174>, <TokenType.RING: 175>, <TokenType.LINESTRING: 176>, <TokenType.LOCALTIME: 177>, <TokenType.LOCALTIMESTAMP: 178>, <TokenType.MULTILINESTRING: 180>, <TokenType.POLYGON: 181>, <TokenType.MULTIPOLYGON: 182>, <TokenType.HLLSKETCH: 183>, <TokenType.HSTORE: 184>, <TokenType.SUPER: 185>, <TokenType.SERIAL: 186>, <TokenType.SMALLSERIAL: 187>, <TokenType.BIGSERIAL: 188>, <TokenType.XML: 189>, <TokenType.YEAR: 190>, <TokenType.USERDEFINED: 191>, <TokenType.MONEY: 192>, <TokenType.SMALLMONEY: 193>, <TokenType.ROWVERSION: 194>, <TokenType.IMAGE: 195>, <TokenType.VARIANT: 196>, <TokenType.OBJECT: 197>, <TokenType.INET: 198>, <TokenType.IPADDRESS: 199>, <TokenType.IPPREFIX: 200>, <TokenType.IPV4: 201>, <TokenType.IPV6: 202>, <TokenType.ENUM: 203>, <TokenType.ENUM8: 204>, <TokenType.ENUM16: 205>, <TokenType.FIXEDSTRING: 206>, <TokenType.LOWCARDINALITY: 207>, <TokenType.NESTED: 208>, <TokenType.AGGREGATEFUNCTION: 209>, <TokenType.SIMPLEAGGREGATEFUNCTION: 210>, <TokenType.TDIGEST: 211>, <TokenType.UNKNOWN: 212>, <TokenType.VECTOR: 213>, <TokenType.DYNAMIC: 214>, <TokenType.VOID: 215>, <TokenType.ALL: 218>, <TokenType.ANTI: 219>, <TokenType.ANY: 220>, <TokenType.APPLY: 221>, <TokenType.ARRAY: 222>, <TokenType.ASC: 223>, <TokenType.ATTACH: 225>, <TokenType.AUTO_INCREMENT: 226>, <TokenType.CACHE: 230>, <TokenType.CASE: 231>, <TokenType.COLLATE: 234>, <TokenType.COMMAND: 235>, <TokenType.COMMENT: 236>, <TokenType.COMMIT: 237>, <TokenType.CONSTRAINT: 239>, <TokenType.COPY: 240>, <TokenType.CUBE: 243>, <TokenType.CURRENT_DATE: 244>, <TokenType.CURRENT_DATETIME: 245>, <TokenType.CURRENT_SCHEMA: 246>, <TokenType.CURRENT_TIME: 247>, <TokenType.CURRENT_TIMESTAMP: 248>, <TokenType.CURRENT_USER: 249>, <TokenType.CURRENT_ROLE: 250>, <TokenType.CURRENT_CATALOG: 251>, <TokenType.DEFAULT: 253>, <TokenType.DELETE: 254>, <TokenType.DESC: 255>, <TokenType.DESCRIBE: 256>, <TokenType.DETACH: 257>, <TokenType.DICTIONARY: 258>, <TokenType.DIV: 261>, <TokenType.END: 264>, <TokenType.ESCAPE: 265>, <TokenType.EXECUTE: 267>, <TokenType.EXISTS: 268>, <TokenType.FALSE: 269>, <TokenType.FILE: 271>, <TokenType.FILE_FORMAT: 272>, <TokenType.FILTER: 273>, <TokenType.FINAL: 274>, <TokenType.FIRST: 275>, <TokenType.FOREIGN_KEY: 278>, <TokenType.FORMAT: 279>, <TokenType.FUNCTION: 282>, <TokenType.GET: 283>, <TokenType.INDEX: 294>, <TokenType.INTERVAL: 301>, <TokenType.IS: 305>, <TokenType.ISNULL: 306>, <TokenType.KEEP: 309>, <TokenType.KILL: 311>, <TokenType.LIMIT: 316>, <TokenType.LIST: 317>, <TokenType.LOAD: 318>, <TokenType.MAP: 320>, <TokenType.MATCH: 321>, <TokenType.MERGE: 325>, <TokenType.MODEL: 327>, <TokenType.NEXT: 329>, <TokenType.NOTHING: 330>, <TokenType.NULL: 332>, <TokenType.OBJECT_IDENTIFIER: 333>, <TokenType.OFFSET: 334>, <TokenType.OPERATOR: 337>, <TokenType.ORDINALITY: 341>, <TokenType.INOUT: 343>, <TokenType.OVER: 345>, <TokenType.OVERLAPS: 346>, <TokenType.OVERWRITE: 347>, <TokenType.PARTITION: 349>, <TokenType.PERCENT: 351>, <TokenType.PIVOT: 352>, <TokenType.PRAGMA: 357>, <TokenType.PROCEDURE: 360>, <TokenType.PSEUDO_TYPE: 362>, <TokenType.PUT: 363>, <TokenType.RANGE: 367>, <TokenType.RECURSIVE: 368>, <TokenType.REFRESH: 369>, <TokenType.RENAME: 370>, <TokenType.REPLACE: 371>, <TokenType.REFERENCES: 374>, <TokenType.ROLLUP: 379>, <TokenType.ROW: 380>, <TokenType.ROWS: 381>, <TokenType.SEMI: 384>, <TokenType.SEQUENCE: 386>, <TokenType.SET: 388>, <TokenType.SETTINGS: 389>, <TokenType.SHOW: 390>, <TokenType.SOME: 392>, <TokenType.STORAGE_INTEGRATION: 397>, <TokenType.STRAIGHT_JOIN: 398>, <TokenType.STRUCT: 399>, <TokenType.TAG: 402>, <TokenType.TEMPORARY: 403>, <TokenType.TOP: 404>, <TokenType.TRUE: 406>, <TokenType.TRUNCATE: 407>, <TokenType.TRIGGER: 408>, <TokenType.UNNEST: 411>, <TokenType.UNPIVOT: 412>, <TokenType.UPDATE: 413>, <TokenType.USE: 414>, <TokenType.VIEW: 418>, <TokenType.SEMANTIC_VIEW: 419>, <TokenType.VOLATILE: 420>, <TokenType.UNIQUE: 426>, <TokenType.SINK: 433>, <TokenType.SOURCE: 434>, <TokenType.ANALYZE: 435>, <TokenType.NAMESPACE: 436>, <TokenType.EXPORT: 437>}
COMMENT_TABLE_ALIAS_TOKENS =
{<TokenType.SESSION: 57>, <TokenType.SESSION_USER: 59>, <TokenType.IDENTIFIER: 77>, <TokenType.DATABASE: 78>, <TokenType.COLUMN: 79>, <TokenType.SCHEMA: 81>, <TokenType.TABLE: 82>, <TokenType.WAREHOUSE: 83>, <TokenType.STAGE: 84>, <TokenType.STREAM: 85>, <TokenType.STREAMLIT: 86>, <TokenType.VAR: 87>, <TokenType.BIT: 95>, <TokenType.BOOLEAN: 96>, <TokenType.TINYINT: 97>, <TokenType.UTINYINT: 98>, <TokenType.SMALLINT: 99>, <TokenType.USMALLINT: 100>, <TokenType.MEDIUMINT: 101>, <TokenType.UMEDIUMINT: 102>, <TokenType.INT: 103>, <TokenType.UINT: 104>, <TokenType.BIGINT: 105>, <TokenType.UBIGINT: 106>, <TokenType.BIGNUM: 107>, <TokenType.INT128: 108>, <TokenType.UINT128: 109>, <TokenType.INT256: 110>, <TokenType.UINT256: 111>, <TokenType.FLOAT: 112>, <TokenType.DOUBLE: 113>, <TokenType.UDOUBLE: 114>, <TokenType.DECIMAL: 115>, <TokenType.DECIMAL32: 116>, <TokenType.DECIMAL64: 117>, <TokenType.DECIMAL128: 118>, <TokenType.DECIMAL256: 119>, <TokenType.DECFLOAT: 120>, <TokenType.UDECIMAL: 121>, <TokenType.BIGDECIMAL: 122>, <TokenType.CHAR: 123>, <TokenType.NCHAR: 124>, <TokenType.VARCHAR: 125>, <TokenType.NVARCHAR: 126>, <TokenType.BPCHAR: 127>, <TokenType.TEXT: 128>, <TokenType.MEDIUMTEXT: 129>, <TokenType.LONGTEXT: 130>, <TokenType.BLOB: 131>, <TokenType.MEDIUMBLOB: 132>, <TokenType.LONGBLOB: 133>, <TokenType.TINYBLOB: 134>, <TokenType.TINYTEXT: 135>, <TokenType.NAME: 136>, <TokenType.BINARY: 137>, <TokenType.VARBINARY: 138>, <TokenType.JSON: 139>, <TokenType.JSONB: 140>, <TokenType.TIME: 141>, <TokenType.TIMETZ: 142>, <TokenType.TIME_NS: 143>, <TokenType.TIMESTAMP: 144>, <TokenType.TIMESTAMPTZ: 145>, <TokenType.TIMESTAMPLTZ: 146>, <TokenType.TIMESTAMPNTZ: 147>, <TokenType.TIMESTAMP_S: 148>, <TokenType.TIMESTAMP_MS: 149>, <TokenType.TIMESTAMP_NS: 150>, <TokenType.DATETIME: 151>, <TokenType.DATETIME2: 152>, <TokenType.DATETIME64: 153>, <TokenType.SMALLDATETIME: 154>, <TokenType.DATE: 155>, <TokenType.DATE32: 156>, <TokenType.INT4RANGE: 157>, <TokenType.INT4MULTIRANGE: 158>, <TokenType.INT8RANGE: 159>, <TokenType.INT8MULTIRANGE: 160>, <TokenType.NUMRANGE: 161>, <TokenType.NUMMULTIRANGE: 162>, <TokenType.TSRANGE: 163>, <TokenType.TSMULTIRANGE: 164>, <TokenType.TSTZRANGE: 165>, <TokenType.TSTZMULTIRANGE: 166>, <TokenType.DATERANGE: 167>, <TokenType.DATEMULTIRANGE: 168>, <TokenType.UUID: 169>, <TokenType.GEOGRAPHY: 170>, <TokenType.GEOGRAPHYPOINT: 171>, <TokenType.NULLABLE: 172>, <TokenType.GEOMETRY: 173>, <TokenType.POINT: 174>, <TokenType.RING: 175>, <TokenType.LINESTRING: 176>, <TokenType.LOCALTIME: 177>, <TokenType.LOCALTIMESTAMP: 178>, <TokenType.MULTILINESTRING: 180>, <TokenType.POLYGON: 181>, <TokenType.MULTIPOLYGON: 182>, <TokenType.HLLSKETCH: 183>, <TokenType.HSTORE: 184>, <TokenType.SUPER: 185>, <TokenType.SERIAL: 186>, <TokenType.SMALLSERIAL: 187>, <TokenType.BIGSERIAL: 188>, <TokenType.XML: 189>, <TokenType.YEAR: 190>, <TokenType.USERDEFINED: 191>, <TokenType.MONEY: 192>, <TokenType.SMALLMONEY: 193>, <TokenType.ROWVERSION: 194>, <TokenType.IMAGE: 195>, <TokenType.VARIANT: 196>, <TokenType.OBJECT: 197>, <TokenType.INET: 198>, <TokenType.IPADDRESS: 199>, <TokenType.IPPREFIX: 200>, <TokenType.IPV4: 201>, <TokenType.IPV6: 202>, <TokenType.ENUM: 203>, <TokenType.ENUM8: 204>, <TokenType.ENUM16: 205>, <TokenType.FIXEDSTRING: 206>, <TokenType.LOWCARDINALITY: 207>, <TokenType.NESTED: 208>, <TokenType.AGGREGATEFUNCTION: 209>, <TokenType.SIMPLEAGGREGATEFUNCTION: 210>, <TokenType.TDIGEST: 211>, <TokenType.UNKNOWN: 212>, <TokenType.VECTOR: 213>, <TokenType.DYNAMIC: 214>, <TokenType.VOID: 215>, <TokenType.ALL: 218>, <TokenType.ANY: 220>, <TokenType.APPLY: 221>, <TokenType.ARRAY: 222>, <TokenType.ASC: 223>, <TokenType.ATTACH: 225>, <TokenType.AUTO_INCREMENT: 226>, <TokenType.CACHE: 230>, <TokenType.CASE: 231>, <TokenType.COLLATE: 234>, <TokenType.COMMAND: 235>, <TokenType.COMMENT: 236>, <TokenType.COMMIT: 237>, <TokenType.CONSTRAINT: 239>, <TokenType.COPY: 240>, <TokenType.CUBE: 243>, <TokenType.CURRENT_DATE: 244>, <TokenType.CURRENT_DATETIME: 245>, <TokenType.CURRENT_SCHEMA: 246>, <TokenType.CURRENT_TIME: 247>, <TokenType.CURRENT_TIMESTAMP: 248>, <TokenType.CURRENT_USER: 249>, <TokenType.CURRENT_ROLE: 250>, <TokenType.CURRENT_CATALOG: 251>, <TokenType.DEFAULT: 253>, <TokenType.DELETE: 254>, <TokenType.DESC: 255>, <TokenType.DESCRIBE: 256>, <TokenType.DETACH: 257>, <TokenType.DICTIONARY: 258>, <TokenType.DIV: 261>, <TokenType.END: 264>, <TokenType.ESCAPE: 265>, <TokenType.EXECUTE: 267>, <TokenType.EXISTS: 268>, <TokenType.FALSE: 269>, <TokenType.FILE: 271>, <TokenType.FILE_FORMAT: 272>, <TokenType.FILTER: 273>, <TokenType.FINAL: 274>, <TokenType.FIRST: 275>, <TokenType.FOREIGN_KEY: 278>, <TokenType.FORMAT: 279>, <TokenType.FUNCTION: 282>, <TokenType.GET: 283>, <TokenType.INDEX: 294>, <TokenType.INTERVAL: 301>, <TokenType.ISNULL: 306>, <TokenType.KEEP: 309>, <TokenType.KILL: 311>, <TokenType.LIMIT: 316>, <TokenType.LIST: 317>, <TokenType.LOAD: 318>, <TokenType.MAP: 320>, <TokenType.MATCH: 321>, <TokenType.MERGE: 325>, <TokenType.MODEL: 327>, <TokenType.NEXT: 329>, <TokenType.NOTHING: 330>, <TokenType.NULL: 332>, <TokenType.OBJECT_IDENTIFIER: 333>, <TokenType.OFFSET: 334>, <TokenType.OPERATOR: 337>, <TokenType.ORDINALITY: 341>, <TokenType.INOUT: 343>, <TokenType.OVER: 345>, <TokenType.OVERLAPS: 346>, <TokenType.OVERWRITE: 347>, <TokenType.PARTITION: 349>, <TokenType.PERCENT: 351>, <TokenType.PIVOT: 352>, <TokenType.PRAGMA: 357>, <TokenType.PROCEDURE: 360>, <TokenType.PSEUDO_TYPE: 362>, <TokenType.PUT: 363>, <TokenType.RANGE: 367>, <TokenType.RECURSIVE: 368>, <TokenType.REFRESH: 369>, <TokenType.RENAME: 370>, <TokenType.REPLACE: 371>, <TokenType.REFERENCES: 374>, <TokenType.ROLLUP: 379>, <TokenType.ROW: 380>, <TokenType.ROWS: 381>, <TokenType.SEQUENCE: 386>, <TokenType.SET: 388>, <TokenType.SETTINGS: 389>, <TokenType.SHOW: 390>, <TokenType.SOME: 392>, <TokenType.STORAGE_INTEGRATION: 397>, <TokenType.STRAIGHT_JOIN: 398>, <TokenType.STRUCT: 399>, <TokenType.TAG: 402>, <TokenType.TEMPORARY: 403>, <TokenType.TOP: 404>, <TokenType.TRUE: 406>, <TokenType.TRUNCATE: 407>, <TokenType.TRIGGER: 408>, <TokenType.UNNEST: 411>, <TokenType.UNPIVOT: 412>, <TokenType.UPDATE: 413>, <TokenType.USE: 414>, <TokenType.VIEW: 418>, <TokenType.SEMANTIC_VIEW: 419>, <TokenType.VOLATILE: 420>, <TokenType.UNIQUE: 426>, <TokenType.SINK: 433>, <TokenType.SOURCE: 434>, <TokenType.ANALYZE: 435>, <TokenType.NAMESPACE: 436>, <TokenType.EXPORT: 437>}
UPDATE_ALIAS_TOKENS =
{<TokenType.SESSION: 57>, <TokenType.SESSION_USER: 59>, <TokenType.IDENTIFIER: 77>, <TokenType.DATABASE: 78>, <TokenType.COLUMN: 79>, <TokenType.SCHEMA: 81>, <TokenType.TABLE: 82>, <TokenType.WAREHOUSE: 83>, <TokenType.STAGE: 84>, <TokenType.STREAM: 85>, <TokenType.STREAMLIT: 86>, <TokenType.VAR: 87>, <TokenType.BIT: 95>, <TokenType.BOOLEAN: 96>, <TokenType.TINYINT: 97>, <TokenType.UTINYINT: 98>, <TokenType.SMALLINT: 99>, <TokenType.USMALLINT: 100>, <TokenType.MEDIUMINT: 101>, <TokenType.UMEDIUMINT: 102>, <TokenType.INT: 103>, <TokenType.UINT: 104>, <TokenType.BIGINT: 105>, <TokenType.UBIGINT: 106>, <TokenType.BIGNUM: 107>, <TokenType.INT128: 108>, <TokenType.UINT128: 109>, <TokenType.INT256: 110>, <TokenType.UINT256: 111>, <TokenType.FLOAT: 112>, <TokenType.DOUBLE: 113>, <TokenType.UDOUBLE: 114>, <TokenType.DECIMAL: 115>, <TokenType.DECIMAL32: 116>, <TokenType.DECIMAL64: 117>, <TokenType.DECIMAL128: 118>, <TokenType.DECIMAL256: 119>, <TokenType.DECFLOAT: 120>, <TokenType.UDECIMAL: 121>, <TokenType.BIGDECIMAL: 122>, <TokenType.CHAR: 123>, <TokenType.NCHAR: 124>, <TokenType.VARCHAR: 125>, <TokenType.NVARCHAR: 126>, <TokenType.BPCHAR: 127>, <TokenType.TEXT: 128>, <TokenType.MEDIUMTEXT: 129>, <TokenType.LONGTEXT: 130>, <TokenType.BLOB: 131>, <TokenType.MEDIUMBLOB: 132>, <TokenType.LONGBLOB: 133>, <TokenType.TINYBLOB: 134>, <TokenType.TINYTEXT: 135>, <TokenType.NAME: 136>, <TokenType.BINARY: 137>, <TokenType.VARBINARY: 138>, <TokenType.JSON: 139>, <TokenType.JSONB: 140>, <TokenType.TIME: 141>, <TokenType.TIMETZ: 142>, <TokenType.TIME_NS: 143>, <TokenType.TIMESTAMP: 144>, <TokenType.TIMESTAMPTZ: 145>, <TokenType.TIMESTAMPLTZ: 146>, <TokenType.TIMESTAMPNTZ: 147>, <TokenType.TIMESTAMP_S: 148>, <TokenType.TIMESTAMP_MS: 149>, <TokenType.TIMESTAMP_NS: 150>, <TokenType.DATETIME: 151>, <TokenType.DATETIME2: 152>, <TokenType.DATETIME64: 153>, <TokenType.SMALLDATETIME: 154>, <TokenType.DATE: 155>, <TokenType.DATE32: 156>, <TokenType.INT4RANGE: 157>, <TokenType.INT4MULTIRANGE: 158>, <TokenType.INT8RANGE: 159>, <TokenType.INT8MULTIRANGE: 160>, <TokenType.NUMRANGE: 161>, <TokenType.NUMMULTIRANGE: 162>, <TokenType.TSRANGE: 163>, <TokenType.TSMULTIRANGE: 164>, <TokenType.TSTZRANGE: 165>, <TokenType.TSTZMULTIRANGE: 166>, <TokenType.DATERANGE: 167>, <TokenType.DATEMULTIRANGE: 168>, <TokenType.UUID: 169>, <TokenType.GEOGRAPHY: 170>, <TokenType.GEOGRAPHYPOINT: 171>, <TokenType.NULLABLE: 172>, <TokenType.GEOMETRY: 173>, <TokenType.POINT: 174>, <TokenType.RING: 175>, <TokenType.LINESTRING: 176>, <TokenType.LOCALTIME: 177>, <TokenType.LOCALTIMESTAMP: 178>, <TokenType.MULTILINESTRING: 180>, <TokenType.POLYGON: 181>, <TokenType.MULTIPOLYGON: 182>, <TokenType.HLLSKETCH: 183>, <TokenType.HSTORE: 184>, <TokenType.SUPER: 185>, <TokenType.SERIAL: 186>, <TokenType.SMALLSERIAL: 187>, <TokenType.BIGSERIAL: 188>, <TokenType.XML: 189>, <TokenType.YEAR: 190>, <TokenType.USERDEFINED: 191>, <TokenType.MONEY: 192>, <TokenType.SMALLMONEY: 193>, <TokenType.ROWVERSION: 194>, <TokenType.IMAGE: 195>, <TokenType.VARIANT: 196>, <TokenType.OBJECT: 197>, <TokenType.INET: 198>, <TokenType.IPADDRESS: 199>, <TokenType.IPPREFIX: 200>, <TokenType.IPV4: 201>, <TokenType.IPV6: 202>, <TokenType.ENUM: 203>, <TokenType.ENUM8: 204>, <TokenType.ENUM16: 205>, <TokenType.FIXEDSTRING: 206>, <TokenType.LOWCARDINALITY: 207>, <TokenType.NESTED: 208>, <TokenType.AGGREGATEFUNCTION: 209>, <TokenType.SIMPLEAGGREGATEFUNCTION: 210>, <TokenType.TDIGEST: 211>, <TokenType.UNKNOWN: 212>, <TokenType.VECTOR: 213>, <TokenType.DYNAMIC: 214>, <TokenType.VOID: 215>, <TokenType.ALL: 218>, <TokenType.ANY: 220>, <TokenType.APPLY: 221>, <TokenType.ARRAY: 222>, <TokenType.ASC: 223>, <TokenType.ATTACH: 225>, <TokenType.AUTO_INCREMENT: 226>, <TokenType.CACHE: 230>, <TokenType.CASE: 231>, <TokenType.COLLATE: 234>, <TokenType.COMMAND: 235>, <TokenType.COMMENT: 236>, <TokenType.COMMIT: 237>, <TokenType.CONSTRAINT: 239>, <TokenType.COPY: 240>, <TokenType.CUBE: 243>, <TokenType.CURRENT_DATE: 244>, <TokenType.CURRENT_DATETIME: 245>, <TokenType.CURRENT_SCHEMA: 246>, <TokenType.CURRENT_TIME: 247>, <TokenType.CURRENT_TIMESTAMP: 248>, <TokenType.CURRENT_USER: 249>, <TokenType.CURRENT_ROLE: 250>, <TokenType.CURRENT_CATALOG: 251>, <TokenType.DEFAULT: 253>, <TokenType.DELETE: 254>, <TokenType.DESC: 255>, <TokenType.DESCRIBE: 256>, <TokenType.DETACH: 257>, <TokenType.DICTIONARY: 258>, <TokenType.DIV: 261>, <TokenType.END: 264>, <TokenType.ESCAPE: 265>, <TokenType.EXECUTE: 267>, <TokenType.EXISTS: 268>, <TokenType.FALSE: 269>, <TokenType.FILE: 271>, <TokenType.FILE_FORMAT: 272>, <TokenType.FILTER: 273>, <TokenType.FINAL: 274>, <TokenType.FIRST: 275>, <TokenType.FOREIGN_KEY: 278>, <TokenType.FORMAT: 279>, <TokenType.FUNCTION: 282>, <TokenType.GET: 283>, <TokenType.INDEX: 294>, <TokenType.INTERVAL: 301>, <TokenType.IS: 305>, <TokenType.ISNULL: 306>, <TokenType.KEEP: 309>, <TokenType.KILL: 311>, <TokenType.LIMIT: 316>, <TokenType.LIST: 317>, <TokenType.LOAD: 318>, <TokenType.MAP: 320>, <TokenType.MATCH: 321>, <TokenType.MERGE: 325>, <TokenType.MODEL: 327>, <TokenType.NEXT: 329>, <TokenType.NOTHING: 330>, <TokenType.NULL: 332>, <TokenType.OBJECT_IDENTIFIER: 333>, <TokenType.OFFSET: 334>, <TokenType.OPERATOR: 337>, <TokenType.ORDINALITY: 341>, <TokenType.INOUT: 343>, <TokenType.OVER: 345>, <TokenType.OVERLAPS: 346>, <TokenType.OVERWRITE: 347>, <TokenType.PARTITION: 349>, <TokenType.PERCENT: 351>, <TokenType.PIVOT: 352>, <TokenType.PRAGMA: 357>, <TokenType.PROCEDURE: 360>, <TokenType.PSEUDO_TYPE: 362>, <TokenType.PUT: 363>, <TokenType.RANGE: 367>, <TokenType.RECURSIVE: 368>, <TokenType.REFRESH: 369>, <TokenType.RENAME: 370>, <TokenType.REPLACE: 371>, <TokenType.REFERENCES: 374>, <TokenType.ROLLUP: 379>, <TokenType.ROW: 380>, <TokenType.ROWS: 381>, <TokenType.SEQUENCE: 386>, <TokenType.SETTINGS: 389>, <TokenType.SHOW: 390>, <TokenType.SOME: 392>, <TokenType.STORAGE_INTEGRATION: 397>, <TokenType.STRAIGHT_JOIN: 398>, <TokenType.STRUCT: 399>, <TokenType.TAG: 402>, <TokenType.TEMPORARY: 403>, <TokenType.TOP: 404>, <TokenType.TRUE: 406>, <TokenType.TRUNCATE: 407>, <TokenType.TRIGGER: 408>, <TokenType.UNNEST: 411>, <TokenType.UNPIVOT: 412>, <TokenType.UPDATE: 413>, <TokenType.USE: 414>, <TokenType.VIEW: 418>, <TokenType.SEMANTIC_VIEW: 419>, <TokenType.VOLATILE: 420>, <TokenType.UNIQUE: 426>, <TokenType.SINK: 433>, <TokenType.SOURCE: 434>, <TokenType.ANALYZE: 435>, <TokenType.NAMESPACE: 436>, <TokenType.EXPORT: 437>}
FUNCTIONS =
{'AI_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.AIAgg'>>, 'AI_CLASSIFY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIClassify'>>, 'AI_EMBED': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIEmbed'>>, 'A_I_FORECAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIForecast'>>, 'AI_GENERATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AIGenerate'>>, 'AI_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.AISimilarity'>>, 'AI_SUMMARIZE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.AISummarizeAgg'>>, 'ABS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Abs'>>, 'ACOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Acos'>>, 'ACOSH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Acosh'>>, 'ADD_MONTHS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.AddMonths'>>, 'AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.And'>>, 'ANONYMOUS_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.AnonymousAggFunc'>>, 'ANY_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.AnyValue'>>, 'APPLY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Apply'>>, 'APPROX_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.ApproxDistinct'>>, 'APPROX_COUNT_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.ApproxDistinct'>>, 'APPROX_PERCENTILE_ACCUMULATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxPercentileAccumulate'>>, 'APPROX_PERCENTILE_COMBINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxPercentileCombine'>>, 'APPROX_PERCENTILE_ESTIMATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxPercentileEstimate'>>, 'APPROX_QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxQuantile'>>, 'APPROX_QUANTILES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxQuantiles'>>, 'APPROX_TOP_K': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopK'>>, 'APPROX_TOP_K_ACCUMULATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopKAccumulate'>>, 'APPROX_TOP_K_COMBINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopKCombine'>>, 'APPROX_TOP_K_ESTIMATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopKEstimate'>>, 'APPROX_TOP_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproxTopSum'>>, 'APPROXIMATE_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproximateSimilarity'>>, 'APPROXIMATE_JACCARD_INDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ApproximateSimilarity'>>, 'ARG_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMax'>>, 'ARGMAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMax'>>, 'MAX_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMax'>>, 'ARG_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMin'>>, 'ARGMIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMin'>>, 'MIN_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArgMin'>>, 'ARRAY': <function Parser.<lambda>>, 'ARRAY_AGG': <function Parser.<lambda>>, 'ARRAY_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayAll'>>, 'ARRAY_ANY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayAny'>>, 'ARRAY_APPEND': <function build_array_append>, 'ARRAY_COMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayCompact'>>, 'ARRAY_CONCAT': <function build_array_concat>, 'ARRAY_CAT': <function build_array_concat>, 'ARRAY_CONCAT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArrayConcatAgg'>>, 'ARRAY_CONSTRUCT_COMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayConstructCompact'>>, 'ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContains'>>, 'ARRAY_HAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContains'>>, 'ARRAY_CONTAINS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContainsAll'>>, 'ARRAY_HAS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayContainsAll'>>, 'ARRAY_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayDistinct'>>, 'ARRAY_EXCEPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayExcept'>>, 'FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayFilter'>>, 'ARRAY_FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayFilter'>>, 'ARRAY_FIRST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayFirst'>>, 'ARRAY_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayInsert'>>, 'ARRAY_INTERSECT': <function Parser.<lambda>>, 'ARRAY_INTERSECTION': <function Parser.<lambda>>, 'ARRAY_LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayLast'>>, 'ARRAY_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayMax'>>, 'ARRAY_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayMin'>>, 'ARRAY_OVERLAPS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayOverlaps'>>, 'ARRAY_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayPosition'>>, 'ARRAY_PREPEND': <function build_array_prepend>, 'ARRAY_REMOVE': <function build_array_remove>, 'ARRAY_REMOVE_AT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayRemoveAt'>>, 'ARRAY_REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayReverse'>>, 'ARRAY_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySize'>>, 'ARRAY_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySize'>>, 'ARRAY_SLICE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySlice'>>, 'ARRAY_SORT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySort'>>, 'ARRAY_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraySum'>>, 'ARRAY_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayToString'>>, 'ARRAY_JOIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArrayToString'>>, 'ARRAY_UNION_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArrayUnionAgg'>>, 'ARRAY_UNIQUE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ArrayUniqueAgg'>>, 'ARRAYS_ZIP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ArraysZip'>>, 'ASCII': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Ascii'>>, 'ASIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Asin'>>, 'ASINH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Asinh'>>, 'ATAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Atan'>>, 'ATAN2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Atan2'>>, 'ATANH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Atanh'>>, 'AVG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Avg'>>, 'BASE64_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Base64DecodeBinary'>>, 'BASE64_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Base64DecodeString'>>, 'BASE64_ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Base64Encode'>>, 'BIT_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.BitLength'>>, 'BITMAP_BIT_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapBitPosition'>>, 'BITMAP_BUCKET_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapBucketNumber'>>, 'BITMAP_CONSTRUCT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapConstructAgg'>>, 'BITMAP_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapCount'>>, 'BITMAP_OR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitmapOrAgg'>>, 'BITWISE_AND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseAndAgg'>>, 'BITWISE_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseCount'>>, 'BITWISE_OR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseOrAgg'>>, 'BITWISE_XOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BitwiseXorAgg'>>, 'BOOLAND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Booland'>>, 'BOOLNOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Boolnot'>>, 'BOOLOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Boolor'>>, 'BOOLXOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.BoolxorAgg'>>, 'BYTE_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ByteLength'>>, 'CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Case'>>, 'CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Cast'>>, 'CAST_TO_STR_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CastToStrType'>>, 'CBRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cbrt'>>, 'CEIL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Ceil'>>, 'CEILING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Ceil'>>, 'CHECK_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.CheckJson'>>, 'CHECK_XML': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CheckXml'>>, 'CHR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Chr'>>, 'CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Chr'>>, 'CITY_HASH64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.CityHash64'>>, 'COALESCE': <function build_coalesce>, 'IFNULL': <function build_coalesce>, 'NVL': <function build_coalesce>, 'CODE_POINTS_TO_BYTES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.CodePointsToBytes'>>, 'CODE_POINTS_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.CodePointsToString'>>, 'COLLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Collate'>>, 'COLLATION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Collation'>>, 'COLUMNS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Columns'>>, 'COMBINED_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.CombinedAggFunc'>>, 'COMBINED_PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.CombinedParameterizedAgg'>>, 'COMPRESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Compress'>>, 'CONCAT': <function Parser.<lambda>>, 'CONCAT_WS': <function Parser.<lambda>>, 'CONNECT_BY_ROOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ConnectByRoot'>>, 'CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Contains'>>, 'CONVERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Convert'>>, 'CONVERT_TIMEZONE': <function build_convert_timezone>, 'CONVERT_TO_CHARSET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ConvertToCharset'>>, 'CORR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Corr'>>, 'COS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cos'>>, 'COSH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cosh'>>, 'COSINE_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.CosineDistance'>>, 'COT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Cot'>>, 'COTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Coth'>>, 'COUNT': <function TSQLParser.<lambda>>, 'COUNT_IF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CountIf'>>, 'COUNTIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CountIf'>>, 'COVAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CovarPop'>>, 'COVAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CovarSamp'>>, 'CSC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Csc'>>, 'CSCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Csch'>>, 'CUME_DIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.CumeDist'>>, 'CURRENT_ACCOUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentAccount'>>, 'CURRENT_ACCOUNT_NAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentAccountName'>>, 'CURRENT_AVAILABLE_ROLES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentAvailableRoles'>>, 'CURRENT_CATALOG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentCatalog'>>, 'CURRENT_CLIENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentClient'>>, 'CURRENT_DATABASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentDatabase'>>, 'CURRENT_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentDate'>>, 'CURRENT_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentDatetime'>>, 'CURRENT_IP_ADDRESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentIpAddress'>>, 'CURRENT_ORGANIZATION_NAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentOrganizationName'>>, 'CURRENT_ORGANIZATION_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentOrganizationUser'>>, 'CURRENT_REGION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentRegion'>>, 'CURRENT_ROLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentRole'>>, 'CURRENT_ROLE_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentRoleType'>>, 'CURRENT_SCHEMA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSchema'>>, 'CURRENT_SCHEMAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSchemas'>>, 'CURRENT_SECONDARY_ROLES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSecondaryRoles'>>, 'CURRENT_SESSION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSession'>>, 'CURRENT_STATEMENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentStatement'>>, 'CURRENT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTime'>>, 'CURRENT_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimestamp'>>, 'CURRENT_TIMESTAMP_L_T_Z': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimestampLTZ'>>, 'CURRENT_TIMEZONE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimezone'>>, 'CURRENT_TRANSACTION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentTransaction'>>, 'CURRENT_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentUser'>>, 'CURRENT_VERSION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentVersion'>>, 'CURRENT_WAREHOUSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentWarehouse'>>, 'DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Date'>>, 'DATE_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateAdd'>>, 'DATE_BIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateBin'>>, 'DATEDIFF': <function _build_date_delta.<locals>._builder>, 'DATE_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateDiff'>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateSub'>>, 'DATE_TO_DATE_STR': <function Parser.<lambda>>, 'DATE_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateToDi'>>, 'DATE_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DateTrunc'>>, 'DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Datetime'>>, 'DATETIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DatetimeAdd'>>, 'DATETIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DatetimeDiff'>>, 'DATETIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DatetimeSub'>>, 'DATETIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DatetimeTrunc'>>, 'DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Day'>>, 'DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfMonth'>>, 'DAYOFMONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfMonth'>>, 'DAY_OF_WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeek'>>, 'DAYOFWEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeek'>>, 'DAYOFWEEK_ISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeekIso'>>, 'ISODOW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfWeekIso'>>, 'DAY_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfYear'>>, 'DAYOFYEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DayOfYear'>>, 'DAYNAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Dayname'>>, 'DECODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Decode'>>, 'DECODE_CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.DecodeCase'>>, 'DECOMPRESS_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.DecompressBinary'>>, 'DECOMPRESS_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.DecompressString'>>, 'DECRYPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Decrypt'>>, 'DECRYPT_RAW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.DecryptRaw'>>, 'DEGREES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Degrees'>>, 'DENSE_RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.DenseRank'>>, 'DI_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.DiToDate'>>, 'DOT_PRODUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.DotProduct'>>, 'ELT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Elt'>>, 'ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Encode'>>, 'ENCRYPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Encrypt'>>, 'ENCRYPT_RAW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.EncryptRaw'>>, 'ENDS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.EndsWith'>>, 'ENDSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.EndsWith'>>, 'EQUAL_NULL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.EqualNull'>>, 'EUCLIDEAN_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.EuclideanDistance'>>, 'EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Exists'>>, 'EXP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Exp'>>, 'EXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Explode'>>, 'EXPLODING_GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ExplodingGenerateSeries'>>, 'EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Extract'>>, 'FACTORIAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Factorial'>>, 'FARM_FINGERPRINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FarmFingerprint'>>, 'FARMFINGERPRINT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FarmFingerprint'>>, 'FEATURES_AT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.FeaturesAtTime'>>, 'FIRST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.First'>>, 'FIRST_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.FirstValue'>>, 'FLATTEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Flatten'>>, 'FLOAT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Float64'>>, 'FLOOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Floor'>>, 'FORMAT': <function _build_format>, 'FROM_BASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FromBase'>>, 'FROM_BASE32': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FromBase32'>>, 'FROM_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.FromBase64'>>, 'FROM_ISO8601_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.FromISO8601Timestamp'>>, 'GAP_FILL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.GapFill'>>, 'GENERATE_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateBool'>>, 'GENERATE_DATE_ARRAY': <function Parser.<lambda>>, 'GENERATE_DOUBLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateDouble'>>, 'GENERATE_EMBEDDING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateEmbedding'>>, 'GENERATE_INT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateInt'>>, 'GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.GenerateSeries'>>, 'GENERATE_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateTable'>>, 'GENERATE_TEXT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.GenerateText'>>, 'GENERATE_TIMESTAMP_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.GenerateTimestampArray'>>, 'GENERATOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Generator'>>, 'GET_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.GetExtract'>>, 'GETBIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Getbit'>>, 'GET_BIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Getbit'>>, 'GREATEST': <function Parser.<lambda>>, 'GROUP_CONCAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.GroupConcat'>>, 'GROUPING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Grouping'>>, 'GROUPING_ID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.GroupingId'>>, 'HASH_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.HashAgg'>>, 'HEX': <function build_hex>, 'HEX_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.HexDecodeString'>>, 'HEX_ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.HexEncode'>>, 'HLL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Hll'>>, 'HOST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Host'>>, 'HOUR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Hour'>>, 'IF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.If'>>, 'IIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.If'>>, 'INITCAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Initcap'>>, 'INLINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Inline'>>, 'INT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Int64'>>, 'IS_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.IsArray'>>, 'IS_ASCII': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.IsAscii'>>, 'IS_INF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.IsInf'>>, 'ISINF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.IsInf'>>, 'IS_NAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.IsNan'>>, 'ISNAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.IsNan'>>, 'IS_NULL_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.IsNullValue'>>, 'J_S_O_N_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArray'>>, 'J_S_O_N_ARRAY_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArrayAgg'>>, 'JSON_ARRAY_APPEND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArrayAppend'>>, 'JSON_ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArrayContains'>>, 'JSON_ARRAY_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONArrayInsert'>>, 'JSONB_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBContains'>>, 'J_S_O_N_B_CONTAINS_ALL_TOP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBContainsAllTopKeys'>>, 'J_S_O_N_B_CONTAINS_ANY_TOP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBContainsAnyTopKeys'>>, 'J_S_O_N_B_DELETE_AT_PATH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBDeleteAtPath'>>, 'JSONB_EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBExists'>>, 'JSONB_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBExtract'>>, 'JSONB_EXTRACT_SCALAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBExtractScalar'>>, 'J_S_O_N_B_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBObjectAgg'>>, 'J_S_O_N_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONBool'>>, 'J_S_O_N_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.JSONCast'>>, 'J_S_O_N_EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONExists'>>, 'JSON_EXTRACT': <function build_extract_json_with_path.<locals>._builder>, 'JSON_EXTRACT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONExtractArray'>>, 'JSON_EXTRACT_SCALAR': <function build_extract_json_with_path.<locals>._builder>, 'JSON_FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONFormat'>>, 'JSON_KEYS': <function Parser.<lambda>>, 'J_S_O_N_KEYS_AT_DEPTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONKeysAtDepth'>>, 'J_S_O_N_OBJECT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONObject'>>, 'J_S_O_N_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONObjectAgg'>>, 'JSON_REMOVE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONRemove'>>, 'JSON_SET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONSet'>>, 'JSON_STRIP_NULLS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONStripNulls'>>, 'J_S_O_N_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONTable'>>, 'JSON_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.JSONType'>>, 'J_S_O_N_VALUE_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.query.JSONValueArray'>>, 'JAROWINKLER_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.JarowinklerSimilarity'>>, 'JUSTIFY_DAYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.JustifyDays'>>, 'JUSTIFY_HOURS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.JustifyHours'>>, 'JUSTIFY_INTERVAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.JustifyInterval'>>, 'KURTOSIS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Kurtosis'>>, 'LAG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Lag'>>, 'LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Last'>>, 'LAST_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.LastDay'>>, 'LAST_DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.LastDay'>>, 'LAST_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.LastValue'>>, 'LAX_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.LaxBool'>>, 'LAX_FLOAT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.LaxFloat64'>>, 'LAX_INT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.LaxInt64'>>, 'LAX_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.LaxString'>>, 'LEAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Lead'>>, 'LEAST': <function Parser.<lambda>>, 'LEFT': <function _build_with_arg_as_text.<locals>._parse>, 'LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Length'>>, 'LEN': <function _build_with_arg_as_text.<locals>._parse>, '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.MD5'>>, 'MD5_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5Digest'>>, 'M_D5_NUMBER_LOWER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5NumberLower64'>>, 'M_D5_NUMBER_UPPER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MD5NumberUpper64'>>, 'M_L_FORECAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.MLForecast'>>, 'M_L_TRANSLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.MLTranslate'>>, 'MAKE_INTERVAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.MakeInterval'>>, 'MANHATTAN_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.ManhattanDistance'>>, 'MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Map'>>, 'MAP_CAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapCat'>>, 'MAP_CONTAINS_KEY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapContainsKey'>>, 'MAP_DELETE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapDelete'>>, 'MAP_FROM_ENTRIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapFromEntries'>>, 'MAP_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapInsert'>>, 'MAP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapKeys'>>, 'MAP_PICK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapPick'>>, 'MAP_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.MapSize'>>, 'MATCH_AGAINST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.MatchAgainst'>>, 'MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Max'>>, 'MEDIAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Median'>>, 'MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Min'>>, 'MINHASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Minhash'>>, 'MINHASH_COMBINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.MinhashCombine'>>, 'MINUTE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Minute'>>, 'MODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Mode'>>, 'MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Month'>>, 'MONTHNAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Monthname'>>, 'MONTHS_BETWEEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.MonthsBetween'>>, 'NET_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.NetFunc'>>, 'NEXT_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.NextDay'>>, 'NEXT_VALUE_FOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ddl.NextValueFor'>>, 'NORMAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Normal'>>, 'NORMALIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Normalize'>>, 'NTH_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.NthValue'>>, 'NTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Ntile'>>, 'NULLIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Nullif'>>, 'NUMBER_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.NumberToStr'>>, 'NVL2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Nvl2'>>, 'OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.ObjectAgg'>>, 'OBJECT_ID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ObjectId'>>, 'OBJECT_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ObjectInsert'>>, 'OPEN_J_S_O_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.OpenJSON'>>, 'OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Or'>>, 'OVERLAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Overlay'>>, 'PAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Pad'>>, 'PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.ParameterizedAgg'>>, 'PARSE_BIGNUMERIC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ParseBignumeric'>>, 'PARSE_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.ParseDatetime'>>, 'PARSE_IP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ParseIp'>>, 'PARSE_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ParseJSON'>>, 'JSON_PARSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.ParseJSON'>>, 'PARSE_NUMERIC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ParseNumeric'>>, 'PARSE_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.ParseTime'>>, 'PARSE_URL': <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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpExtract'>>, 'REGEXP_EXTRACT_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpExtractAll'>>, 'REGEXP_FULL_MATCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpFullMatch'>>, 'REGEXP_I_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpILike'>>, 'REGEXP_INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpInstr'>>, 'REGEXP_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.RegexpLike'>>, 'REGEXP_REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpReplace'>>, 'REGEXP_SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.RegexpSplit'>>, 'REGR_AVGX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrAvgx'>>, 'REGR_AVGY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrAvgy'>>, 'REGR_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrCount'>>, 'REGR_INTERCEPT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrIntercept'>>, 'REGR_R2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrR2'>>, 'REGR_SLOPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrSlope'>>, 'REGR_SXX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrSxx'>>, 'REGR_SXY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrSxy'>>, 'REGR_SYY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrSyy'>>, 'REGR_VALX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrValx'>>, 'REGR_VALY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.RegrValy'>>, 'REPEAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Repeat'>>, 'REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Replace'>>, 'REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Reverse'>>, 'RIGHT': <function _build_with_arg_as_text.<locals>._parse>, '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.SHA'>>, 'S_H_A1_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA1Digest'>>, 'SHA2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA2'>>, 'S_H_A2_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SHA2Digest'>>, 'SAFE_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeAdd'>>, 'SAFE_CONVERT_BYTES_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SafeConvertBytesToString'>>, 'SAFE_DIVIDE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeDivide'>>, 'SAFE_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.SafeFunc'>>, 'SAFE_MULTIPLY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeMultiply'>>, 'SAFE_NEGATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeNegate'>>, 'SAFE_SUBTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.SafeSubtract'>>, 'SEARCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Search'>>, 'SEARCH_IP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SearchIp'>>, 'SEC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sec'>>, 'SECH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sech'>>, 'SECOND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Second'>>, 'SEQ1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Seq1'>>, 'SEQ2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Seq2'>>, 'SEQ4': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Seq4'>>, 'SEQ8': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Seq8'>>, 'SESSION_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.SessionUser'>>, 'SIGN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sign'>>, 'SIGNUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sign'>>, 'SIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sin'>>, 'SINH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sinh'>>, 'SKEWNESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Skewness'>>, 'SORT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.SortArray'>>, 'SOUNDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Soundex'>>, 'SOUNDEX_P123': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SoundexP123'>>, 'SPACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Space'>>, 'SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Split'>>, 'SPLIT_PART': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SplitPart'>>, 'SQRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Sqrt'>>, 'ST_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StDistance'>>, 'ST_POINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StPoint'>>, 'ST_MAKEPOINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StPoint'>>, 'STANDARD_HASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StandardHash'>>, 'STAR_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StarMap'>>, 'STARTS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StartsWith'>>, 'STARTSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StartsWith'>>, 'STDDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Stddev'>>, 'STDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Stddev'>>, 'STDDEV_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.StddevPop'>>, 'STDDEV_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.StddevSamp'>>, 'STR_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrPosition'>>, 'STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.StrToDate'>>, 'STR_TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrToMap'>>, 'STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.StrToTime'>>, 'STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.StrToUnix'>>, 'STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.String'>>, 'STRING_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StringToArray'>>, 'SPLIT_BY_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StringToArray'>>, 'STRTOK_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StringToArray'>>, 'STRIP_NULL_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.json.StripNullValue'>>, 'STRTOK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Strtok'>>, 'STRUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Struct'>>, 'STRUCT_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.StructExtract'>>, 'STUFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Stuff'>>, 'INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Stuff'>>, 'SUBSTRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Substring'>>, 'SUBSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Substring'>>, 'SUBSTRING_INDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.SubstringIndex'>>, 'SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Sum'>>, 'SYSTIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Systimestamp'>>, 'TAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Tan'>>, 'TANH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Tanh'>>, 'TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Time'>>, 'TIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeAdd'>>, 'TIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeDiff'>>, 'TIME_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeFromParts'>>, 'TIMEFROMPARTS': <function _build_timefromparts>, 'TIME_SLICE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeSlice'>>, 'TIME_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeStrToDate'>>, 'TIME_STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeStrToTime'>>, 'TIME_STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeStrToUnix'>>, 'TIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeSub'>>, 'TIME_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeToStr'>>, 'TIME_TO_TIME_STR': <function Parser.<lambda>>, 'TIME_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeToUnix'>>, 'TIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimeTrunc'>>, 'TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Timestamp'>>, 'TIMESTAMP_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampAdd'>>, 'TIMESTAMPDIFF': <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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampSub'>>, 'TIMESTAMP_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampTrunc'>>, 'TIMESTAMP_TZ_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampTzFromParts'>>, 'TIMESTAMPTZFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TimestampTzFromParts'>>, 'TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ToArray'>>, 'TO_BASE32': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToBase32'>>, 'TO_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToBase64'>>, 'TO_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToBinary'>>, 'TO_BOOLEAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ToBoolean'>>, 'TO_CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToChar'>>, 'TO_CODE_POINTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToCodePoints'>>, 'TO_DAYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.ToDays'>>, 'TO_DECFLOAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToDecfloat'>>, 'TO_DOUBLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToDouble'>>, 'TO_FILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToFile'>>, 'TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.ToMap'>>, 'TO_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.ToNumber'>>, 'TO_VARIANT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.ToVariant'>>, 'TRANSFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array.Transform'>>, 'TRANSLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Translate'>>, 'TRIM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Trim'>>, 'TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Trunc'>>, 'TRUNCATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Trunc'>>, 'TRY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Try'>>, 'TRY_BASE64_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryBase64DecodeBinary'>>, 'TRY_BASE64_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryBase64DecodeString'>>, 'TRY_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.TryCast'>>, 'TRY_HEX_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryHexDecodeBinary'>>, 'TRY_HEX_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryHexDecodeString'>>, 'TRY_TO_DECFLOAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.TryToDecfloat'>>, 'TS_OR_DI_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDiToDi'>>, 'TS_OR_DS_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsAdd'>>, 'TS_OR_DS_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsDiff'>>, 'TS_OR_DS_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsToDate'>>, 'TS_OR_DS_TO_DATE_STR': <function Parser.<lambda>>, 'TS_OR_DS_TO_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsToDatetime'>>, 'TS_OR_DS_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsToTime'>>, 'TS_OR_DS_TO_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.TsOrDsToTimestamp'>>, 'TYPEOF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Typeof'>>, 'UNHEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Unhex'>>, 'UNICODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Unicode'>>, 'UNIFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Uniform'>>, 'UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixDate'>>, 'UNIX_MICROS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixMicros'>>, 'UNIX_MILLIS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixMillis'>>, 'UNIX_SECONDS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixSeconds'>>, 'UNIX_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixToStr'>>, 'UNIX_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixToTime'>>, 'UNIX_TO_TIME_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UnixToTimeStr'>>, 'UNNEST': <function Parser.<lambda>>, 'UPPER': <function build_upper>, 'UCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Upper'>>, 'UTC_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UtcDate'>>, 'UTC_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UtcTime'>>, 'UTC_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.UtcTimestamp'>>, 'UUID': <function Parser.<lambda>>, 'GEN_RANDOM_UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Uuid'>>, 'GENERATE_UUID': <function Parser.<lambda>>, 'UUID_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Uuid'>>, 'VAR_MAP': <function build_var_map>, 'VARIANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Variance'>>, 'VARIANCE_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Variance'>>, 'VAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.Variance'>>, 'VARIANCE_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.VariancePop'>>, 'VAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.aggregate.VariancePop'>>, 'VECTOR_SEARCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.VectorSearch'>>, 'WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Week'>>, 'WEEK_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.WeekOfYear'>>, 'WEEKOFYEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.WeekOfYear'>>, 'WEEK_START': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.WeekStart'>>, 'WIDTH_BUCKET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.WidthBucket'>>, 'XMLELEMENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.XMLElement'>>, 'XMLGET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.XMLGet'>>, 'X_M_L_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.XMLTable'>>, 'XOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.core.Xor'>>, 'YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.Year'>>, 'YEAR_OF_WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.YearOfWeek'>>, 'YEAROFWEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.YearOfWeek'>>, 'YEAR_OF_WEEK_ISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.YearOfWeekIso'>>, 'YEAROFWEEKISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.YearOfWeekIso'>>, 'ZIPF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Zipf'>>, 'EXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.array._ExplodeOuter'>>, 'ARRAYAGG': <function Parser.<lambda>>, 'GLOB': <function Parser.<lambda>>, 'JSON_EXTRACT_PATH_TEXT': <function build_extract_json_with_path.<locals>._builder>, 'LIKE': <function build_like>, 'LOG2': <function Parser.<lambda>>, 'LOG10': <function Parser.<lambda>>, 'LPAD': <function Parser.<lambda>>, 'LEFTPAD': <function Parser.<lambda>>, 'LTRIM': <function Parser.<lambda>>, 'MOD': <function build_mod>, 'RIGHTPAD': <function Parser.<lambda>>, 'RPAD': <function Parser.<lambda>>, 'RTRIM': <function Parser.<lambda>>, 'SCOPE_RESOLUTION': <function Parser.<lambda>>, 'STRPOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrPosition'>>, 'CHARINDEX': <function TSQLParser.<lambda>>, 'INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.StrPosition'>>, 'LOCATE': <function Parser.<lambda>>, 'TO_HEX': <function build_hex>, 'ATN2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.math.Atan2'>>, 'COUNT_BIG': <function TSQLParser.<lambda>>, 'DATEADD': <function build_date_delta.<locals>._builder>, 'DATEDIFF_BIG': <function _build_date_delta.<locals>._builder>, 'DATENAME': <function _build_formatted_time.<locals>._builder>, 'DATETIMEFROMPARTS': <function _build_datetimefromparts>, 'EOMONTH': <function _build_eomonth>, 'GETDATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimestamp'>>, 'HASHBYTES': <function _build_hashbytes>, 'ISNULL': <function TSQLParser.<lambda>>, 'JSON_QUERY': <function _build_json_query>, 'JSON_VALUE': <function build_extract_json_with_path.<locals>._builder>, 'NEWID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.Uuid'>>, 'PARSENAME': <function _build_parsename>, 'REPLICATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.string.Repeat'>>, 'SCHEMA_NAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentSchema'>>, 'SQUARE': <function TSQLParser.<lambda>>, 'SYSDATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimestamp'>>, 'SUSER_NAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentUser'>>, 'SUSER_SNAME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentUser'>>, 'SYSDATETIMEOFFSET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.temporal.CurrentTimestampLTZ'>>, 'SYSTEM_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.functions.CurrentUser'>>, 'DATETRUNC': <function _build_datetrunc>}
PROCEDURE_OPTIONS =
{'ENCRYPTION': (), 'RECOMPILE': (), 'SCHEMABINDING': (), 'NATIVE_COMPILATION': (), 'EXECUTE': ()}
RETURNS_TABLE_TOKENS =
{<TokenType.SESSION: 57>, <TokenType.SESSION_USER: 59>, <TokenType.IDENTIFIER: 77>, <TokenType.DATABASE: 78>, <TokenType.COLUMN: 79>, <TokenType.SCHEMA: 81>, <TokenType.WAREHOUSE: 83>, <TokenType.STAGE: 84>, <TokenType.STREAM: 85>, <TokenType.STREAMLIT: 86>, <TokenType.VAR: 87>, <TokenType.LOCALTIME: 177>, <TokenType.LOCALTIMESTAMP: 178>, <TokenType.ALL: 218>, <TokenType.ANTI: 219>, <TokenType.ANY: 220>, <TokenType.APPLY: 221>, <TokenType.ASC: 223>, <TokenType.ASOF: 224>, <TokenType.ATTACH: 225>, <TokenType.AUTO_INCREMENT: 226>, <TokenType.BEGIN: 227>, <TokenType.CACHE: 230>, <TokenType.CASE: 231>, <TokenType.COLLATE: 234>, <TokenType.COMMAND: 235>, <TokenType.COMMENT: 236>, <TokenType.COMMIT: 237>, <TokenType.CONSTRAINT: 239>, <TokenType.COPY: 240>, <TokenType.CUBE: 243>, <TokenType.CURRENT_DATE: 244>, <TokenType.CURRENT_DATETIME: 245>, <TokenType.CURRENT_SCHEMA: 246>, <TokenType.CURRENT_TIME: 247>, <TokenType.CURRENT_TIMESTAMP: 248>, <TokenType.CURRENT_USER: 249>, <TokenType.CURRENT_ROLE: 250>, <TokenType.CURRENT_CATALOG: 251>, <TokenType.DEFAULT: 253>, <TokenType.DELETE: 254>, <TokenType.DESC: 255>, <TokenType.DESCRIBE: 256>, <TokenType.DETACH: 257>, <TokenType.DICTIONARY: 258>, <TokenType.DIV: 261>, <TokenType.END: 264>, <TokenType.ESCAPE: 265>, <TokenType.EXECUTE: 267>, <TokenType.EXISTS: 268>, <TokenType.FALSE: 269>, <TokenType.FILE: 271>, <TokenType.FILE_FORMAT: 272>, <TokenType.FILTER: 273>, <TokenType.FINAL: 274>, <TokenType.FIRST: 275>, <TokenType.FOREIGN_KEY: 278>, <TokenType.FORMAT: 279>, <TokenType.FULL: 281>, <TokenType.FUNCTION: 282>, <TokenType.GET: 283>, <TokenType.INDEX: 294>, <TokenType.IS: 305>, <TokenType.ISNULL: 306>, <TokenType.KEEP: 309>, <TokenType.KILL: 311>, <TokenType.LEFT: 314>, <TokenType.LIMIT: 316>, <TokenType.LOAD: 318>, <TokenType.LOCK: 319>, <TokenType.MATCH: 321>, <TokenType.MERGE: 325>, <TokenType.MODEL: 327>, <TokenType.NATURAL: 328>, <TokenType.NEXT: 329>, <TokenType.OFFSET: 334>, <TokenType.OPERATOR: 337>, <TokenType.ORDINALITY: 341>, <TokenType.INOUT: 343>, <TokenType.OVER: 345>, <TokenType.OVERLAPS: 346>, <TokenType.OVERWRITE: 347>, <TokenType.PARTITION: 349>, <TokenType.PERCENT: 351>, <TokenType.PIVOT: 352>, <TokenType.PRAGMA: 357>, <TokenType.PROCEDURE: 360>, <TokenType.PUT: 363>, <TokenType.RECURSIVE: 368>, <TokenType.REFRESH: 369>, <TokenType.RENAME: 370>, <TokenType.REPLACE: 371>, <TokenType.REFERENCES: 374>, <TokenType.RIGHT: 375>, <TokenType.ROLLUP: 379>, <TokenType.ROW: 380>, <TokenType.ROWS: 381>, <TokenType.SEMI: 384>, <TokenType.SEQUENCE: 386>, <TokenType.SET: 388>, <TokenType.SETTINGS: 389>, <TokenType.SHOW: 390>, <TokenType.SOME: 392>, <TokenType.STORAGE_INTEGRATION: 397>, <TokenType.STRAIGHT_JOIN: 398>, <TokenType.TAG: 402>, <TokenType.TEMPORARY: 403>, <TokenType.TOP: 404>, <TokenType.TRUE: 406>, <TokenType.TRUNCATE: 407>, <TokenType.TRIGGER: 408>, <TokenType.UNNEST: 411>, <TokenType.UNPIVOT: 412>, <TokenType.UPDATE: 413>, <TokenType.USE: 414>, <TokenType.VIEW: 418>, <TokenType.SEMANTIC_VIEW: 419>, <TokenType.VOLATILE: 420>, <TokenType.WINDOW: 424>, <TokenType.UNIQUE: 426>, <TokenType.SINK: 433>, <TokenType.SOURCE: 434>, <TokenType.ANALYZE: 435>, <TokenType.NAMESPACE: 436>, <TokenType.EXPORT: 437>}
STATEMENT_PARSERS =
{<TokenType.ALTER: 217>: <function Parser.<lambda>>, <TokenType.ANALYZE: 435>: <function Parser.<lambda>>, <TokenType.BEGIN: 227>: <function Parser.<lambda>>, <TokenType.CACHE: 230>: <function Parser.<lambda>>, <TokenType.COMMENT: 236>: <function Parser.<lambda>>, <TokenType.COMMIT: 237>: <function Parser.<lambda>>, <TokenType.COPY: 240>: <function Parser.<lambda>>, <TokenType.CREATE: 241>: <function Parser.<lambda>>, <TokenType.DELETE: 254>: <function Parser.<lambda>>, <TokenType.DESC: 255>: <function Parser.<lambda>>, <TokenType.DESCRIBE: 256>: <function Parser.<lambda>>, <TokenType.DROP: 262>: <function Parser.<lambda>>, <TokenType.GRANT: 286>: <function Parser.<lambda>>, <TokenType.REVOKE: 373>: <function Parser.<lambda>>, <TokenType.INSERT: 297>: <function Parser.<lambda>>, <TokenType.KILL: 311>: <function Parser.<lambda>>, <TokenType.LOAD: 318>: <function Parser.<lambda>>, <TokenType.MERGE: 325>: <function Parser.<lambda>>, <TokenType.PIVOT: 352>: <function Parser.<lambda>>, <TokenType.PRAGMA: 357>: <function Parser.<lambda>>, <TokenType.REFRESH: 369>: <function Parser.<lambda>>, <TokenType.ROLLBACK: 378>: <function Parser.<lambda>>, <TokenType.SET: 388>: <function Parser.<lambda>>, <TokenType.TRUNCATE: 407>: <function Parser.<lambda>>, <TokenType.UNCACHE: 409>: <function Parser.<lambda>>, <TokenType.UNPIVOT: 412>: <function Parser.<lambda>>, <TokenType.UPDATE: 413>: <function Parser.<lambda>>, <TokenType.USE: 414>: <function Parser.<lambda>>, <TokenType.SEMICOLON: 19>: <function Parser.<lambda>>, <TokenType.DECLARE: 252>: <function TSQLParser.<lambda>>, <TokenType.EXECUTE: 267>: <function TSQLParser.<lambda>>}
RANGE_PARSERS =
{<TokenType.AT_GT: 54>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.BETWEEN: 228>: <function Parser.<lambda>>, <TokenType.GLOB: 284>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ILIKE: 292>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IN: 293>: <function Parser.<lambda>>, <TokenType.IRLIKE: 304>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IS: 305>: <function Parser.<lambda>>, <TokenType.LIKE: 315>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.LT_AT: 53>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.OVERLAPS: 346>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.RLIKE: 376>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.SIMILAR_TO: 391>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.FOR: 276>: <function Parser.<lambda>>, <TokenType.QMARK_AMP: 66>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.QMARK_PIPE: 67>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.HASH_DASH: 68>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ADJACENT: 63>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.OPERATOR: 337>: <function Parser.<lambda>>, <TokenType.AMP_LT: 61>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.AMP_GT: 62>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.DCOLON: 14>: <function TSQLParser.<lambda>>}
NO_PAREN_FUNCTION_PARSERS =
{'ANY': <function Parser.<lambda>>, 'CASE': <function Parser.<lambda>>, 'CONNECT_BY_ROOT': <function Parser.<lambda>>, 'IF': <function Parser.<lambda>>, 'NEXT': <function TSQLParser.<lambda>>}
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>>, 'TRIM': <function Parser.<lambda>>, 'TRY_CAST': <function Parser.<lambda>>, 'TRY_CONVERT': <function Parser.<lambda>>, 'XMLELEMENT': <function Parser.<lambda>>, 'XMLTABLE': <function Parser.<lambda>>, 'JSON_ARRAYAGG': <function TSQLParser.<lambda>>, 'DATEPART': <function TSQLParser.<lambda>>}
COLUMN_OPERATORS =
{<TokenType.DOT: 8>: None, <TokenType.DOTCOLON: 12>: <function Parser.<lambda>>, <TokenType.DCOLON: 14>: <function TSQLParser.<lambda>>, <TokenType.ARROW: 45>: <function Parser.<lambda>>, <TokenType.DARROW: 46>: <function Parser.<lambda>>, <TokenType.HASH_ARROW: 49>: <function Parser.<lambda>>, <TokenType.DHASH_ARROW: 50>: <function Parser.<lambda>>, <TokenType.PLACEHOLDER: 353>: <function Parser.<lambda>>}
ODBC_DATETIME_LITERALS =
{'d': <class 'sqlglot.expressions.temporal.Date'>, 't': <class 'sqlglot.expressions.temporal.Time'>, 'ts': <class 'sqlglot.expressions.temporal.Timestamp'>}
Inherited Members
- sqlglot.parser.Parser
- Parser
- STRUCT_TYPE_TOKENS
- NESTED_TYPE_TOKENS
- ENUM_TYPE_TOKENS
- AGGREGATE_TYPE_TOKENS
- TYPE_TOKENS
- SIGNED_TO_UNSIGNED_TYPE_TOKEN
- SUBQUERY_PREDICATES
- SUBQUERY_TOKENS
- RESERVED_TOKENS
- DB_CREATABLES
- CREATABLES
- TRIGGER_EVENTS
- ALTERABLES
- COLON_PLACEHOLDER_TOKENS
- ARRAY_CONSTRUCTORS
- TRIM_TYPES
- IDENTIFIER_TOKENS
- BRACKETS
- COLUMN_POSTFIX_TOKENS
- TABLE_POSTFIX_TOKENS
- FUNC_TOKENS
- CONJUNCTION
- ASSIGNMENT
- DISJUNCTION
- EQUALITY
- COMPARISON
- BITWISE
- TERM
- FACTOR
- EXPONENT
- TIMES
- TIMESTAMPS
- SET_OPERATIONS
- JOIN_METHODS
- JOIN_SIDES
- JOIN_KINDS
- TABLE_TERMINATORS
- LAMBDAS
- TYPED_LAMBDA_ARGS
- LAMBDA_ARG_TERMINATORS
- CAST_COLUMN_OPERATORS
- EXPRESSION_PARSERS
- UNARY_PARSERS
- STRING_PARSERS
- NUMERIC_PARSERS
- PRIMARY_PARSERS
- PLACEHOLDER_PARSERS
- PIPE_SYNTAX_TRANSFORM_PARSERS
- PROPERTY_PARSERS
- CONSTRAINT_PARSERS
- ALTER_PARSERS
- ALTER_ALTER_PARSERS
- SCHEMA_UNNAMED_CONSTRAINTS
- INVALID_FUNC_NAME_TOKENS
- FUNCTIONS_WITH_ALIASED_ARGS
- KEY_VALUE_DEFINITIONS
- 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
- EXECUTE_AS_OPTIONS
- KEY_CONSTRAINT_OPTIONS
- WINDOW_EXCLUDE_OPTIONS
- INSERT_ALTERNATIVES
- CLONE_KEYWORDS
- HISTORICAL_DATA_PREFIX
- HISTORICAL_DATA_KIND
- OPCLASS_FOLLOW_KEYWORDS
- OPTYPE_FOLLOW_TOKENS
- TABLE_INDEX_HINT_TOKENS
- VIEW_ATTRIBUTES
- WINDOW_ALIAS_TOKENS
- WINDOW_BEFORE_PAREN_TOKENS
- WINDOW_SIDES
- JSON_KEY_VALUE_SEPARATOR_TOKENS
- FETCH_TOKENS
- ADD_CONSTRAINT_TOKENS
- DISTINCT_TOKENS
- UNNEST_OFFSET_ALIAS_TOKENS
- SELECT_START_TOKENS
- COPY_INTO_VARLEN_OPTIONS
- IS_JSON_PREDICATE_KIND
- ON_CONDITION_TOKENS
- PRIVILEGE_FOLLOW_TOKENS
- DESCRIBE_STYLES
- SET_ASSIGNMENT_DELIMITERS
- ANALYZE_STYLES
- ANALYZE_EXPRESSION_PARSERS
- PARTITION_KEYWORDS
- AMBIGUOUS_ALIAS_TOKENS
- OPERATION_MODIFIERS
- RECURSIVE_CTE_SEARCH_KIND
- SECURITY_PROPERTY_KEYWORDS
- MODIFIABLES
- STRICT_CAST
- PREFIXED_PIVOT_COLUMNS
- IDENTIFY_PIVOT_STRINGS
- TABLESAMPLE_CSV
- DEFAULT_SAMPLING_METHOD
- TRIM_PATTERN_FIRST
- MODIFIERS_ATTACHED_TO_SET_OP
- JSON_ARROWS_REQUIRE_JSON_TYPE
- COLON_IS_VARIANT_EXTRACT
- VALUES_FOLLOWED_BY_PAREN
- SUPPORTS_IMPLICIT_UNNEST
- INTERVAL_SPANS
- SUPPORTS_PARTITION_SELECTION
- WRAPPED_TRANSFORM_COLUMN_CONSTRAINT
- OPTIONAL_ALIAS_TOKEN_CTE
- ALTER_RENAME_REQUIRES_COLUMN
- ALTER_TABLE_PARTITIONS
- JOINS_HAVE_EQUAL_PRECEDENCE
- ZONE_AWARE_TIMESTAMP_CONSTRUCTOR
- MAP_KEYS_ARE_ARBITRARY_EXPRESSIONS
- JSON_EXTRACT_REQUIRES_JSON_EXPRESSION
- ADD_JOIN_ON_TRUE
- SUPPORTS_OMITTED_INTERVAL_SPAN_UNIT
- SHOW_TRIE
- SET_TRIE
- error_level
- error_message_context
- max_errors
- max_nodes
- dialect
- sql
- errors
- reset
- raise_error
- validate_expression
- parse
- parse_into
- check_errors
- expression
- parse_set_operation
- build_cast