sqlglot.dialects.mysql
1from __future__ import annotations 2 3import typing as t 4 5from sqlglot import exp, generator, parser, tokens, transforms 6from sqlglot.dialects.dialect import ( 7 Dialect, 8 NormalizationStrategy, 9 arrow_json_extract_sql, 10 date_add_interval_sql, 11 datestrtodate_sql, 12 build_formatted_time, 13 isnull_to_is_null, 14 length_or_char_length_sql, 15 max_or_greatest, 16 min_or_least, 17 no_ilike_sql, 18 no_paren_current_date_sql, 19 no_pivot_sql, 20 no_tablesample_sql, 21 no_trycast_sql, 22 build_date_delta, 23 build_date_delta_with_interval, 24 rename_func, 25 strposition_sql, 26 unit_to_var, 27 trim_sql, 28 timestrtotime_sql, 29) 30from sqlglot.generator import unsupported_args 31from sqlglot.helper import seq_get 32from sqlglot.tokens import TokenType 33 34 35def _show_parser(*args: t.Any, **kwargs: t.Any) -> t.Callable[[MySQL.Parser], exp.Show]: 36 def _parse(self: MySQL.Parser) -> exp.Show: 37 return self._parse_show_mysql(*args, **kwargs) 38 39 return _parse 40 41 42def _date_trunc_sql(self: MySQL.Generator, expression: exp.DateTrunc) -> str: 43 expr = self.sql(expression, "this") 44 unit = expression.text("unit").upper() 45 46 if unit == "WEEK": 47 concat = f"CONCAT(YEAR({expr}), ' ', WEEK({expr}, 1), ' 1')" 48 date_format = "%Y %u %w" 49 elif unit == "MONTH": 50 concat = f"CONCAT(YEAR({expr}), ' ', MONTH({expr}), ' 1')" 51 date_format = "%Y %c %e" 52 elif unit == "QUARTER": 53 concat = f"CONCAT(YEAR({expr}), ' ', QUARTER({expr}) * 3 - 2, ' 1')" 54 date_format = "%Y %c %e" 55 elif unit == "YEAR": 56 concat = f"CONCAT(YEAR({expr}), ' 1 1')" 57 date_format = "%Y %c %e" 58 else: 59 if unit != "DAY": 60 self.unsupported(f"Unexpected interval unit: {unit}") 61 return self.func("DATE", expr) 62 63 return self.func("STR_TO_DATE", concat, f"'{date_format}'") 64 65 66# All specifiers for time parts (as opposed to date parts) 67# https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format 68TIME_SPECIFIERS = {"f", "H", "h", "I", "i", "k", "l", "p", "r", "S", "s", "T"} 69 70 71def _has_time_specifier(date_format: str) -> bool: 72 i = 0 73 length = len(date_format) 74 75 while i < length: 76 if date_format[i] == "%": 77 i += 1 78 if i < length and date_format[i] in TIME_SPECIFIERS: 79 return True 80 i += 1 81 return False 82 83 84def _str_to_date(args: t.List) -> exp.StrToDate | exp.StrToTime: 85 mysql_date_format = seq_get(args, 1) 86 date_format = MySQL.format_time(mysql_date_format) 87 this = seq_get(args, 0) 88 89 if mysql_date_format and _has_time_specifier(mysql_date_format.name): 90 return exp.StrToTime(this=this, format=date_format) 91 92 return exp.StrToDate(this=this, format=date_format) 93 94 95def _str_to_date_sql( 96 self: MySQL.Generator, expression: exp.StrToDate | exp.StrToTime | exp.TsOrDsToDate 97) -> str: 98 return self.func("STR_TO_DATE", expression.this, self.format_time(expression)) 99 100 101def _unix_to_time_sql(self: MySQL.Generator, expression: exp.UnixToTime) -> str: 102 scale = expression.args.get("scale") 103 timestamp = expression.this 104 105 if scale in (None, exp.UnixToTime.SECONDS): 106 return self.func("FROM_UNIXTIME", timestamp, self.format_time(expression)) 107 108 return self.func( 109 "FROM_UNIXTIME", 110 exp.Div(this=timestamp, expression=exp.func("POW", 10, scale)), 111 self.format_time(expression), 112 ) 113 114 115def date_add_sql( 116 kind: str, 117) -> t.Callable[[generator.Generator, exp.Expression], str]: 118 def func(self: generator.Generator, expression: exp.Expression) -> str: 119 return self.func( 120 f"DATE_{kind}", 121 expression.this, 122 exp.Interval(this=expression.expression, unit=unit_to_var(expression)), 123 ) 124 125 return func 126 127 128def _ts_or_ds_to_date_sql(self: MySQL.Generator, expression: exp.TsOrDsToDate) -> str: 129 time_format = expression.args.get("format") 130 return _str_to_date_sql(self, expression) if time_format else self.func("DATE", expression.this) 131 132 133def _remove_ts_or_ds_to_date( 134 to_sql: t.Optional[t.Callable[[MySQL.Generator, exp.Expression], str]] = None, 135 args: t.Tuple[str, ...] = ("this",), 136) -> t.Callable[[MySQL.Generator, exp.Func], str]: 137 def func(self: MySQL.Generator, expression: exp.Func) -> str: 138 for arg_key in args: 139 arg = expression.args.get(arg_key) 140 if isinstance(arg, exp.TsOrDsToDate) and not arg.args.get("format"): 141 expression.set(arg_key, arg.this) 142 143 return to_sql(self, expression) if to_sql else self.function_fallback_sql(expression) 144 145 return func 146 147 148class MySQL(Dialect): 149 PROMOTE_TO_INFERRED_DATETIME_TYPE = True 150 151 # https://dev.mysql.com/doc/refman/8.0/en/identifiers.html 152 IDENTIFIERS_CAN_START_WITH_DIGIT = True 153 154 # We default to treating all identifiers as case-sensitive, since it matches MySQL's 155 # behavior on Linux systems. For MacOS and Windows systems, one can override this 156 # setting by specifying `dialect="mysql, normalization_strategy = lowercase"`. 157 # 158 # See also https://dev.mysql.com/doc/refman/8.2/en/identifier-case-sensitivity.html 159 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_SENSITIVE 160 161 TIME_FORMAT = "'%Y-%m-%d %T'" 162 DPIPE_IS_STRING_CONCAT = False 163 SUPPORTS_USER_DEFINED_TYPES = False 164 SUPPORTS_SEMI_ANTI_JOIN = False 165 SAFE_DIVISION = True 166 167 # https://prestodb.io/docs/current/functions/datetime.html#mysql-date-functions 168 TIME_MAPPING = { 169 "%M": "%B", 170 "%c": "%-m", 171 "%e": "%-d", 172 "%h": "%I", 173 "%i": "%M", 174 "%s": "%S", 175 "%u": "%W", 176 "%k": "%-H", 177 "%l": "%-I", 178 "%T": "%H:%M:%S", 179 "%W": "%A", 180 } 181 182 class Tokenizer(tokens.Tokenizer): 183 QUOTES = ["'", '"'] 184 COMMENTS = ["--", "#", ("/*", "*/")] 185 IDENTIFIERS = ["`"] 186 STRING_ESCAPES = ["'", '"', "\\"] 187 BIT_STRINGS = [("b'", "'"), ("B'", "'"), ("0b", "")] 188 HEX_STRINGS = [("x'", "'"), ("X'", "'"), ("0x", "")] 189 190 NESTED_COMMENTS = False 191 192 KEYWORDS = { 193 **tokens.Tokenizer.KEYWORDS, 194 "BLOB": TokenType.BLOB, 195 "CHARSET": TokenType.CHARACTER_SET, 196 "DISTINCTROW": TokenType.DISTINCT, 197 "EXPLAIN": TokenType.DESCRIBE, 198 "FORCE": TokenType.FORCE, 199 "IGNORE": TokenType.IGNORE, 200 "KEY": TokenType.KEY, 201 "LOCK TABLES": TokenType.COMMAND, 202 "LONGBLOB": TokenType.LONGBLOB, 203 "LONGTEXT": TokenType.LONGTEXT, 204 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 205 "MEDIUMINT": TokenType.MEDIUMINT, 206 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 207 "MEMBER OF": TokenType.MEMBER_OF, 208 "MOD": TokenType.MOD, 209 "SEPARATOR": TokenType.SEPARATOR, 210 "SERIAL": TokenType.SERIAL, 211 "SIGNED": TokenType.BIGINT, 212 "SIGNED INTEGER": TokenType.BIGINT, 213 "SOUNDS LIKE": TokenType.SOUNDS_LIKE, 214 "START": TokenType.BEGIN, 215 "TIMESTAMP": TokenType.TIMESTAMPTZ, 216 "TINYBLOB": TokenType.TINYBLOB, 217 "TINYTEXT": TokenType.TINYTEXT, 218 "UNLOCK TABLES": TokenType.COMMAND, 219 "UNSIGNED": TokenType.UBIGINT, 220 "UNSIGNED INTEGER": TokenType.UBIGINT, 221 "YEAR": TokenType.YEAR, 222 "_ARMSCII8": TokenType.INTRODUCER, 223 "_ASCII": TokenType.INTRODUCER, 224 "_BIG5": TokenType.INTRODUCER, 225 "_BINARY": TokenType.INTRODUCER, 226 "_CP1250": TokenType.INTRODUCER, 227 "_CP1251": TokenType.INTRODUCER, 228 "_CP1256": TokenType.INTRODUCER, 229 "_CP1257": TokenType.INTRODUCER, 230 "_CP850": TokenType.INTRODUCER, 231 "_CP852": TokenType.INTRODUCER, 232 "_CP866": TokenType.INTRODUCER, 233 "_CP932": TokenType.INTRODUCER, 234 "_DEC8": TokenType.INTRODUCER, 235 "_EUCJPMS": TokenType.INTRODUCER, 236 "_EUCKR": TokenType.INTRODUCER, 237 "_GB18030": TokenType.INTRODUCER, 238 "_GB2312": TokenType.INTRODUCER, 239 "_GBK": TokenType.INTRODUCER, 240 "_GEOSTD8": TokenType.INTRODUCER, 241 "_GREEK": TokenType.INTRODUCER, 242 "_HEBREW": TokenType.INTRODUCER, 243 "_HP8": TokenType.INTRODUCER, 244 "_KEYBCS2": TokenType.INTRODUCER, 245 "_KOI8R": TokenType.INTRODUCER, 246 "_KOI8U": TokenType.INTRODUCER, 247 "_LATIN1": TokenType.INTRODUCER, 248 "_LATIN2": TokenType.INTRODUCER, 249 "_LATIN5": TokenType.INTRODUCER, 250 "_LATIN7": TokenType.INTRODUCER, 251 "_MACCE": TokenType.INTRODUCER, 252 "_MACROMAN": TokenType.INTRODUCER, 253 "_SJIS": TokenType.INTRODUCER, 254 "_SWE7": TokenType.INTRODUCER, 255 "_TIS620": TokenType.INTRODUCER, 256 "_UCS2": TokenType.INTRODUCER, 257 "_UJIS": TokenType.INTRODUCER, 258 # https://dev.mysql.com/doc/refman/8.0/en/string-literals.html 259 "_UTF8": TokenType.INTRODUCER, 260 "_UTF16": TokenType.INTRODUCER, 261 "_UTF16LE": TokenType.INTRODUCER, 262 "_UTF32": TokenType.INTRODUCER, 263 "_UTF8MB3": TokenType.INTRODUCER, 264 "_UTF8MB4": TokenType.INTRODUCER, 265 "@@": TokenType.SESSION_PARAMETER, 266 } 267 268 COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.REPLACE} - {TokenType.SHOW} 269 270 class Parser(parser.Parser): 271 FUNC_TOKENS = { 272 *parser.Parser.FUNC_TOKENS, 273 TokenType.DATABASE, 274 TokenType.MOD, 275 TokenType.SCHEMA, 276 TokenType.VALUES, 277 } 278 279 CONJUNCTION = { 280 **parser.Parser.CONJUNCTION, 281 TokenType.DAMP: exp.And, 282 TokenType.XOR: exp.Xor, 283 } 284 285 DISJUNCTION = { 286 **parser.Parser.DISJUNCTION, 287 TokenType.DPIPE: exp.Or, 288 } 289 290 TABLE_ALIAS_TOKENS = ( 291 parser.Parser.TABLE_ALIAS_TOKENS - parser.Parser.TABLE_INDEX_HINT_TOKENS 292 ) 293 294 RANGE_PARSERS = { 295 **parser.Parser.RANGE_PARSERS, 296 TokenType.SOUNDS_LIKE: lambda self, this: self.expression( 297 exp.EQ, 298 this=self.expression(exp.Soundex, this=this), 299 expression=self.expression(exp.Soundex, this=self._parse_term()), 300 ), 301 TokenType.MEMBER_OF: lambda self, this: self.expression( 302 exp.JSONArrayContains, 303 this=this, 304 expression=self._parse_wrapped(self._parse_expression), 305 ), 306 } 307 308 FUNCTIONS = { 309 **parser.Parser.FUNCTIONS, 310 "BIT_AND": exp.BitwiseAndAgg.from_arg_list, 311 "BIT_OR": exp.BitwiseOrAgg.from_arg_list, 312 "BIT_XOR": exp.BitwiseXorAgg.from_arg_list, 313 "BIT_COUNT": exp.BitwiseCountAgg.from_arg_list, 314 "CONVERT_TZ": lambda args: exp.ConvertTimezone( 315 source_tz=seq_get(args, 1), target_tz=seq_get(args, 2), timestamp=seq_get(args, 0) 316 ), 317 "CURDATE": exp.CurrentDate.from_arg_list, 318 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 319 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 320 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 321 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 322 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 323 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 324 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 325 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 326 "FORMAT": exp.NumberToStr.from_arg_list, 327 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 328 "ISNULL": isnull_to_is_null, 329 "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True), 330 "MAKETIME": exp.TimeFromParts.from_arg_list, 331 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 332 "MONTHNAME": lambda args: exp.TimeToStr( 333 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 334 format=exp.Literal.string("%B"), 335 ), 336 "SCHEMA": exp.CurrentSchema.from_arg_list, 337 "DATABASE": exp.CurrentSchema.from_arg_list, 338 "STR_TO_DATE": _str_to_date, 339 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 340 "TO_DAYS": lambda args: exp.paren( 341 exp.DateDiff( 342 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 343 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 344 unit=exp.var("DAY"), 345 ) 346 + 1 347 ), 348 "WEEK": lambda args: exp.Week( 349 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 350 ), 351 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 352 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 353 } 354 355 FUNCTION_PARSERS = { 356 **parser.Parser.FUNCTION_PARSERS, 357 "CHAR": lambda self: self.expression( 358 exp.Chr, 359 expressions=self._parse_csv(self._parse_assignment), 360 charset=self._match(TokenType.USING) and self._parse_var(), 361 ), 362 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 363 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 364 "VALUES": lambda self: self.expression( 365 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 366 ), 367 "JSON_VALUE": lambda self: self._parse_json_value(), 368 "SUBSTR": lambda self: self._parse_substring(), 369 } 370 371 STATEMENT_PARSERS = { 372 **parser.Parser.STATEMENT_PARSERS, 373 TokenType.SHOW: lambda self: self._parse_show(), 374 } 375 376 SHOW_PARSERS = { 377 "BINARY LOGS": _show_parser("BINARY LOGS"), 378 "MASTER LOGS": _show_parser("BINARY LOGS"), 379 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 380 "CHARACTER SET": _show_parser("CHARACTER SET"), 381 "CHARSET": _show_parser("CHARACTER SET"), 382 "COLLATION": _show_parser("COLLATION"), 383 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 384 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 385 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 386 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 387 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 388 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 389 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 390 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 391 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 392 "DATABASES": _show_parser("DATABASES"), 393 "SCHEMAS": _show_parser("DATABASES"), 394 "ENGINE": _show_parser("ENGINE", target=True), 395 "STORAGE ENGINES": _show_parser("ENGINES"), 396 "ENGINES": _show_parser("ENGINES"), 397 "ERRORS": _show_parser("ERRORS"), 398 "EVENTS": _show_parser("EVENTS"), 399 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 400 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 401 "GRANTS": _show_parser("GRANTS", target="FOR"), 402 "INDEX": _show_parser("INDEX", target="FROM"), 403 "MASTER STATUS": _show_parser("MASTER STATUS"), 404 "OPEN TABLES": _show_parser("OPEN TABLES"), 405 "PLUGINS": _show_parser("PLUGINS"), 406 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 407 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 408 "PRIVILEGES": _show_parser("PRIVILEGES"), 409 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 410 "PROCESSLIST": _show_parser("PROCESSLIST"), 411 "PROFILE": _show_parser("PROFILE"), 412 "PROFILES": _show_parser("PROFILES"), 413 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 414 "REPLICAS": _show_parser("REPLICAS"), 415 "SLAVE HOSTS": _show_parser("REPLICAS"), 416 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 417 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 418 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 419 "SESSION STATUS": _show_parser("STATUS"), 420 "STATUS": _show_parser("STATUS"), 421 "TABLE STATUS": _show_parser("TABLE STATUS"), 422 "FULL TABLES": _show_parser("TABLES", full=True), 423 "TABLES": _show_parser("TABLES"), 424 "TRIGGERS": _show_parser("TRIGGERS"), 425 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 426 "SESSION VARIABLES": _show_parser("VARIABLES"), 427 "VARIABLES": _show_parser("VARIABLES"), 428 "WARNINGS": _show_parser("WARNINGS"), 429 } 430 431 PROPERTY_PARSERS = { 432 **parser.Parser.PROPERTY_PARSERS, 433 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 434 } 435 436 SET_PARSERS = { 437 **parser.Parser.SET_PARSERS, 438 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 439 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 440 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 441 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 442 "NAMES": lambda self: self._parse_set_item_names(), 443 } 444 445 CONSTRAINT_PARSERS = { 446 **parser.Parser.CONSTRAINT_PARSERS, 447 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 448 "INDEX": lambda self: self._parse_index_constraint(), 449 "KEY": lambda self: self._parse_index_constraint(), 450 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 451 } 452 453 ALTER_PARSERS = { 454 **parser.Parser.ALTER_PARSERS, 455 "MODIFY": lambda self: self._parse_alter_table_alter(), 456 } 457 458 ALTER_ALTER_PARSERS = { 459 **parser.Parser.ALTER_ALTER_PARSERS, 460 "INDEX": lambda self: self._parse_alter_table_alter_index(), 461 } 462 463 SCHEMA_UNNAMED_CONSTRAINTS = { 464 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 465 "FULLTEXT", 466 "INDEX", 467 "KEY", 468 "SPATIAL", 469 } 470 471 PROFILE_TYPES: parser.OPTIONS_TYPE = { 472 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 473 "BLOCK": ("IO",), 474 "CONTEXT": ("SWITCHES",), 475 "PAGE": ("FAULTS",), 476 } 477 478 TYPE_TOKENS = { 479 *parser.Parser.TYPE_TOKENS, 480 TokenType.SET, 481 } 482 483 ENUM_TYPE_TOKENS = { 484 *parser.Parser.ENUM_TYPE_TOKENS, 485 TokenType.SET, 486 } 487 488 # SELECT [ ALL | DISTINCT | DISTINCTROW ] [ <OPERATION_MODIFIERS> ] 489 OPERATION_MODIFIERS = { 490 "HIGH_PRIORITY", 491 "STRAIGHT_JOIN", 492 "SQL_SMALL_RESULT", 493 "SQL_BIG_RESULT", 494 "SQL_BUFFER_RESULT", 495 "SQL_NO_CACHE", 496 "SQL_CALC_FOUND_ROWS", 497 } 498 499 LOG_DEFAULTS_TO_LN = True 500 STRING_ALIASES = True 501 VALUES_FOLLOWED_BY_PAREN = False 502 SUPPORTS_PARTITION_SELECTION = True 503 504 def _parse_generated_as_identity( 505 self, 506 ) -> ( 507 exp.GeneratedAsIdentityColumnConstraint 508 | exp.ComputedColumnConstraint 509 | exp.GeneratedAsRowColumnConstraint 510 ): 511 this = super()._parse_generated_as_identity() 512 513 if self._match_texts(("STORED", "VIRTUAL")): 514 persisted = self._prev.text.upper() == "STORED" 515 516 if isinstance(this, exp.ComputedColumnConstraint): 517 this.set("persisted", persisted) 518 elif isinstance(this, exp.GeneratedAsIdentityColumnConstraint): 519 this = self.expression( 520 exp.ComputedColumnConstraint, this=this.expression, persisted=persisted 521 ) 522 523 return this 524 525 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 526 this = self._parse_id_var() 527 if not self._match(TokenType.L_PAREN): 528 return this 529 530 expression = self._parse_number() 531 self._match_r_paren() 532 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 533 534 def _parse_index_constraint( 535 self, kind: t.Optional[str] = None 536 ) -> exp.IndexColumnConstraint: 537 if kind: 538 self._match_texts(("INDEX", "KEY")) 539 540 this = self._parse_id_var(any_token=False) 541 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 542 expressions = self._parse_wrapped_csv(self._parse_ordered) 543 544 options = [] 545 while True: 546 if self._match_text_seq("KEY_BLOCK_SIZE"): 547 self._match(TokenType.EQ) 548 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 549 elif self._match(TokenType.USING): 550 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 551 elif self._match_text_seq("WITH", "PARSER"): 552 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 553 elif self._match(TokenType.COMMENT): 554 opt = exp.IndexConstraintOption(comment=self._parse_string()) 555 elif self._match_text_seq("VISIBLE"): 556 opt = exp.IndexConstraintOption(visible=True) 557 elif self._match_text_seq("INVISIBLE"): 558 opt = exp.IndexConstraintOption(visible=False) 559 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 560 self._match(TokenType.EQ) 561 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 562 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 563 self._match(TokenType.EQ) 564 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 565 else: 566 opt = None 567 568 if not opt: 569 break 570 571 options.append(opt) 572 573 return self.expression( 574 exp.IndexColumnConstraint, 575 this=this, 576 expressions=expressions, 577 kind=kind, 578 index_type=index_type, 579 options=options, 580 ) 581 582 def _parse_show_mysql( 583 self, 584 this: str, 585 target: bool | str = False, 586 full: t.Optional[bool] = None, 587 global_: t.Optional[bool] = None, 588 ) -> exp.Show: 589 json = self._match_text_seq("JSON") 590 591 if target: 592 if isinstance(target, str): 593 self._match_text_seq(*target.split(" ")) 594 target_id = self._parse_id_var() 595 else: 596 target_id = None 597 598 log = self._parse_string() if self._match_text_seq("IN") else None 599 600 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 601 position = self._parse_number() if self._match_text_seq("FROM") else None 602 db = None 603 else: 604 position = None 605 db = None 606 607 if self._match(TokenType.FROM): 608 db = self._parse_id_var() 609 elif self._match(TokenType.DOT): 610 db = target_id 611 target_id = self._parse_id_var() 612 613 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 614 615 like = self._parse_string() if self._match_text_seq("LIKE") else None 616 where = self._parse_where() 617 618 if this == "PROFILE": 619 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 620 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 621 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 622 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 623 else: 624 types, query = None, None 625 offset, limit = self._parse_oldstyle_limit() 626 627 mutex = True if self._match_text_seq("MUTEX") else None 628 mutex = False if self._match_text_seq("STATUS") else mutex 629 630 for_table = self._parse_id_var() if self._match_text_seq("FOR", "TABLE") else None 631 for_group = self._parse_string() if self._match_text_seq("FOR", "GROUP") else None 632 for_user = self._parse_string() if self._match_text_seq("FOR", "USER") else None 633 for_role = self._parse_string() if self._match_text_seq("FOR", "ROLE") else None 634 into_outfile = self._parse_string() if self._match_text_seq("INTO", "OUTFILE") else None 635 636 return self.expression( 637 exp.Show, 638 this=this, 639 target=target_id, 640 full=full, 641 log=log, 642 position=position, 643 db=db, 644 channel=channel, 645 like=like, 646 where=where, 647 types=types, 648 query=query, 649 offset=offset, 650 limit=limit, 651 mutex=mutex, 652 for_table=for_table, 653 for_group=for_group, 654 for_user=for_user, 655 for_role=for_role, 656 into_outfile=into_outfile, 657 json=json, 658 **{"global": global_}, # type: ignore 659 ) 660 661 def _parse_oldstyle_limit( 662 self, 663 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 664 limit = None 665 offset = None 666 if self._match_text_seq("LIMIT"): 667 parts = self._parse_csv(self._parse_number) 668 if len(parts) == 1: 669 limit = parts[0] 670 elif len(parts) == 2: 671 limit = parts[1] 672 offset = parts[0] 673 674 return offset, limit 675 676 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 677 this = self._parse_string() or self._parse_unquoted_field() 678 return self.expression(exp.SetItem, this=this, kind=kind) 679 680 def _parse_set_item_names(self) -> exp.Expression: 681 charset = self._parse_string() or self._parse_unquoted_field() 682 if self._match_text_seq("COLLATE"): 683 collate = self._parse_string() or self._parse_unquoted_field() 684 else: 685 collate = None 686 687 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 688 689 def _parse_type( 690 self, parse_interval: bool = True, fallback_to_identifier: bool = False 691 ) -> t.Optional[exp.Expression]: 692 # mysql binary is special and can work anywhere, even in order by operations 693 # it operates like a no paren func 694 if self._match(TokenType.BINARY, advance=False): 695 data_type = self._parse_types(check_func=True, allow_identifiers=False) 696 697 if isinstance(data_type, exp.DataType): 698 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 699 700 return super()._parse_type( 701 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 702 ) 703 704 def _parse_alter_table_alter_index(self) -> exp.AlterIndex: 705 index = self._parse_field(any_token=True) 706 707 if self._match_text_seq("VISIBLE"): 708 visible = True 709 elif self._match_text_seq("INVISIBLE"): 710 visible = False 711 else: 712 visible = None 713 714 return self.expression(exp.AlterIndex, this=index, visible=visible) 715 716 class Generator(generator.Generator): 717 INTERVAL_ALLOWS_PLURAL_FORM = False 718 LOCKING_READS_SUPPORTED = True 719 NULL_ORDERING_SUPPORTED: t.Optional[bool] = None 720 JOIN_HINTS = False 721 TABLE_HINTS = True 722 DUPLICATE_KEY_UPDATE_WITH_SET = False 723 QUERY_HINT_SEP = " " 724 VALUES_AS_TABLE = False 725 NVL2_SUPPORTED = False 726 LAST_DAY_SUPPORTS_DATE_PART = False 727 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 728 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 729 JSON_KEY_VALUE_PAIR_SEP = "," 730 SUPPORTS_TO_NUMBER = False 731 PARSE_JSON_NAME: t.Optional[str] = None 732 PAD_FILL_PATTERN_IS_REQUIRED = True 733 WRAP_DERIVED_VALUES = False 734 VARCHAR_REQUIRES_SIZE = True 735 SUPPORTS_MEDIAN = False 736 737 TRANSFORMS = { 738 **generator.Generator.TRANSFORMS, 739 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 740 exp.BitwiseAndAgg: rename_func("BIT_AND"), 741 exp.BitwiseOrAgg: rename_func("BIT_OR"), 742 exp.BitwiseXorAgg: rename_func("BIT_XOR"), 743 exp.BitwiseCountAgg: rename_func("BIT_COUNT"), 744 exp.CurrentDate: no_paren_current_date_sql, 745 exp.DateDiff: _remove_ts_or_ds_to_date( 746 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 747 ), 748 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 749 exp.DateStrToDate: datestrtodate_sql, 750 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 751 exp.DateTrunc: _date_trunc_sql, 752 exp.Day: _remove_ts_or_ds_to_date(), 753 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 754 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 755 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 756 exp.GroupConcat: lambda self, 757 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 758 exp.ILike: no_ilike_sql, 759 exp.JSONExtractScalar: arrow_json_extract_sql, 760 exp.Length: length_or_char_length_sql, 761 exp.LogicalOr: rename_func("MAX"), 762 exp.LogicalAnd: rename_func("MIN"), 763 exp.Max: max_or_greatest, 764 exp.Min: min_or_least, 765 exp.Month: _remove_ts_or_ds_to_date(), 766 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 767 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 768 exp.NumberToStr: rename_func("FORMAT"), 769 exp.Pivot: no_pivot_sql, 770 exp.Select: transforms.preprocess( 771 [ 772 transforms.eliminate_distinct_on, 773 transforms.eliminate_semi_and_anti_joins, 774 transforms.eliminate_qualify, 775 transforms.eliminate_full_outer_join, 776 transforms.unnest_generate_date_array_using_recursive_cte, 777 ] 778 ), 779 exp.StrPosition: lambda self, e: strposition_sql( 780 self, e, func_name="LOCATE", supports_position=True 781 ), 782 exp.StrToDate: _str_to_date_sql, 783 exp.StrToTime: _str_to_date_sql, 784 exp.Stuff: rename_func("INSERT"), 785 exp.TableSample: no_tablesample_sql, 786 exp.TimeFromParts: rename_func("MAKETIME"), 787 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 788 exp.TimestampDiff: lambda self, e: self.func( 789 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 790 ), 791 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 792 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 793 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 794 self, 795 e, 796 include_precision=not e.args.get("zone"), 797 ), 798 exp.TimeToStr: _remove_ts_or_ds_to_date( 799 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 800 ), 801 exp.Trim: trim_sql, 802 exp.TryCast: no_trycast_sql, 803 exp.TsOrDsAdd: date_add_sql("ADD"), 804 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 805 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 806 exp.Unicode: lambda self, e: f"ORD(CONVERT({self.sql(e.this)} USING utf32))", 807 exp.UnixToTime: _unix_to_time_sql, 808 exp.Week: _remove_ts_or_ds_to_date(), 809 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 810 exp.Year: _remove_ts_or_ds_to_date(), 811 exp.UtcTimestamp: rename_func("UTC_TIMESTAMP"), 812 exp.UtcTime: rename_func("UTC_TIME"), 813 } 814 815 UNSIGNED_TYPE_MAPPING = { 816 exp.DataType.Type.UBIGINT: "BIGINT", 817 exp.DataType.Type.UINT: "INT", 818 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 819 exp.DataType.Type.USMALLINT: "SMALLINT", 820 exp.DataType.Type.UTINYINT: "TINYINT", 821 exp.DataType.Type.UDECIMAL: "DECIMAL", 822 exp.DataType.Type.UDOUBLE: "DOUBLE", 823 } 824 825 TIMESTAMP_TYPE_MAPPING = { 826 exp.DataType.Type.DATETIME2: "DATETIME", 827 exp.DataType.Type.SMALLDATETIME: "DATETIME", 828 exp.DataType.Type.TIMESTAMP: "DATETIME", 829 exp.DataType.Type.TIMESTAMPNTZ: "DATETIME", 830 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 831 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 832 } 833 834 TYPE_MAPPING = { 835 **generator.Generator.TYPE_MAPPING, 836 **UNSIGNED_TYPE_MAPPING, 837 **TIMESTAMP_TYPE_MAPPING, 838 } 839 840 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 841 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 842 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 843 TYPE_MAPPING.pop(exp.DataType.Type.BLOB) 844 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 845 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 846 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 847 848 PROPERTIES_LOCATION = { 849 **generator.Generator.PROPERTIES_LOCATION, 850 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 851 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 852 } 853 854 LIMIT_FETCH = "LIMIT" 855 856 LIMIT_ONLY_LITERALS = True 857 858 CHAR_CAST_MAPPING = dict.fromkeys( 859 ( 860 exp.DataType.Type.LONGTEXT, 861 exp.DataType.Type.LONGBLOB, 862 exp.DataType.Type.MEDIUMBLOB, 863 exp.DataType.Type.MEDIUMTEXT, 864 exp.DataType.Type.TEXT, 865 exp.DataType.Type.TINYBLOB, 866 exp.DataType.Type.TINYTEXT, 867 exp.DataType.Type.VARCHAR, 868 ), 869 "CHAR", 870 ) 871 SIGNED_CAST_MAPPING = dict.fromkeys( 872 ( 873 exp.DataType.Type.BIGINT, 874 exp.DataType.Type.BOOLEAN, 875 exp.DataType.Type.INT, 876 exp.DataType.Type.SMALLINT, 877 exp.DataType.Type.TINYINT, 878 exp.DataType.Type.MEDIUMINT, 879 ), 880 "SIGNED", 881 ) 882 883 # MySQL doesn't support many datatypes in cast. 884 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 885 CAST_MAPPING = { 886 **CHAR_CAST_MAPPING, 887 **SIGNED_CAST_MAPPING, 888 exp.DataType.Type.UBIGINT: "UNSIGNED", 889 } 890 891 TIMESTAMP_FUNC_TYPES = { 892 exp.DataType.Type.TIMESTAMPTZ, 893 exp.DataType.Type.TIMESTAMPLTZ, 894 } 895 896 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 897 RESERVED_KEYWORDS = { 898 "accessible", 899 "add", 900 "all", 901 "alter", 902 "analyze", 903 "and", 904 "as", 905 "asc", 906 "asensitive", 907 "before", 908 "between", 909 "bigint", 910 "binary", 911 "blob", 912 "both", 913 "by", 914 "call", 915 "cascade", 916 "case", 917 "change", 918 "char", 919 "character", 920 "check", 921 "collate", 922 "column", 923 "condition", 924 "constraint", 925 "continue", 926 "convert", 927 "create", 928 "cross", 929 "cube", 930 "cume_dist", 931 "current_date", 932 "current_time", 933 "current_timestamp", 934 "current_user", 935 "cursor", 936 "database", 937 "databases", 938 "day_hour", 939 "day_microsecond", 940 "day_minute", 941 "day_second", 942 "dec", 943 "decimal", 944 "declare", 945 "default", 946 "delayed", 947 "delete", 948 "dense_rank", 949 "desc", 950 "describe", 951 "deterministic", 952 "distinct", 953 "distinctrow", 954 "div", 955 "double", 956 "drop", 957 "dual", 958 "each", 959 "else", 960 "elseif", 961 "empty", 962 "enclosed", 963 "escaped", 964 "except", 965 "exists", 966 "exit", 967 "explain", 968 "false", 969 "fetch", 970 "first_value", 971 "float", 972 "float4", 973 "float8", 974 "for", 975 "force", 976 "foreign", 977 "from", 978 "fulltext", 979 "function", 980 "generated", 981 "get", 982 "grant", 983 "group", 984 "grouping", 985 "groups", 986 "having", 987 "high_priority", 988 "hour_microsecond", 989 "hour_minute", 990 "hour_second", 991 "if", 992 "ignore", 993 "in", 994 "index", 995 "infile", 996 "inner", 997 "inout", 998 "insensitive", 999 "insert", 1000 "int", 1001 "int1", 1002 "int2", 1003 "int3", 1004 "int4", 1005 "int8", 1006 "integer", 1007 "intersect", 1008 "interval", 1009 "into", 1010 "io_after_gtids", 1011 "io_before_gtids", 1012 "is", 1013 "iterate", 1014 "join", 1015 "json_table", 1016 "key", 1017 "keys", 1018 "kill", 1019 "lag", 1020 "last_value", 1021 "lateral", 1022 "lead", 1023 "leading", 1024 "leave", 1025 "left", 1026 "like", 1027 "limit", 1028 "linear", 1029 "lines", 1030 "load", 1031 "localtime", 1032 "localtimestamp", 1033 "lock", 1034 "long", 1035 "longblob", 1036 "longtext", 1037 "loop", 1038 "low_priority", 1039 "master_bind", 1040 "master_ssl_verify_server_cert", 1041 "match", 1042 "maxvalue", 1043 "mediumblob", 1044 "mediumint", 1045 "mediumtext", 1046 "middleint", 1047 "minute_microsecond", 1048 "minute_second", 1049 "mod", 1050 "modifies", 1051 "natural", 1052 "not", 1053 "no_write_to_binlog", 1054 "nth_value", 1055 "ntile", 1056 "null", 1057 "numeric", 1058 "of", 1059 "on", 1060 "optimize", 1061 "optimizer_costs", 1062 "option", 1063 "optionally", 1064 "or", 1065 "order", 1066 "out", 1067 "outer", 1068 "outfile", 1069 "over", 1070 "partition", 1071 "percent_rank", 1072 "precision", 1073 "primary", 1074 "procedure", 1075 "purge", 1076 "range", 1077 "rank", 1078 "read", 1079 "reads", 1080 "read_write", 1081 "real", 1082 "recursive", 1083 "references", 1084 "regexp", 1085 "release", 1086 "rename", 1087 "repeat", 1088 "replace", 1089 "require", 1090 "resignal", 1091 "restrict", 1092 "return", 1093 "revoke", 1094 "right", 1095 "rlike", 1096 "row", 1097 "rows", 1098 "row_number", 1099 "schema", 1100 "schemas", 1101 "second_microsecond", 1102 "select", 1103 "sensitive", 1104 "separator", 1105 "set", 1106 "show", 1107 "signal", 1108 "smallint", 1109 "spatial", 1110 "specific", 1111 "sql", 1112 "sqlexception", 1113 "sqlstate", 1114 "sqlwarning", 1115 "sql_big_result", 1116 "sql_calc_found_rows", 1117 "sql_small_result", 1118 "ssl", 1119 "starting", 1120 "stored", 1121 "straight_join", 1122 "system", 1123 "table", 1124 "terminated", 1125 "then", 1126 "tinyblob", 1127 "tinyint", 1128 "tinytext", 1129 "to", 1130 "trailing", 1131 "trigger", 1132 "true", 1133 "undo", 1134 "union", 1135 "unique", 1136 "unlock", 1137 "unsigned", 1138 "update", 1139 "usage", 1140 "use", 1141 "using", 1142 "utc_date", 1143 "utc_time", 1144 "utc_timestamp", 1145 "values", 1146 "varbinary", 1147 "varchar", 1148 "varcharacter", 1149 "varying", 1150 "virtual", 1151 "when", 1152 "where", 1153 "while", 1154 "window", 1155 "with", 1156 "write", 1157 "xor", 1158 "year_month", 1159 "zerofill", 1160 } 1161 1162 def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str: 1163 persisted = "STORED" if expression.args.get("persisted") else "VIRTUAL" 1164 return f"GENERATED ALWAYS AS ({self.sql(expression.this.unnest())}) {persisted}" 1165 1166 def array_sql(self, expression: exp.Array) -> str: 1167 self.unsupported("Arrays are not supported by MySQL") 1168 return self.function_fallback_sql(expression) 1169 1170 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1171 self.unsupported("Array operations are not supported by MySQL") 1172 return self.function_fallback_sql(expression) 1173 1174 def dpipe_sql(self, expression: exp.DPipe) -> str: 1175 return self.func("CONCAT", *expression.flatten()) 1176 1177 def extract_sql(self, expression: exp.Extract) -> str: 1178 unit = expression.name 1179 if unit and unit.lower() == "epoch": 1180 return self.func("UNIX_TIMESTAMP", expression.expression) 1181 1182 return super().extract_sql(expression) 1183 1184 def datatype_sql(self, expression: exp.DataType) -> str: 1185 if ( 1186 self.VARCHAR_REQUIRES_SIZE 1187 and expression.is_type(exp.DataType.Type.VARCHAR) 1188 and not expression.expressions 1189 ): 1190 # `VARCHAR` must always have a size - if it doesn't, we always generate `TEXT` 1191 return "TEXT" 1192 1193 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1194 result = super().datatype_sql(expression) 1195 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1196 result = f"{result} UNSIGNED" 1197 1198 return result 1199 1200 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1201 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1202 1203 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1204 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1205 return self.func("TIMESTAMP", expression.this) 1206 1207 to = self.CAST_MAPPING.get(expression.to.this) 1208 1209 if to: 1210 expression.to.set("this", to) 1211 return super().cast_sql(expression) 1212 1213 def show_sql(self, expression: exp.Show) -> str: 1214 this = f" {expression.name}" 1215 full = " FULL" if expression.args.get("full") else "" 1216 global_ = " GLOBAL" if expression.args.get("global") else "" 1217 1218 target = self.sql(expression, "target") 1219 target = f" {target}" if target else "" 1220 if expression.name in ("COLUMNS", "INDEX"): 1221 target = f" FROM{target}" 1222 elif expression.name == "GRANTS": 1223 target = f" FOR{target}" 1224 elif expression.name in ("LINKS", "PARTITIONS"): 1225 target = f" ON{target}" if target else "" 1226 elif expression.name == "PROJECTIONS": 1227 target = f" ON TABLE{target}" if target else "" 1228 1229 db = self._prefixed_sql("FROM", expression, "db") 1230 1231 like = self._prefixed_sql("LIKE", expression, "like") 1232 where = self.sql(expression, "where") 1233 1234 types = self.expressions(expression, key="types") 1235 types = f" {types}" if types else types 1236 query = self._prefixed_sql("FOR QUERY", expression, "query") 1237 1238 if expression.name == "PROFILE": 1239 offset = self._prefixed_sql("OFFSET", expression, "offset") 1240 limit = self._prefixed_sql("LIMIT", expression, "limit") 1241 else: 1242 offset = "" 1243 limit = self._oldstyle_limit_sql(expression) 1244 1245 log = self._prefixed_sql("IN", expression, "log") 1246 position = self._prefixed_sql("FROM", expression, "position") 1247 1248 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1249 1250 if expression.name == "ENGINE": 1251 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1252 else: 1253 mutex_or_status = "" 1254 1255 for_table = self._prefixed_sql("FOR TABLE", expression, "for_table") 1256 for_group = self._prefixed_sql("FOR GROUP", expression, "for_group") 1257 for_user = self._prefixed_sql("FOR USER", expression, "for_user") 1258 for_role = self._prefixed_sql("FOR ROLE", expression, "for_role") 1259 into_outfile = self._prefixed_sql("INTO OUTFILE", expression, "into_outfile") 1260 json = " JSON" if expression.args.get("json") else "" 1261 1262 return f"SHOW{full}{global_}{this}{json}{target}{for_table}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}{for_group}{for_user}{for_role}{into_outfile}" 1263 1264 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1265 dtype = self.sql(expression, "dtype") 1266 if not dtype: 1267 return super().altercolumn_sql(expression) 1268 1269 this = self.sql(expression, "this") 1270 return f"MODIFY COLUMN {this} {dtype}" 1271 1272 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1273 sql = self.sql(expression, arg) 1274 return f" {prefix} {sql}" if sql else "" 1275 1276 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1277 limit = self.sql(expression, "limit") 1278 offset = self.sql(expression, "offset") 1279 if limit: 1280 limit_offset = f"{offset}, {limit}" if offset else limit 1281 return f" LIMIT {limit_offset}" 1282 return "" 1283 1284 def chr_sql(self, expression: exp.Chr) -> str: 1285 this = self.expressions(sqls=[expression.this] + expression.expressions) 1286 charset = expression.args.get("charset") 1287 using = f" USING {self.sql(charset)}" if charset else "" 1288 return f"CHAR({this}{using})" 1289 1290 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1291 unit = expression.args.get("unit") 1292 1293 # Pick an old-enough date to avoid negative timestamp diffs 1294 start_ts = "'0000-01-01 00:00:00'" 1295 1296 # Source: https://stackoverflow.com/a/32955740 1297 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1298 interval = exp.Interval(this=timestamp_diff, unit=unit) 1299 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1300 1301 return self.sql(dateadd) 1302 1303 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1304 from_tz = expression.args.get("source_tz") 1305 to_tz = expression.args.get("target_tz") 1306 dt = expression.args.get("timestamp") 1307 1308 return self.func("CONVERT_TZ", dt, from_tz, to_tz) 1309 1310 def attimezone_sql(self, expression: exp.AtTimeZone) -> str: 1311 self.unsupported("AT TIME ZONE is not supported by MySQL") 1312 return self.sql(expression.this) 1313 1314 def isascii_sql(self, expression: exp.IsAscii) -> str: 1315 return f"REGEXP_LIKE({self.sql(expression.this)}, '^[[:ascii:]]*$')" 1316 1317 @unsupported_args("this") 1318 def currentschema_sql(self, expression: exp.CurrentSchema) -> str: 1319 return self.func("SCHEMA")
TIME_SPECIFIERS =
{'p', 'I', 'S', 'i', 'l', 's', 'h', 'T', 'f', 'r', 'k', 'H'}
def
date_add_sql( kind: str) -> Callable[[sqlglot.generator.Generator, sqlglot.expressions.Expression], str]:
116def date_add_sql( 117 kind: str, 118) -> t.Callable[[generator.Generator, exp.Expression], str]: 119 def func(self: generator.Generator, expression: exp.Expression) -> str: 120 return self.func( 121 f"DATE_{kind}", 122 expression.this, 123 exp.Interval(this=expression.expression, unit=unit_to_var(expression)), 124 ) 125 126 return func
class
MySQL(sqlglot.dialects.dialect.Dialect):
149class MySQL(Dialect): 150 PROMOTE_TO_INFERRED_DATETIME_TYPE = True 151 152 # https://dev.mysql.com/doc/refman/8.0/en/identifiers.html 153 IDENTIFIERS_CAN_START_WITH_DIGIT = True 154 155 # We default to treating all identifiers as case-sensitive, since it matches MySQL's 156 # behavior on Linux systems. For MacOS and Windows systems, one can override this 157 # setting by specifying `dialect="mysql, normalization_strategy = lowercase"`. 158 # 159 # See also https://dev.mysql.com/doc/refman/8.2/en/identifier-case-sensitivity.html 160 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_SENSITIVE 161 162 TIME_FORMAT = "'%Y-%m-%d %T'" 163 DPIPE_IS_STRING_CONCAT = False 164 SUPPORTS_USER_DEFINED_TYPES = False 165 SUPPORTS_SEMI_ANTI_JOIN = False 166 SAFE_DIVISION = True 167 168 # https://prestodb.io/docs/current/functions/datetime.html#mysql-date-functions 169 TIME_MAPPING = { 170 "%M": "%B", 171 "%c": "%-m", 172 "%e": "%-d", 173 "%h": "%I", 174 "%i": "%M", 175 "%s": "%S", 176 "%u": "%W", 177 "%k": "%-H", 178 "%l": "%-I", 179 "%T": "%H:%M:%S", 180 "%W": "%A", 181 } 182 183 class Tokenizer(tokens.Tokenizer): 184 QUOTES = ["'", '"'] 185 COMMENTS = ["--", "#", ("/*", "*/")] 186 IDENTIFIERS = ["`"] 187 STRING_ESCAPES = ["'", '"', "\\"] 188 BIT_STRINGS = [("b'", "'"), ("B'", "'"), ("0b", "")] 189 HEX_STRINGS = [("x'", "'"), ("X'", "'"), ("0x", "")] 190 191 NESTED_COMMENTS = False 192 193 KEYWORDS = { 194 **tokens.Tokenizer.KEYWORDS, 195 "BLOB": TokenType.BLOB, 196 "CHARSET": TokenType.CHARACTER_SET, 197 "DISTINCTROW": TokenType.DISTINCT, 198 "EXPLAIN": TokenType.DESCRIBE, 199 "FORCE": TokenType.FORCE, 200 "IGNORE": TokenType.IGNORE, 201 "KEY": TokenType.KEY, 202 "LOCK TABLES": TokenType.COMMAND, 203 "LONGBLOB": TokenType.LONGBLOB, 204 "LONGTEXT": TokenType.LONGTEXT, 205 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 206 "MEDIUMINT": TokenType.MEDIUMINT, 207 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 208 "MEMBER OF": TokenType.MEMBER_OF, 209 "MOD": TokenType.MOD, 210 "SEPARATOR": TokenType.SEPARATOR, 211 "SERIAL": TokenType.SERIAL, 212 "SIGNED": TokenType.BIGINT, 213 "SIGNED INTEGER": TokenType.BIGINT, 214 "SOUNDS LIKE": TokenType.SOUNDS_LIKE, 215 "START": TokenType.BEGIN, 216 "TIMESTAMP": TokenType.TIMESTAMPTZ, 217 "TINYBLOB": TokenType.TINYBLOB, 218 "TINYTEXT": TokenType.TINYTEXT, 219 "UNLOCK TABLES": TokenType.COMMAND, 220 "UNSIGNED": TokenType.UBIGINT, 221 "UNSIGNED INTEGER": TokenType.UBIGINT, 222 "YEAR": TokenType.YEAR, 223 "_ARMSCII8": TokenType.INTRODUCER, 224 "_ASCII": TokenType.INTRODUCER, 225 "_BIG5": TokenType.INTRODUCER, 226 "_BINARY": TokenType.INTRODUCER, 227 "_CP1250": TokenType.INTRODUCER, 228 "_CP1251": TokenType.INTRODUCER, 229 "_CP1256": TokenType.INTRODUCER, 230 "_CP1257": TokenType.INTRODUCER, 231 "_CP850": TokenType.INTRODUCER, 232 "_CP852": TokenType.INTRODUCER, 233 "_CP866": TokenType.INTRODUCER, 234 "_CP932": TokenType.INTRODUCER, 235 "_DEC8": TokenType.INTRODUCER, 236 "_EUCJPMS": TokenType.INTRODUCER, 237 "_EUCKR": TokenType.INTRODUCER, 238 "_GB18030": TokenType.INTRODUCER, 239 "_GB2312": TokenType.INTRODUCER, 240 "_GBK": TokenType.INTRODUCER, 241 "_GEOSTD8": TokenType.INTRODUCER, 242 "_GREEK": TokenType.INTRODUCER, 243 "_HEBREW": TokenType.INTRODUCER, 244 "_HP8": TokenType.INTRODUCER, 245 "_KEYBCS2": TokenType.INTRODUCER, 246 "_KOI8R": TokenType.INTRODUCER, 247 "_KOI8U": TokenType.INTRODUCER, 248 "_LATIN1": TokenType.INTRODUCER, 249 "_LATIN2": TokenType.INTRODUCER, 250 "_LATIN5": TokenType.INTRODUCER, 251 "_LATIN7": TokenType.INTRODUCER, 252 "_MACCE": TokenType.INTRODUCER, 253 "_MACROMAN": TokenType.INTRODUCER, 254 "_SJIS": TokenType.INTRODUCER, 255 "_SWE7": TokenType.INTRODUCER, 256 "_TIS620": TokenType.INTRODUCER, 257 "_UCS2": TokenType.INTRODUCER, 258 "_UJIS": TokenType.INTRODUCER, 259 # https://dev.mysql.com/doc/refman/8.0/en/string-literals.html 260 "_UTF8": TokenType.INTRODUCER, 261 "_UTF16": TokenType.INTRODUCER, 262 "_UTF16LE": TokenType.INTRODUCER, 263 "_UTF32": TokenType.INTRODUCER, 264 "_UTF8MB3": TokenType.INTRODUCER, 265 "_UTF8MB4": TokenType.INTRODUCER, 266 "@@": TokenType.SESSION_PARAMETER, 267 } 268 269 COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.REPLACE} - {TokenType.SHOW} 270 271 class Parser(parser.Parser): 272 FUNC_TOKENS = { 273 *parser.Parser.FUNC_TOKENS, 274 TokenType.DATABASE, 275 TokenType.MOD, 276 TokenType.SCHEMA, 277 TokenType.VALUES, 278 } 279 280 CONJUNCTION = { 281 **parser.Parser.CONJUNCTION, 282 TokenType.DAMP: exp.And, 283 TokenType.XOR: exp.Xor, 284 } 285 286 DISJUNCTION = { 287 **parser.Parser.DISJUNCTION, 288 TokenType.DPIPE: exp.Or, 289 } 290 291 TABLE_ALIAS_TOKENS = ( 292 parser.Parser.TABLE_ALIAS_TOKENS - parser.Parser.TABLE_INDEX_HINT_TOKENS 293 ) 294 295 RANGE_PARSERS = { 296 **parser.Parser.RANGE_PARSERS, 297 TokenType.SOUNDS_LIKE: lambda self, this: self.expression( 298 exp.EQ, 299 this=self.expression(exp.Soundex, this=this), 300 expression=self.expression(exp.Soundex, this=self._parse_term()), 301 ), 302 TokenType.MEMBER_OF: lambda self, this: self.expression( 303 exp.JSONArrayContains, 304 this=this, 305 expression=self._parse_wrapped(self._parse_expression), 306 ), 307 } 308 309 FUNCTIONS = { 310 **parser.Parser.FUNCTIONS, 311 "BIT_AND": exp.BitwiseAndAgg.from_arg_list, 312 "BIT_OR": exp.BitwiseOrAgg.from_arg_list, 313 "BIT_XOR": exp.BitwiseXorAgg.from_arg_list, 314 "BIT_COUNT": exp.BitwiseCountAgg.from_arg_list, 315 "CONVERT_TZ": lambda args: exp.ConvertTimezone( 316 source_tz=seq_get(args, 1), target_tz=seq_get(args, 2), timestamp=seq_get(args, 0) 317 ), 318 "CURDATE": exp.CurrentDate.from_arg_list, 319 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 320 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 321 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 322 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 323 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 324 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 325 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 326 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 327 "FORMAT": exp.NumberToStr.from_arg_list, 328 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 329 "ISNULL": isnull_to_is_null, 330 "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True), 331 "MAKETIME": exp.TimeFromParts.from_arg_list, 332 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 333 "MONTHNAME": lambda args: exp.TimeToStr( 334 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 335 format=exp.Literal.string("%B"), 336 ), 337 "SCHEMA": exp.CurrentSchema.from_arg_list, 338 "DATABASE": exp.CurrentSchema.from_arg_list, 339 "STR_TO_DATE": _str_to_date, 340 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 341 "TO_DAYS": lambda args: exp.paren( 342 exp.DateDiff( 343 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 344 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 345 unit=exp.var("DAY"), 346 ) 347 + 1 348 ), 349 "WEEK": lambda args: exp.Week( 350 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 351 ), 352 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 353 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 354 } 355 356 FUNCTION_PARSERS = { 357 **parser.Parser.FUNCTION_PARSERS, 358 "CHAR": lambda self: self.expression( 359 exp.Chr, 360 expressions=self._parse_csv(self._parse_assignment), 361 charset=self._match(TokenType.USING) and self._parse_var(), 362 ), 363 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 364 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 365 "VALUES": lambda self: self.expression( 366 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 367 ), 368 "JSON_VALUE": lambda self: self._parse_json_value(), 369 "SUBSTR": lambda self: self._parse_substring(), 370 } 371 372 STATEMENT_PARSERS = { 373 **parser.Parser.STATEMENT_PARSERS, 374 TokenType.SHOW: lambda self: self._parse_show(), 375 } 376 377 SHOW_PARSERS = { 378 "BINARY LOGS": _show_parser("BINARY LOGS"), 379 "MASTER LOGS": _show_parser("BINARY LOGS"), 380 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 381 "CHARACTER SET": _show_parser("CHARACTER SET"), 382 "CHARSET": _show_parser("CHARACTER SET"), 383 "COLLATION": _show_parser("COLLATION"), 384 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 385 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 386 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 387 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 388 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 389 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 390 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 391 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 392 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 393 "DATABASES": _show_parser("DATABASES"), 394 "SCHEMAS": _show_parser("DATABASES"), 395 "ENGINE": _show_parser("ENGINE", target=True), 396 "STORAGE ENGINES": _show_parser("ENGINES"), 397 "ENGINES": _show_parser("ENGINES"), 398 "ERRORS": _show_parser("ERRORS"), 399 "EVENTS": _show_parser("EVENTS"), 400 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 401 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 402 "GRANTS": _show_parser("GRANTS", target="FOR"), 403 "INDEX": _show_parser("INDEX", target="FROM"), 404 "MASTER STATUS": _show_parser("MASTER STATUS"), 405 "OPEN TABLES": _show_parser("OPEN TABLES"), 406 "PLUGINS": _show_parser("PLUGINS"), 407 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 408 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 409 "PRIVILEGES": _show_parser("PRIVILEGES"), 410 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 411 "PROCESSLIST": _show_parser("PROCESSLIST"), 412 "PROFILE": _show_parser("PROFILE"), 413 "PROFILES": _show_parser("PROFILES"), 414 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 415 "REPLICAS": _show_parser("REPLICAS"), 416 "SLAVE HOSTS": _show_parser("REPLICAS"), 417 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 418 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 419 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 420 "SESSION STATUS": _show_parser("STATUS"), 421 "STATUS": _show_parser("STATUS"), 422 "TABLE STATUS": _show_parser("TABLE STATUS"), 423 "FULL TABLES": _show_parser("TABLES", full=True), 424 "TABLES": _show_parser("TABLES"), 425 "TRIGGERS": _show_parser("TRIGGERS"), 426 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 427 "SESSION VARIABLES": _show_parser("VARIABLES"), 428 "VARIABLES": _show_parser("VARIABLES"), 429 "WARNINGS": _show_parser("WARNINGS"), 430 } 431 432 PROPERTY_PARSERS = { 433 **parser.Parser.PROPERTY_PARSERS, 434 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 435 } 436 437 SET_PARSERS = { 438 **parser.Parser.SET_PARSERS, 439 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 440 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 441 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 442 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 443 "NAMES": lambda self: self._parse_set_item_names(), 444 } 445 446 CONSTRAINT_PARSERS = { 447 **parser.Parser.CONSTRAINT_PARSERS, 448 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 449 "INDEX": lambda self: self._parse_index_constraint(), 450 "KEY": lambda self: self._parse_index_constraint(), 451 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 452 } 453 454 ALTER_PARSERS = { 455 **parser.Parser.ALTER_PARSERS, 456 "MODIFY": lambda self: self._parse_alter_table_alter(), 457 } 458 459 ALTER_ALTER_PARSERS = { 460 **parser.Parser.ALTER_ALTER_PARSERS, 461 "INDEX": lambda self: self._parse_alter_table_alter_index(), 462 } 463 464 SCHEMA_UNNAMED_CONSTRAINTS = { 465 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 466 "FULLTEXT", 467 "INDEX", 468 "KEY", 469 "SPATIAL", 470 } 471 472 PROFILE_TYPES: parser.OPTIONS_TYPE = { 473 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 474 "BLOCK": ("IO",), 475 "CONTEXT": ("SWITCHES",), 476 "PAGE": ("FAULTS",), 477 } 478 479 TYPE_TOKENS = { 480 *parser.Parser.TYPE_TOKENS, 481 TokenType.SET, 482 } 483 484 ENUM_TYPE_TOKENS = { 485 *parser.Parser.ENUM_TYPE_TOKENS, 486 TokenType.SET, 487 } 488 489 # SELECT [ ALL | DISTINCT | DISTINCTROW ] [ <OPERATION_MODIFIERS> ] 490 OPERATION_MODIFIERS = { 491 "HIGH_PRIORITY", 492 "STRAIGHT_JOIN", 493 "SQL_SMALL_RESULT", 494 "SQL_BIG_RESULT", 495 "SQL_BUFFER_RESULT", 496 "SQL_NO_CACHE", 497 "SQL_CALC_FOUND_ROWS", 498 } 499 500 LOG_DEFAULTS_TO_LN = True 501 STRING_ALIASES = True 502 VALUES_FOLLOWED_BY_PAREN = False 503 SUPPORTS_PARTITION_SELECTION = True 504 505 def _parse_generated_as_identity( 506 self, 507 ) -> ( 508 exp.GeneratedAsIdentityColumnConstraint 509 | exp.ComputedColumnConstraint 510 | exp.GeneratedAsRowColumnConstraint 511 ): 512 this = super()._parse_generated_as_identity() 513 514 if self._match_texts(("STORED", "VIRTUAL")): 515 persisted = self._prev.text.upper() == "STORED" 516 517 if isinstance(this, exp.ComputedColumnConstraint): 518 this.set("persisted", persisted) 519 elif isinstance(this, exp.GeneratedAsIdentityColumnConstraint): 520 this = self.expression( 521 exp.ComputedColumnConstraint, this=this.expression, persisted=persisted 522 ) 523 524 return this 525 526 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 527 this = self._parse_id_var() 528 if not self._match(TokenType.L_PAREN): 529 return this 530 531 expression = self._parse_number() 532 self._match_r_paren() 533 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 534 535 def _parse_index_constraint( 536 self, kind: t.Optional[str] = None 537 ) -> exp.IndexColumnConstraint: 538 if kind: 539 self._match_texts(("INDEX", "KEY")) 540 541 this = self._parse_id_var(any_token=False) 542 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 543 expressions = self._parse_wrapped_csv(self._parse_ordered) 544 545 options = [] 546 while True: 547 if self._match_text_seq("KEY_BLOCK_SIZE"): 548 self._match(TokenType.EQ) 549 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 550 elif self._match(TokenType.USING): 551 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 552 elif self._match_text_seq("WITH", "PARSER"): 553 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 554 elif self._match(TokenType.COMMENT): 555 opt = exp.IndexConstraintOption(comment=self._parse_string()) 556 elif self._match_text_seq("VISIBLE"): 557 opt = exp.IndexConstraintOption(visible=True) 558 elif self._match_text_seq("INVISIBLE"): 559 opt = exp.IndexConstraintOption(visible=False) 560 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 561 self._match(TokenType.EQ) 562 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 563 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 564 self._match(TokenType.EQ) 565 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 566 else: 567 opt = None 568 569 if not opt: 570 break 571 572 options.append(opt) 573 574 return self.expression( 575 exp.IndexColumnConstraint, 576 this=this, 577 expressions=expressions, 578 kind=kind, 579 index_type=index_type, 580 options=options, 581 ) 582 583 def _parse_show_mysql( 584 self, 585 this: str, 586 target: bool | str = False, 587 full: t.Optional[bool] = None, 588 global_: t.Optional[bool] = None, 589 ) -> exp.Show: 590 json = self._match_text_seq("JSON") 591 592 if target: 593 if isinstance(target, str): 594 self._match_text_seq(*target.split(" ")) 595 target_id = self._parse_id_var() 596 else: 597 target_id = None 598 599 log = self._parse_string() if self._match_text_seq("IN") else None 600 601 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 602 position = self._parse_number() if self._match_text_seq("FROM") else None 603 db = None 604 else: 605 position = None 606 db = None 607 608 if self._match(TokenType.FROM): 609 db = self._parse_id_var() 610 elif self._match(TokenType.DOT): 611 db = target_id 612 target_id = self._parse_id_var() 613 614 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 615 616 like = self._parse_string() if self._match_text_seq("LIKE") else None 617 where = self._parse_where() 618 619 if this == "PROFILE": 620 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 621 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 622 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 623 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 624 else: 625 types, query = None, None 626 offset, limit = self._parse_oldstyle_limit() 627 628 mutex = True if self._match_text_seq("MUTEX") else None 629 mutex = False if self._match_text_seq("STATUS") else mutex 630 631 for_table = self._parse_id_var() if self._match_text_seq("FOR", "TABLE") else None 632 for_group = self._parse_string() if self._match_text_seq("FOR", "GROUP") else None 633 for_user = self._parse_string() if self._match_text_seq("FOR", "USER") else None 634 for_role = self._parse_string() if self._match_text_seq("FOR", "ROLE") else None 635 into_outfile = self._parse_string() if self._match_text_seq("INTO", "OUTFILE") else None 636 637 return self.expression( 638 exp.Show, 639 this=this, 640 target=target_id, 641 full=full, 642 log=log, 643 position=position, 644 db=db, 645 channel=channel, 646 like=like, 647 where=where, 648 types=types, 649 query=query, 650 offset=offset, 651 limit=limit, 652 mutex=mutex, 653 for_table=for_table, 654 for_group=for_group, 655 for_user=for_user, 656 for_role=for_role, 657 into_outfile=into_outfile, 658 json=json, 659 **{"global": global_}, # type: ignore 660 ) 661 662 def _parse_oldstyle_limit( 663 self, 664 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 665 limit = None 666 offset = None 667 if self._match_text_seq("LIMIT"): 668 parts = self._parse_csv(self._parse_number) 669 if len(parts) == 1: 670 limit = parts[0] 671 elif len(parts) == 2: 672 limit = parts[1] 673 offset = parts[0] 674 675 return offset, limit 676 677 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 678 this = self._parse_string() or self._parse_unquoted_field() 679 return self.expression(exp.SetItem, this=this, kind=kind) 680 681 def _parse_set_item_names(self) -> exp.Expression: 682 charset = self._parse_string() or self._parse_unquoted_field() 683 if self._match_text_seq("COLLATE"): 684 collate = self._parse_string() or self._parse_unquoted_field() 685 else: 686 collate = None 687 688 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 689 690 def _parse_type( 691 self, parse_interval: bool = True, fallback_to_identifier: bool = False 692 ) -> t.Optional[exp.Expression]: 693 # mysql binary is special and can work anywhere, even in order by operations 694 # it operates like a no paren func 695 if self._match(TokenType.BINARY, advance=False): 696 data_type = self._parse_types(check_func=True, allow_identifiers=False) 697 698 if isinstance(data_type, exp.DataType): 699 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 700 701 return super()._parse_type( 702 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 703 ) 704 705 def _parse_alter_table_alter_index(self) -> exp.AlterIndex: 706 index = self._parse_field(any_token=True) 707 708 if self._match_text_seq("VISIBLE"): 709 visible = True 710 elif self._match_text_seq("INVISIBLE"): 711 visible = False 712 else: 713 visible = None 714 715 return self.expression(exp.AlterIndex, this=index, visible=visible) 716 717 class Generator(generator.Generator): 718 INTERVAL_ALLOWS_PLURAL_FORM = False 719 LOCKING_READS_SUPPORTED = True 720 NULL_ORDERING_SUPPORTED: t.Optional[bool] = None 721 JOIN_HINTS = False 722 TABLE_HINTS = True 723 DUPLICATE_KEY_UPDATE_WITH_SET = False 724 QUERY_HINT_SEP = " " 725 VALUES_AS_TABLE = False 726 NVL2_SUPPORTED = False 727 LAST_DAY_SUPPORTS_DATE_PART = False 728 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 729 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 730 JSON_KEY_VALUE_PAIR_SEP = "," 731 SUPPORTS_TO_NUMBER = False 732 PARSE_JSON_NAME: t.Optional[str] = None 733 PAD_FILL_PATTERN_IS_REQUIRED = True 734 WRAP_DERIVED_VALUES = False 735 VARCHAR_REQUIRES_SIZE = True 736 SUPPORTS_MEDIAN = False 737 738 TRANSFORMS = { 739 **generator.Generator.TRANSFORMS, 740 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 741 exp.BitwiseAndAgg: rename_func("BIT_AND"), 742 exp.BitwiseOrAgg: rename_func("BIT_OR"), 743 exp.BitwiseXorAgg: rename_func("BIT_XOR"), 744 exp.BitwiseCountAgg: rename_func("BIT_COUNT"), 745 exp.CurrentDate: no_paren_current_date_sql, 746 exp.DateDiff: _remove_ts_or_ds_to_date( 747 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 748 ), 749 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 750 exp.DateStrToDate: datestrtodate_sql, 751 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 752 exp.DateTrunc: _date_trunc_sql, 753 exp.Day: _remove_ts_or_ds_to_date(), 754 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 755 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 756 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 757 exp.GroupConcat: lambda self, 758 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 759 exp.ILike: no_ilike_sql, 760 exp.JSONExtractScalar: arrow_json_extract_sql, 761 exp.Length: length_or_char_length_sql, 762 exp.LogicalOr: rename_func("MAX"), 763 exp.LogicalAnd: rename_func("MIN"), 764 exp.Max: max_or_greatest, 765 exp.Min: min_or_least, 766 exp.Month: _remove_ts_or_ds_to_date(), 767 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 768 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 769 exp.NumberToStr: rename_func("FORMAT"), 770 exp.Pivot: no_pivot_sql, 771 exp.Select: transforms.preprocess( 772 [ 773 transforms.eliminate_distinct_on, 774 transforms.eliminate_semi_and_anti_joins, 775 transforms.eliminate_qualify, 776 transforms.eliminate_full_outer_join, 777 transforms.unnest_generate_date_array_using_recursive_cte, 778 ] 779 ), 780 exp.StrPosition: lambda self, e: strposition_sql( 781 self, e, func_name="LOCATE", supports_position=True 782 ), 783 exp.StrToDate: _str_to_date_sql, 784 exp.StrToTime: _str_to_date_sql, 785 exp.Stuff: rename_func("INSERT"), 786 exp.TableSample: no_tablesample_sql, 787 exp.TimeFromParts: rename_func("MAKETIME"), 788 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 789 exp.TimestampDiff: lambda self, e: self.func( 790 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 791 ), 792 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 793 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 794 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 795 self, 796 e, 797 include_precision=not e.args.get("zone"), 798 ), 799 exp.TimeToStr: _remove_ts_or_ds_to_date( 800 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 801 ), 802 exp.Trim: trim_sql, 803 exp.TryCast: no_trycast_sql, 804 exp.TsOrDsAdd: date_add_sql("ADD"), 805 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 806 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 807 exp.Unicode: lambda self, e: f"ORD(CONVERT({self.sql(e.this)} USING utf32))", 808 exp.UnixToTime: _unix_to_time_sql, 809 exp.Week: _remove_ts_or_ds_to_date(), 810 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 811 exp.Year: _remove_ts_or_ds_to_date(), 812 exp.UtcTimestamp: rename_func("UTC_TIMESTAMP"), 813 exp.UtcTime: rename_func("UTC_TIME"), 814 } 815 816 UNSIGNED_TYPE_MAPPING = { 817 exp.DataType.Type.UBIGINT: "BIGINT", 818 exp.DataType.Type.UINT: "INT", 819 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 820 exp.DataType.Type.USMALLINT: "SMALLINT", 821 exp.DataType.Type.UTINYINT: "TINYINT", 822 exp.DataType.Type.UDECIMAL: "DECIMAL", 823 exp.DataType.Type.UDOUBLE: "DOUBLE", 824 } 825 826 TIMESTAMP_TYPE_MAPPING = { 827 exp.DataType.Type.DATETIME2: "DATETIME", 828 exp.DataType.Type.SMALLDATETIME: "DATETIME", 829 exp.DataType.Type.TIMESTAMP: "DATETIME", 830 exp.DataType.Type.TIMESTAMPNTZ: "DATETIME", 831 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 832 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 833 } 834 835 TYPE_MAPPING = { 836 **generator.Generator.TYPE_MAPPING, 837 **UNSIGNED_TYPE_MAPPING, 838 **TIMESTAMP_TYPE_MAPPING, 839 } 840 841 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 842 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 843 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 844 TYPE_MAPPING.pop(exp.DataType.Type.BLOB) 845 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 846 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 847 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 848 849 PROPERTIES_LOCATION = { 850 **generator.Generator.PROPERTIES_LOCATION, 851 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 852 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 853 } 854 855 LIMIT_FETCH = "LIMIT" 856 857 LIMIT_ONLY_LITERALS = True 858 859 CHAR_CAST_MAPPING = dict.fromkeys( 860 ( 861 exp.DataType.Type.LONGTEXT, 862 exp.DataType.Type.LONGBLOB, 863 exp.DataType.Type.MEDIUMBLOB, 864 exp.DataType.Type.MEDIUMTEXT, 865 exp.DataType.Type.TEXT, 866 exp.DataType.Type.TINYBLOB, 867 exp.DataType.Type.TINYTEXT, 868 exp.DataType.Type.VARCHAR, 869 ), 870 "CHAR", 871 ) 872 SIGNED_CAST_MAPPING = dict.fromkeys( 873 ( 874 exp.DataType.Type.BIGINT, 875 exp.DataType.Type.BOOLEAN, 876 exp.DataType.Type.INT, 877 exp.DataType.Type.SMALLINT, 878 exp.DataType.Type.TINYINT, 879 exp.DataType.Type.MEDIUMINT, 880 ), 881 "SIGNED", 882 ) 883 884 # MySQL doesn't support many datatypes in cast. 885 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 886 CAST_MAPPING = { 887 **CHAR_CAST_MAPPING, 888 **SIGNED_CAST_MAPPING, 889 exp.DataType.Type.UBIGINT: "UNSIGNED", 890 } 891 892 TIMESTAMP_FUNC_TYPES = { 893 exp.DataType.Type.TIMESTAMPTZ, 894 exp.DataType.Type.TIMESTAMPLTZ, 895 } 896 897 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 898 RESERVED_KEYWORDS = { 899 "accessible", 900 "add", 901 "all", 902 "alter", 903 "analyze", 904 "and", 905 "as", 906 "asc", 907 "asensitive", 908 "before", 909 "between", 910 "bigint", 911 "binary", 912 "blob", 913 "both", 914 "by", 915 "call", 916 "cascade", 917 "case", 918 "change", 919 "char", 920 "character", 921 "check", 922 "collate", 923 "column", 924 "condition", 925 "constraint", 926 "continue", 927 "convert", 928 "create", 929 "cross", 930 "cube", 931 "cume_dist", 932 "current_date", 933 "current_time", 934 "current_timestamp", 935 "current_user", 936 "cursor", 937 "database", 938 "databases", 939 "day_hour", 940 "day_microsecond", 941 "day_minute", 942 "day_second", 943 "dec", 944 "decimal", 945 "declare", 946 "default", 947 "delayed", 948 "delete", 949 "dense_rank", 950 "desc", 951 "describe", 952 "deterministic", 953 "distinct", 954 "distinctrow", 955 "div", 956 "double", 957 "drop", 958 "dual", 959 "each", 960 "else", 961 "elseif", 962 "empty", 963 "enclosed", 964 "escaped", 965 "except", 966 "exists", 967 "exit", 968 "explain", 969 "false", 970 "fetch", 971 "first_value", 972 "float", 973 "float4", 974 "float8", 975 "for", 976 "force", 977 "foreign", 978 "from", 979 "fulltext", 980 "function", 981 "generated", 982 "get", 983 "grant", 984 "group", 985 "grouping", 986 "groups", 987 "having", 988 "high_priority", 989 "hour_microsecond", 990 "hour_minute", 991 "hour_second", 992 "if", 993 "ignore", 994 "in", 995 "index", 996 "infile", 997 "inner", 998 "inout", 999 "insensitive", 1000 "insert", 1001 "int", 1002 "int1", 1003 "int2", 1004 "int3", 1005 "int4", 1006 "int8", 1007 "integer", 1008 "intersect", 1009 "interval", 1010 "into", 1011 "io_after_gtids", 1012 "io_before_gtids", 1013 "is", 1014 "iterate", 1015 "join", 1016 "json_table", 1017 "key", 1018 "keys", 1019 "kill", 1020 "lag", 1021 "last_value", 1022 "lateral", 1023 "lead", 1024 "leading", 1025 "leave", 1026 "left", 1027 "like", 1028 "limit", 1029 "linear", 1030 "lines", 1031 "load", 1032 "localtime", 1033 "localtimestamp", 1034 "lock", 1035 "long", 1036 "longblob", 1037 "longtext", 1038 "loop", 1039 "low_priority", 1040 "master_bind", 1041 "master_ssl_verify_server_cert", 1042 "match", 1043 "maxvalue", 1044 "mediumblob", 1045 "mediumint", 1046 "mediumtext", 1047 "middleint", 1048 "minute_microsecond", 1049 "minute_second", 1050 "mod", 1051 "modifies", 1052 "natural", 1053 "not", 1054 "no_write_to_binlog", 1055 "nth_value", 1056 "ntile", 1057 "null", 1058 "numeric", 1059 "of", 1060 "on", 1061 "optimize", 1062 "optimizer_costs", 1063 "option", 1064 "optionally", 1065 "or", 1066 "order", 1067 "out", 1068 "outer", 1069 "outfile", 1070 "over", 1071 "partition", 1072 "percent_rank", 1073 "precision", 1074 "primary", 1075 "procedure", 1076 "purge", 1077 "range", 1078 "rank", 1079 "read", 1080 "reads", 1081 "read_write", 1082 "real", 1083 "recursive", 1084 "references", 1085 "regexp", 1086 "release", 1087 "rename", 1088 "repeat", 1089 "replace", 1090 "require", 1091 "resignal", 1092 "restrict", 1093 "return", 1094 "revoke", 1095 "right", 1096 "rlike", 1097 "row", 1098 "rows", 1099 "row_number", 1100 "schema", 1101 "schemas", 1102 "second_microsecond", 1103 "select", 1104 "sensitive", 1105 "separator", 1106 "set", 1107 "show", 1108 "signal", 1109 "smallint", 1110 "spatial", 1111 "specific", 1112 "sql", 1113 "sqlexception", 1114 "sqlstate", 1115 "sqlwarning", 1116 "sql_big_result", 1117 "sql_calc_found_rows", 1118 "sql_small_result", 1119 "ssl", 1120 "starting", 1121 "stored", 1122 "straight_join", 1123 "system", 1124 "table", 1125 "terminated", 1126 "then", 1127 "tinyblob", 1128 "tinyint", 1129 "tinytext", 1130 "to", 1131 "trailing", 1132 "trigger", 1133 "true", 1134 "undo", 1135 "union", 1136 "unique", 1137 "unlock", 1138 "unsigned", 1139 "update", 1140 "usage", 1141 "use", 1142 "using", 1143 "utc_date", 1144 "utc_time", 1145 "utc_timestamp", 1146 "values", 1147 "varbinary", 1148 "varchar", 1149 "varcharacter", 1150 "varying", 1151 "virtual", 1152 "when", 1153 "where", 1154 "while", 1155 "window", 1156 "with", 1157 "write", 1158 "xor", 1159 "year_month", 1160 "zerofill", 1161 } 1162 1163 def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str: 1164 persisted = "STORED" if expression.args.get("persisted") else "VIRTUAL" 1165 return f"GENERATED ALWAYS AS ({self.sql(expression.this.unnest())}) {persisted}" 1166 1167 def array_sql(self, expression: exp.Array) -> str: 1168 self.unsupported("Arrays are not supported by MySQL") 1169 return self.function_fallback_sql(expression) 1170 1171 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1172 self.unsupported("Array operations are not supported by MySQL") 1173 return self.function_fallback_sql(expression) 1174 1175 def dpipe_sql(self, expression: exp.DPipe) -> str: 1176 return self.func("CONCAT", *expression.flatten()) 1177 1178 def extract_sql(self, expression: exp.Extract) -> str: 1179 unit = expression.name 1180 if unit and unit.lower() == "epoch": 1181 return self.func("UNIX_TIMESTAMP", expression.expression) 1182 1183 return super().extract_sql(expression) 1184 1185 def datatype_sql(self, expression: exp.DataType) -> str: 1186 if ( 1187 self.VARCHAR_REQUIRES_SIZE 1188 and expression.is_type(exp.DataType.Type.VARCHAR) 1189 and not expression.expressions 1190 ): 1191 # `VARCHAR` must always have a size - if it doesn't, we always generate `TEXT` 1192 return "TEXT" 1193 1194 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1195 result = super().datatype_sql(expression) 1196 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1197 result = f"{result} UNSIGNED" 1198 1199 return result 1200 1201 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1202 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1203 1204 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1205 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1206 return self.func("TIMESTAMP", expression.this) 1207 1208 to = self.CAST_MAPPING.get(expression.to.this) 1209 1210 if to: 1211 expression.to.set("this", to) 1212 return super().cast_sql(expression) 1213 1214 def show_sql(self, expression: exp.Show) -> str: 1215 this = f" {expression.name}" 1216 full = " FULL" if expression.args.get("full") else "" 1217 global_ = " GLOBAL" if expression.args.get("global") else "" 1218 1219 target = self.sql(expression, "target") 1220 target = f" {target}" if target else "" 1221 if expression.name in ("COLUMNS", "INDEX"): 1222 target = f" FROM{target}" 1223 elif expression.name == "GRANTS": 1224 target = f" FOR{target}" 1225 elif expression.name in ("LINKS", "PARTITIONS"): 1226 target = f" ON{target}" if target else "" 1227 elif expression.name == "PROJECTIONS": 1228 target = f" ON TABLE{target}" if target else "" 1229 1230 db = self._prefixed_sql("FROM", expression, "db") 1231 1232 like = self._prefixed_sql("LIKE", expression, "like") 1233 where = self.sql(expression, "where") 1234 1235 types = self.expressions(expression, key="types") 1236 types = f" {types}" if types else types 1237 query = self._prefixed_sql("FOR QUERY", expression, "query") 1238 1239 if expression.name == "PROFILE": 1240 offset = self._prefixed_sql("OFFSET", expression, "offset") 1241 limit = self._prefixed_sql("LIMIT", expression, "limit") 1242 else: 1243 offset = "" 1244 limit = self._oldstyle_limit_sql(expression) 1245 1246 log = self._prefixed_sql("IN", expression, "log") 1247 position = self._prefixed_sql("FROM", expression, "position") 1248 1249 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1250 1251 if expression.name == "ENGINE": 1252 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1253 else: 1254 mutex_or_status = "" 1255 1256 for_table = self._prefixed_sql("FOR TABLE", expression, "for_table") 1257 for_group = self._prefixed_sql("FOR GROUP", expression, "for_group") 1258 for_user = self._prefixed_sql("FOR USER", expression, "for_user") 1259 for_role = self._prefixed_sql("FOR ROLE", expression, "for_role") 1260 into_outfile = self._prefixed_sql("INTO OUTFILE", expression, "into_outfile") 1261 json = " JSON" if expression.args.get("json") else "" 1262 1263 return f"SHOW{full}{global_}{this}{json}{target}{for_table}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}{for_group}{for_user}{for_role}{into_outfile}" 1264 1265 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1266 dtype = self.sql(expression, "dtype") 1267 if not dtype: 1268 return super().altercolumn_sql(expression) 1269 1270 this = self.sql(expression, "this") 1271 return f"MODIFY COLUMN {this} {dtype}" 1272 1273 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1274 sql = self.sql(expression, arg) 1275 return f" {prefix} {sql}" if sql else "" 1276 1277 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1278 limit = self.sql(expression, "limit") 1279 offset = self.sql(expression, "offset") 1280 if limit: 1281 limit_offset = f"{offset}, {limit}" if offset else limit 1282 return f" LIMIT {limit_offset}" 1283 return "" 1284 1285 def chr_sql(self, expression: exp.Chr) -> str: 1286 this = self.expressions(sqls=[expression.this] + expression.expressions) 1287 charset = expression.args.get("charset") 1288 using = f" USING {self.sql(charset)}" if charset else "" 1289 return f"CHAR({this}{using})" 1290 1291 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1292 unit = expression.args.get("unit") 1293 1294 # Pick an old-enough date to avoid negative timestamp diffs 1295 start_ts = "'0000-01-01 00:00:00'" 1296 1297 # Source: https://stackoverflow.com/a/32955740 1298 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1299 interval = exp.Interval(this=timestamp_diff, unit=unit) 1300 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1301 1302 return self.sql(dateadd) 1303 1304 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1305 from_tz = expression.args.get("source_tz") 1306 to_tz = expression.args.get("target_tz") 1307 dt = expression.args.get("timestamp") 1308 1309 return self.func("CONVERT_TZ", dt, from_tz, to_tz) 1310 1311 def attimezone_sql(self, expression: exp.AtTimeZone) -> str: 1312 self.unsupported("AT TIME ZONE is not supported by MySQL") 1313 return self.sql(expression.this) 1314 1315 def isascii_sql(self, expression: exp.IsAscii) -> str: 1316 return f"REGEXP_LIKE({self.sql(expression.this)}, '^[[:ascii:]]*$')" 1317 1318 @unsupported_args("this") 1319 def currentschema_sql(self, expression: exp.CurrentSchema) -> str: 1320 return self.func("SCHEMA")
PROMOTE_TO_INFERRED_DATETIME_TYPE =
True
This flag is used in the optimizer's canonicalize rule and determines whether x will be promoted to the literal's type in x::DATE < '2020-01-01 12:05:03' (i.e., DATETIME). When false, the literal is cast to x's type to match it instead.
NORMALIZATION_STRATEGY =
<NormalizationStrategy.CASE_SENSITIVE: 'CASE_SENSITIVE'>
Specifies the strategy according to which identifiers should be normalized.
TIME_MAPPING: Dict[str, str] =
{'%M': '%B', '%c': '%-m', '%e': '%-d', '%h': '%I', '%i': '%M', '%s': '%S', '%u': '%W', '%k': '%-H', '%l': '%-I', '%T': '%H:%M:%S', '%W': '%A'}
Associates this dialect's time formats with their equivalent Python strftime
formats.
UNESCAPED_SEQUENCES: Dict[str, str] =
{'\\a': '\x07', '\\b': '\x08', '\\f': '\x0c', '\\n': '\n', '\\r': '\r', '\\t': '\t', '\\v': '\x0b', '\\\\': '\\'}
Mapping of an escaped sequence (\n
) to its unescaped version (
).
tokenizer_class =
<class 'MySQL.Tokenizer'>
parser_class =
<class 'MySQL.Parser'>
generator_class =
<class 'MySQL.Generator'>
TIME_TRIE: Dict =
{'%': {'M': {0: True}, 'c': {0: True}, 'e': {0: True}, 'h': {0: True}, 'i': {0: True}, 's': {0: True}, 'u': {0: True}, 'k': {0: True}, 'l': {0: True}, 'T': {0: True}, 'W': {0: True}}}
FORMAT_TRIE: Dict =
{'%': {'M': {0: True}, 'c': {0: True}, 'e': {0: True}, 'h': {0: True}, 'i': {0: True}, 's': {0: True}, 'u': {0: True}, 'k': {0: True}, 'l': {0: True}, 'T': {0: True}, 'W': {0: True}}}
INVERSE_TIME_MAPPING: Dict[str, str] =
{'%B': '%M', '%-m': '%c', '%-d': '%e', '%I': '%h', '%M': '%i', '%S': '%s', '%W': '%u', '%-H': '%k', '%-I': '%l', '%H:%M:%S': '%T', '%A': '%W'}
INVERSE_TIME_TRIE: Dict =
{'%': {'B': {0: True}, '-': {'m': {0: True}, 'd': {0: True}, 'H': {0: True}, 'I': {0: True}}, 'I': {0: True}, 'M': {0: True}, 'S': {0: True}, 'W': {0: True}, 'H': {':': {'%': {'M': {':': {'%': {'S': {0: True}}}}}}}, 'A': {0: True}}}
183 class Tokenizer(tokens.Tokenizer): 184 QUOTES = ["'", '"'] 185 COMMENTS = ["--", "#", ("/*", "*/")] 186 IDENTIFIERS = ["`"] 187 STRING_ESCAPES = ["'", '"', "\\"] 188 BIT_STRINGS = [("b'", "'"), ("B'", "'"), ("0b", "")] 189 HEX_STRINGS = [("x'", "'"), ("X'", "'"), ("0x", "")] 190 191 NESTED_COMMENTS = False 192 193 KEYWORDS = { 194 **tokens.Tokenizer.KEYWORDS, 195 "BLOB": TokenType.BLOB, 196 "CHARSET": TokenType.CHARACTER_SET, 197 "DISTINCTROW": TokenType.DISTINCT, 198 "EXPLAIN": TokenType.DESCRIBE, 199 "FORCE": TokenType.FORCE, 200 "IGNORE": TokenType.IGNORE, 201 "KEY": TokenType.KEY, 202 "LOCK TABLES": TokenType.COMMAND, 203 "LONGBLOB": TokenType.LONGBLOB, 204 "LONGTEXT": TokenType.LONGTEXT, 205 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 206 "MEDIUMINT": TokenType.MEDIUMINT, 207 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 208 "MEMBER OF": TokenType.MEMBER_OF, 209 "MOD": TokenType.MOD, 210 "SEPARATOR": TokenType.SEPARATOR, 211 "SERIAL": TokenType.SERIAL, 212 "SIGNED": TokenType.BIGINT, 213 "SIGNED INTEGER": TokenType.BIGINT, 214 "SOUNDS LIKE": TokenType.SOUNDS_LIKE, 215 "START": TokenType.BEGIN, 216 "TIMESTAMP": TokenType.TIMESTAMPTZ, 217 "TINYBLOB": TokenType.TINYBLOB, 218 "TINYTEXT": TokenType.TINYTEXT, 219 "UNLOCK TABLES": TokenType.COMMAND, 220 "UNSIGNED": TokenType.UBIGINT, 221 "UNSIGNED INTEGER": TokenType.UBIGINT, 222 "YEAR": TokenType.YEAR, 223 "_ARMSCII8": TokenType.INTRODUCER, 224 "_ASCII": TokenType.INTRODUCER, 225 "_BIG5": TokenType.INTRODUCER, 226 "_BINARY": TokenType.INTRODUCER, 227 "_CP1250": TokenType.INTRODUCER, 228 "_CP1251": TokenType.INTRODUCER, 229 "_CP1256": TokenType.INTRODUCER, 230 "_CP1257": TokenType.INTRODUCER, 231 "_CP850": TokenType.INTRODUCER, 232 "_CP852": TokenType.INTRODUCER, 233 "_CP866": TokenType.INTRODUCER, 234 "_CP932": TokenType.INTRODUCER, 235 "_DEC8": TokenType.INTRODUCER, 236 "_EUCJPMS": TokenType.INTRODUCER, 237 "_EUCKR": TokenType.INTRODUCER, 238 "_GB18030": TokenType.INTRODUCER, 239 "_GB2312": TokenType.INTRODUCER, 240 "_GBK": TokenType.INTRODUCER, 241 "_GEOSTD8": TokenType.INTRODUCER, 242 "_GREEK": TokenType.INTRODUCER, 243 "_HEBREW": TokenType.INTRODUCER, 244 "_HP8": TokenType.INTRODUCER, 245 "_KEYBCS2": TokenType.INTRODUCER, 246 "_KOI8R": TokenType.INTRODUCER, 247 "_KOI8U": TokenType.INTRODUCER, 248 "_LATIN1": TokenType.INTRODUCER, 249 "_LATIN2": TokenType.INTRODUCER, 250 "_LATIN5": TokenType.INTRODUCER, 251 "_LATIN7": TokenType.INTRODUCER, 252 "_MACCE": TokenType.INTRODUCER, 253 "_MACROMAN": TokenType.INTRODUCER, 254 "_SJIS": TokenType.INTRODUCER, 255 "_SWE7": TokenType.INTRODUCER, 256 "_TIS620": TokenType.INTRODUCER, 257 "_UCS2": TokenType.INTRODUCER, 258 "_UJIS": TokenType.INTRODUCER, 259 # https://dev.mysql.com/doc/refman/8.0/en/string-literals.html 260 "_UTF8": TokenType.INTRODUCER, 261 "_UTF16": TokenType.INTRODUCER, 262 "_UTF16LE": TokenType.INTRODUCER, 263 "_UTF32": TokenType.INTRODUCER, 264 "_UTF8MB3": TokenType.INTRODUCER, 265 "_UTF8MB4": TokenType.INTRODUCER, 266 "@@": TokenType.SESSION_PARAMETER, 267 } 268 269 COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.REPLACE} - {TokenType.SHOW}
KEYWORDS =
{'{%': <TokenType.BLOCK_START: 'BLOCK_START'>, '{%+': <TokenType.BLOCK_START: 'BLOCK_START'>, '{%-': <TokenType.BLOCK_START: 'BLOCK_START'>, '%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '+%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '-%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '{{+': <TokenType.BLOCK_START: 'BLOCK_START'>, '{{-': <TokenType.BLOCK_START: 'BLOCK_START'>, '+}}': <TokenType.BLOCK_END: 'BLOCK_END'>, '-}}': <TokenType.BLOCK_END: 'BLOCK_END'>, '/*+': <TokenType.HINT: 'HINT'>, '==': <TokenType.EQ: 'EQ'>, '::': <TokenType.DCOLON: 'DCOLON'>, '||': <TokenType.DPIPE: 'DPIPE'>, '|>': <TokenType.PIPE_GT: 'PIPE_GT'>, '>=': <TokenType.GTE: 'GTE'>, '<=': <TokenType.LTE: 'LTE'>, '<>': <TokenType.NEQ: 'NEQ'>, '!=': <TokenType.NEQ: 'NEQ'>, ':=': <TokenType.COLON_EQ: 'COLON_EQ'>, '<=>': <TokenType.NULLSAFE_EQ: 'NULLSAFE_EQ'>, '->': <TokenType.ARROW: 'ARROW'>, '->>': <TokenType.DARROW: 'DARROW'>, '=>': <TokenType.FARROW: 'FARROW'>, '#>': <TokenType.HASH_ARROW: 'HASH_ARROW'>, '#>>': <TokenType.DHASH_ARROW: 'DHASH_ARROW'>, '<->': <TokenType.LR_ARROW: 'LR_ARROW'>, '&&': <TokenType.DAMP: 'DAMP'>, '??': <TokenType.DQMARK: 'DQMARK'>, '~~~': <TokenType.GLOB: 'GLOB'>, '~~': <TokenType.LIKE: 'LIKE'>, '~~*': <TokenType.ILIKE: 'ILIKE'>, '~*': <TokenType.IRLIKE: 'IRLIKE'>, 'ALL': <TokenType.ALL: 'ALL'>, 'AND': <TokenType.AND: 'AND'>, 'ANTI': <TokenType.ANTI: 'ANTI'>, 'ANY': <TokenType.ANY: 'ANY'>, 'ASC': <TokenType.ASC: 'ASC'>, 'AS': <TokenType.ALIAS: 'ALIAS'>, 'ASOF': <TokenType.ASOF: 'ASOF'>, 'AUTOINCREMENT': <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, 'AUTO_INCREMENT': <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, 'BEGIN': <TokenType.BEGIN: 'BEGIN'>, 'BETWEEN': <TokenType.BETWEEN: 'BETWEEN'>, 'CACHE': <TokenType.CACHE: 'CACHE'>, 'UNCACHE': <TokenType.UNCACHE: 'UNCACHE'>, 'CASE': <TokenType.CASE: 'CASE'>, 'CHARACTER SET': <TokenType.CHARACTER_SET: 'CHARACTER_SET'>, 'CLUSTER BY': <TokenType.CLUSTER_BY: 'CLUSTER_BY'>, 'COLLATE': <TokenType.COLLATE: 'COLLATE'>, 'COLUMN': <TokenType.COLUMN: 'COLUMN'>, 'COMMIT': <TokenType.COMMIT: 'COMMIT'>, 'CONNECT BY': <TokenType.CONNECT_BY: 'CONNECT_BY'>, 'CONSTRAINT': <TokenType.CONSTRAINT: 'CONSTRAINT'>, 'COPY': <TokenType.COPY: 'COPY'>, 'CREATE': <TokenType.CREATE: 'CREATE'>, 'CROSS': <TokenType.CROSS: 'CROSS'>, 'CUBE': <TokenType.CUBE: 'CUBE'>, 'CURRENT_DATE': <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, 'CURRENT_SCHEMA': <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, 'CURRENT_TIME': <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, 'CURRENT_TIMESTAMP': <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, 'CURRENT_USER': <TokenType.CURRENT_USER: 'CURRENT_USER'>, 'DATABASE': <TokenType.DATABASE: 'DATABASE'>, 'DEFAULT': <TokenType.DEFAULT: 'DEFAULT'>, 'DELETE': <TokenType.DELETE: 'DELETE'>, 'DESC': <TokenType.DESC: 'DESC'>, 'DESCRIBE': <TokenType.DESCRIBE: 'DESCRIBE'>, 'DISTINCT': <TokenType.DISTINCT: 'DISTINCT'>, 'DISTRIBUTE BY': <TokenType.DISTRIBUTE_BY: 'DISTRIBUTE_BY'>, 'DIV': <TokenType.DIV: 'DIV'>, 'DROP': <TokenType.DROP: 'DROP'>, 'ELSE': <TokenType.ELSE: 'ELSE'>, 'END': <TokenType.END: 'END'>, 'ENUM': <TokenType.ENUM: 'ENUM'>, 'ESCAPE': <TokenType.ESCAPE: 'ESCAPE'>, 'EXCEPT': <TokenType.EXCEPT: 'EXCEPT'>, 'EXECUTE': <TokenType.EXECUTE: 'EXECUTE'>, 'EXISTS': <TokenType.EXISTS: 'EXISTS'>, 'FALSE': <TokenType.FALSE: 'FALSE'>, 'FETCH': <TokenType.FETCH: 'FETCH'>, 'FILTER': <TokenType.FILTER: 'FILTER'>, 'FIRST': <TokenType.FIRST: 'FIRST'>, 'FULL': <TokenType.FULL: 'FULL'>, 'FUNCTION': <TokenType.FUNCTION: 'FUNCTION'>, 'FOR': <TokenType.FOR: 'FOR'>, 'FOREIGN KEY': <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, 'FORMAT': <TokenType.FORMAT: 'FORMAT'>, 'FROM': <TokenType.FROM: 'FROM'>, 'GEOGRAPHY': <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, 'GEOMETRY': <TokenType.GEOMETRY: 'GEOMETRY'>, 'GLOB': <TokenType.GLOB: 'GLOB'>, 'GROUP BY': <TokenType.GROUP_BY: 'GROUP_BY'>, 'GROUPING SETS': <TokenType.GROUPING_SETS: 'GROUPING_SETS'>, 'HAVING': <TokenType.HAVING: 'HAVING'>, 'ILIKE': <TokenType.ILIKE: 'ILIKE'>, 'IN': <TokenType.IN: 'IN'>, 'INDEX': <TokenType.INDEX: 'INDEX'>, 'INET': <TokenType.INET: 'INET'>, 'INNER': <TokenType.INNER: 'INNER'>, 'INSERT': <TokenType.INSERT: 'INSERT'>, 'INTERVAL': <TokenType.INTERVAL: 'INTERVAL'>, 'INTERSECT': <TokenType.INTERSECT: 'INTERSECT'>, 'INTO': <TokenType.INTO: 'INTO'>, 'IS': <TokenType.IS: 'IS'>, 'ISNULL': <TokenType.ISNULL: 'ISNULL'>, 'JOIN': <TokenType.JOIN: 'JOIN'>, 'KEEP': <TokenType.KEEP: 'KEEP'>, 'KILL': <TokenType.KILL: 'KILL'>, 'LATERAL': <TokenType.LATERAL: 'LATERAL'>, 'LEFT': <TokenType.LEFT: 'LEFT'>, 'LIKE': <TokenType.LIKE: 'LIKE'>, 'LIMIT': <TokenType.LIMIT: 'LIMIT'>, 'LOAD': <TokenType.LOAD: 'LOAD'>, 'LOCK': <TokenType.LOCK: 'LOCK'>, 'MERGE': <TokenType.MERGE: 'MERGE'>, 'NAMESPACE': <TokenType.NAMESPACE: 'NAMESPACE'>, 'NATURAL': <TokenType.NATURAL: 'NATURAL'>, 'NEXT': <TokenType.NEXT: 'NEXT'>, 'NOT': <TokenType.NOT: 'NOT'>, 'NOTNULL': <TokenType.NOTNULL: 'NOTNULL'>, 'NULL': <TokenType.NULL: 'NULL'>, 'OBJECT': <TokenType.OBJECT: 'OBJECT'>, 'OFFSET': <TokenType.OFFSET: 'OFFSET'>, 'ON': <TokenType.ON: 'ON'>, 'OR': <TokenType.OR: 'OR'>, 'XOR': <TokenType.XOR: 'XOR'>, 'ORDER BY': <TokenType.ORDER_BY: 'ORDER_BY'>, 'ORDINALITY': <TokenType.ORDINALITY: 'ORDINALITY'>, 'OUTER': <TokenType.OUTER: 'OUTER'>, 'OVER': <TokenType.OVER: 'OVER'>, 'OVERLAPS': <TokenType.OVERLAPS: 'OVERLAPS'>, 'OVERWRITE': <TokenType.OVERWRITE: 'OVERWRITE'>, 'PARTITION': <TokenType.PARTITION: 'PARTITION'>, 'PARTITION BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PARTITIONED BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PARTITIONED_BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PERCENT': <TokenType.PERCENT: 'PERCENT'>, 'PIVOT': <TokenType.PIVOT: 'PIVOT'>, 'PRAGMA': <TokenType.PRAGMA: 'PRAGMA'>, 'PRIMARY KEY': <TokenType.PRIMARY_KEY: 'PRIMARY_KEY'>, 'PROCEDURE': <TokenType.PROCEDURE: 'PROCEDURE'>, 'QUALIFY': <TokenType.QUALIFY: 'QUALIFY'>, 'RANGE': <TokenType.RANGE: 'RANGE'>, 'RECURSIVE': <TokenType.RECURSIVE: 'RECURSIVE'>, 'REGEXP': <TokenType.RLIKE: 'RLIKE'>, 'RENAME': <TokenType.RENAME: 'RENAME'>, 'REPLACE': <TokenType.REPLACE: 'REPLACE'>, 'RETURNING': <TokenType.RETURNING: 'RETURNING'>, 'REFERENCES': <TokenType.REFERENCES: 'REFERENCES'>, 'RIGHT': <TokenType.RIGHT: 'RIGHT'>, 'RLIKE': <TokenType.RLIKE: 'RLIKE'>, 'ROLLBACK': <TokenType.ROLLBACK: 'ROLLBACK'>, 'ROLLUP': <TokenType.ROLLUP: 'ROLLUP'>, 'ROW': <TokenType.ROW: 'ROW'>, 'ROWS': <TokenType.ROWS: 'ROWS'>, 'SCHEMA': <TokenType.SCHEMA: 'SCHEMA'>, 'SELECT': <TokenType.SELECT: 'SELECT'>, 'SEMI': <TokenType.SEMI: 'SEMI'>, 'SESSION': <TokenType.SESSION: 'SESSION'>, 'SET': <TokenType.SET: 'SET'>, 'SETTINGS': <TokenType.SETTINGS: 'SETTINGS'>, 'SHOW': <TokenType.SHOW: 'SHOW'>, 'SIMILAR TO': <TokenType.SIMILAR_TO: 'SIMILAR_TO'>, 'SOME': <TokenType.SOME: 'SOME'>, 'SORT BY': <TokenType.SORT_BY: 'SORT_BY'>, 'START WITH': <TokenType.START_WITH: 'START_WITH'>, 'STRAIGHT_JOIN': <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, 'TABLE': <TokenType.TABLE: 'TABLE'>, 'TABLESAMPLE': <TokenType.TABLE_SAMPLE: 'TABLE_SAMPLE'>, 'TEMP': <TokenType.TEMPORARY: 'TEMPORARY'>, 'TEMPORARY': <TokenType.TEMPORARY: 'TEMPORARY'>, 'THEN': <TokenType.THEN: 'THEN'>, 'TRUE': <TokenType.TRUE: 'TRUE'>, 'TRUNCATE': <TokenType.TRUNCATE: 'TRUNCATE'>, 'UNION': <TokenType.UNION: 'UNION'>, 'UNKNOWN': <TokenType.UNKNOWN: 'UNKNOWN'>, 'UNNEST': <TokenType.UNNEST: 'UNNEST'>, 'UNPIVOT': <TokenType.UNPIVOT: 'UNPIVOT'>, 'UPDATE': <TokenType.UPDATE: 'UPDATE'>, 'USE': <TokenType.USE: 'USE'>, 'USING': <TokenType.USING: 'USING'>, 'UUID': <TokenType.UUID: 'UUID'>, 'VALUES': <TokenType.VALUES: 'VALUES'>, 'VIEW': <TokenType.VIEW: 'VIEW'>, 'VOLATILE': <TokenType.VOLATILE: 'VOLATILE'>, 'WHEN': <TokenType.WHEN: 'WHEN'>, 'WHERE': <TokenType.WHERE: 'WHERE'>, 'WINDOW': <TokenType.WINDOW: 'WINDOW'>, 'WITH': <TokenType.WITH: 'WITH'>, 'APPLY': <TokenType.APPLY: 'APPLY'>, 'ARRAY': <TokenType.ARRAY: 'ARRAY'>, 'BIT': <TokenType.BIT: 'BIT'>, 'BOOL': <TokenType.BOOLEAN: 'BOOLEAN'>, 'BOOLEAN': <TokenType.BOOLEAN: 'BOOLEAN'>, 'BYTE': <TokenType.TINYINT: 'TINYINT'>, 'MEDIUMINT': <TokenType.MEDIUMINT: 'MEDIUMINT'>, 'INT1': <TokenType.TINYINT: 'TINYINT'>, 'TINYINT': <TokenType.TINYINT: 'TINYINT'>, 'INT16': <TokenType.SMALLINT: 'SMALLINT'>, 'SHORT': <TokenType.SMALLINT: 'SMALLINT'>, 'SMALLINT': <TokenType.SMALLINT: 'SMALLINT'>, 'HUGEINT': <TokenType.INT128: 'INT128'>, 'UHUGEINT': <TokenType.UINT128: 'UINT128'>, 'INT2': <TokenType.SMALLINT: 'SMALLINT'>, 'INTEGER': <TokenType.INT: 'INT'>, 'INT': <TokenType.INT: 'INT'>, 'INT4': <TokenType.INT: 'INT'>, 'INT32': <TokenType.INT: 'INT'>, 'INT64': <TokenType.BIGINT: 'BIGINT'>, 'INT128': <TokenType.INT128: 'INT128'>, 'INT256': <TokenType.INT256: 'INT256'>, 'LONG': <TokenType.BIGINT: 'BIGINT'>, 'BIGINT': <TokenType.BIGINT: 'BIGINT'>, 'INT8': <TokenType.TINYINT: 'TINYINT'>, 'UINT': <TokenType.UINT: 'UINT'>, 'UINT128': <TokenType.UINT128: 'UINT128'>, 'UINT256': <TokenType.UINT256: 'UINT256'>, 'DEC': <TokenType.DECIMAL: 'DECIMAL'>, 'DECIMAL': <TokenType.DECIMAL: 'DECIMAL'>, 'DECIMAL32': <TokenType.DECIMAL32: 'DECIMAL32'>, 'DECIMAL64': <TokenType.DECIMAL64: 'DECIMAL64'>, 'DECIMAL128': <TokenType.DECIMAL128: 'DECIMAL128'>, 'DECIMAL256': <TokenType.DECIMAL256: 'DECIMAL256'>, 'BIGDECIMAL': <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, 'BIGNUMERIC': <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, 'LIST': <TokenType.LIST: 'LIST'>, 'MAP': <TokenType.MAP: 'MAP'>, 'NULLABLE': <TokenType.NULLABLE: 'NULLABLE'>, 'NUMBER': <TokenType.DECIMAL: 'DECIMAL'>, 'NUMERIC': <TokenType.DECIMAL: 'DECIMAL'>, 'FIXED': <TokenType.DECIMAL: 'DECIMAL'>, 'REAL': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT4': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT8': <TokenType.DOUBLE: 'DOUBLE'>, 'DOUBLE': <TokenType.DOUBLE: 'DOUBLE'>, 'DOUBLE PRECISION': <TokenType.DOUBLE: 'DOUBLE'>, 'JSON': <TokenType.JSON: 'JSON'>, 'JSONB': <TokenType.JSONB: 'JSONB'>, 'CHAR': <TokenType.CHAR: 'CHAR'>, 'CHARACTER': <TokenType.CHAR: 'CHAR'>, 'CHAR VARYING': <TokenType.VARCHAR: 'VARCHAR'>, 'CHARACTER VARYING': <TokenType.VARCHAR: 'VARCHAR'>, 'NCHAR': <TokenType.NCHAR: 'NCHAR'>, 'VARCHAR': <TokenType.VARCHAR: 'VARCHAR'>, 'VARCHAR2': <TokenType.VARCHAR: 'VARCHAR'>, 'NVARCHAR': <TokenType.NVARCHAR: 'NVARCHAR'>, 'NVARCHAR2': <TokenType.NVARCHAR: 'NVARCHAR'>, 'BPCHAR': <TokenType.BPCHAR: 'BPCHAR'>, 'STR': <TokenType.TEXT: 'TEXT'>, 'STRING': <TokenType.TEXT: 'TEXT'>, 'TEXT': <TokenType.TEXT: 'TEXT'>, 'LONGTEXT': <TokenType.LONGTEXT: 'LONGTEXT'>, 'MEDIUMTEXT': <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, 'TINYTEXT': <TokenType.TINYTEXT: 'TINYTEXT'>, 'CLOB': <TokenType.TEXT: 'TEXT'>, 'LONGVARCHAR': <TokenType.TEXT: 'TEXT'>, 'BINARY': <TokenType.BINARY: 'BINARY'>, 'BLOB': <TokenType.BLOB: 'BLOB'>, 'LONGBLOB': <TokenType.LONGBLOB: 'LONGBLOB'>, 'MEDIUMBLOB': <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, 'TINYBLOB': <TokenType.TINYBLOB: 'TINYBLOB'>, 'BYTEA': <TokenType.VARBINARY: 'VARBINARY'>, 'VARBINARY': <TokenType.VARBINARY: 'VARBINARY'>, 'TIME': <TokenType.TIME: 'TIME'>, 'TIMETZ': <TokenType.TIMETZ: 'TIMETZ'>, 'TIMESTAMP': <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, 'TIMESTAMPTZ': <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, 'TIMESTAMPLTZ': <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, 'TIMESTAMP_LTZ': <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, 'TIMESTAMPNTZ': <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, 'TIMESTAMP_NTZ': <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, 'DATE': <TokenType.DATE: 'DATE'>, 'DATETIME': <TokenType.DATETIME: 'DATETIME'>, 'INT4RANGE': <TokenType.INT4RANGE: 'INT4RANGE'>, 'INT4MULTIRANGE': <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, 'INT8RANGE': <TokenType.INT8RANGE: 'INT8RANGE'>, 'INT8MULTIRANGE': <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, 'NUMRANGE': <TokenType.NUMRANGE: 'NUMRANGE'>, 'NUMMULTIRANGE': <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, 'TSRANGE': <TokenType.TSRANGE: 'TSRANGE'>, 'TSMULTIRANGE': <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, 'TSTZRANGE': <TokenType.TSTZRANGE: 'TSTZRANGE'>, 'TSTZMULTIRANGE': <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, 'DATERANGE': <TokenType.DATERANGE: 'DATERANGE'>, 'DATEMULTIRANGE': <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, 'UNIQUE': <TokenType.UNIQUE: 'UNIQUE'>, 'VECTOR': <TokenType.VECTOR: 'VECTOR'>, 'STRUCT': <TokenType.STRUCT: 'STRUCT'>, 'SEQUENCE': <TokenType.SEQUENCE: 'SEQUENCE'>, 'VARIANT': <TokenType.VARIANT: 'VARIANT'>, 'ALTER': <TokenType.ALTER: 'ALTER'>, 'ANALYZE': <TokenType.ANALYZE: 'ANALYZE'>, 'CALL': <TokenType.COMMAND: 'COMMAND'>, 'COMMENT': <TokenType.COMMENT: 'COMMENT'>, 'EXPLAIN': <TokenType.DESCRIBE: 'DESCRIBE'>, 'GRANT': <TokenType.GRANT: 'GRANT'>, 'REVOKE': <TokenType.REVOKE: 'REVOKE'>, 'OPTIMIZE': <TokenType.COMMAND: 'COMMAND'>, 'PREPARE': <TokenType.COMMAND: 'COMMAND'>, 'VACUUM': <TokenType.COMMAND: 'COMMAND'>, 'USER-DEFINED': <TokenType.USERDEFINED: 'USERDEFINED'>, 'FOR VERSION': <TokenType.VERSION_SNAPSHOT: 'VERSION_SNAPSHOT'>, 'FOR TIMESTAMP': <TokenType.TIMESTAMP_SNAPSHOT: 'TIMESTAMP_SNAPSHOT'>, 'CHARSET': <TokenType.CHARACTER_SET: 'CHARACTER_SET'>, 'DISTINCTROW': <TokenType.DISTINCT: 'DISTINCT'>, 'FORCE': <TokenType.FORCE: 'FORCE'>, 'IGNORE': <TokenType.IGNORE: 'IGNORE'>, 'KEY': <TokenType.KEY: 'KEY'>, 'LOCK TABLES': <TokenType.COMMAND: 'COMMAND'>, 'MEMBER OF': <TokenType.MEMBER_OF: 'MEMBER_OF'>, 'MOD': <TokenType.MOD: 'MOD'>, 'SEPARATOR': <TokenType.SEPARATOR: 'SEPARATOR'>, 'SERIAL': <TokenType.SERIAL: 'SERIAL'>, 'SIGNED': <TokenType.BIGINT: 'BIGINT'>, 'SIGNED INTEGER': <TokenType.BIGINT: 'BIGINT'>, 'SOUNDS LIKE': <TokenType.SOUNDS_LIKE: 'SOUNDS_LIKE'>, 'START': <TokenType.BEGIN: 'BEGIN'>, 'UNLOCK TABLES': <TokenType.COMMAND: 'COMMAND'>, 'UNSIGNED': <TokenType.UBIGINT: 'UBIGINT'>, 'UNSIGNED INTEGER': <TokenType.UBIGINT: 'UBIGINT'>, 'YEAR': <TokenType.YEAR: 'YEAR'>, '_ARMSCII8': <TokenType.INTRODUCER: 'INTRODUCER'>, '_ASCII': <TokenType.INTRODUCER: 'INTRODUCER'>, '_BIG5': <TokenType.INTRODUCER: 'INTRODUCER'>, '_BINARY': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP1250': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP1251': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP1256': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP1257': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP850': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP852': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP866': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP932': <TokenType.INTRODUCER: 'INTRODUCER'>, '_DEC8': <TokenType.INTRODUCER: 'INTRODUCER'>, '_EUCJPMS': <TokenType.INTRODUCER: 'INTRODUCER'>, '_EUCKR': <TokenType.INTRODUCER: 'INTRODUCER'>, '_GB18030': <TokenType.INTRODUCER: 'INTRODUCER'>, '_GB2312': <TokenType.INTRODUCER: 'INTRODUCER'>, '_GBK': <TokenType.INTRODUCER: 'INTRODUCER'>, '_GEOSTD8': <TokenType.INTRODUCER: 'INTRODUCER'>, '_GREEK': <TokenType.INTRODUCER: 'INTRODUCER'>, '_HEBREW': <TokenType.INTRODUCER: 'INTRODUCER'>, '_HP8': <TokenType.INTRODUCER: 'INTRODUCER'>, '_KEYBCS2': <TokenType.INTRODUCER: 'INTRODUCER'>, '_KOI8R': <TokenType.INTRODUCER: 'INTRODUCER'>, '_KOI8U': <TokenType.INTRODUCER: 'INTRODUCER'>, '_LATIN1': <TokenType.INTRODUCER: 'INTRODUCER'>, '_LATIN2': <TokenType.INTRODUCER: 'INTRODUCER'>, '_LATIN5': <TokenType.INTRODUCER: 'INTRODUCER'>, '_LATIN7': <TokenType.INTRODUCER: 'INTRODUCER'>, '_MACCE': <TokenType.INTRODUCER: 'INTRODUCER'>, '_MACROMAN': <TokenType.INTRODUCER: 'INTRODUCER'>, '_SJIS': <TokenType.INTRODUCER: 'INTRODUCER'>, '_SWE7': <TokenType.INTRODUCER: 'INTRODUCER'>, '_TIS620': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UCS2': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UJIS': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UTF8': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UTF16': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UTF16LE': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UTF32': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UTF8MB3': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UTF8MB4': <TokenType.INTRODUCER: 'INTRODUCER'>, '@@': <TokenType.SESSION_PARAMETER: 'SESSION_PARAMETER'>}
COMMANDS =
{<TokenType.FETCH: 'FETCH'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.RENAME: 'RENAME'>}
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- SINGLE_TOKENS
- BYTE_STRINGS
- RAW_STRINGS
- HEREDOC_STRINGS
- UNICODE_STRINGS
- VAR_SINGLE_TOKENS
- IDENTIFIER_ESCAPES
- HEREDOC_TAG_IS_IDENTIFIER
- HEREDOC_STRING_ALTERNATIVE
- STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS
- HINT_START
- TOKENS_PRECEDING_HINT
- WHITE_SPACE
- COMMAND_PREFIX_TOKENS
- NUMERIC_LITERALS
- dialect
- use_rs_tokenizer
- reset
- tokenize
- tokenize_rs
- size
- sql
- tokens
271 class Parser(parser.Parser): 272 FUNC_TOKENS = { 273 *parser.Parser.FUNC_TOKENS, 274 TokenType.DATABASE, 275 TokenType.MOD, 276 TokenType.SCHEMA, 277 TokenType.VALUES, 278 } 279 280 CONJUNCTION = { 281 **parser.Parser.CONJUNCTION, 282 TokenType.DAMP: exp.And, 283 TokenType.XOR: exp.Xor, 284 } 285 286 DISJUNCTION = { 287 **parser.Parser.DISJUNCTION, 288 TokenType.DPIPE: exp.Or, 289 } 290 291 TABLE_ALIAS_TOKENS = ( 292 parser.Parser.TABLE_ALIAS_TOKENS - parser.Parser.TABLE_INDEX_HINT_TOKENS 293 ) 294 295 RANGE_PARSERS = { 296 **parser.Parser.RANGE_PARSERS, 297 TokenType.SOUNDS_LIKE: lambda self, this: self.expression( 298 exp.EQ, 299 this=self.expression(exp.Soundex, this=this), 300 expression=self.expression(exp.Soundex, this=self._parse_term()), 301 ), 302 TokenType.MEMBER_OF: lambda self, this: self.expression( 303 exp.JSONArrayContains, 304 this=this, 305 expression=self._parse_wrapped(self._parse_expression), 306 ), 307 } 308 309 FUNCTIONS = { 310 **parser.Parser.FUNCTIONS, 311 "BIT_AND": exp.BitwiseAndAgg.from_arg_list, 312 "BIT_OR": exp.BitwiseOrAgg.from_arg_list, 313 "BIT_XOR": exp.BitwiseXorAgg.from_arg_list, 314 "BIT_COUNT": exp.BitwiseCountAgg.from_arg_list, 315 "CONVERT_TZ": lambda args: exp.ConvertTimezone( 316 source_tz=seq_get(args, 1), target_tz=seq_get(args, 2), timestamp=seq_get(args, 0) 317 ), 318 "CURDATE": exp.CurrentDate.from_arg_list, 319 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 320 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 321 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 322 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 323 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 324 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 325 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 326 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 327 "FORMAT": exp.NumberToStr.from_arg_list, 328 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 329 "ISNULL": isnull_to_is_null, 330 "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True), 331 "MAKETIME": exp.TimeFromParts.from_arg_list, 332 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 333 "MONTHNAME": lambda args: exp.TimeToStr( 334 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 335 format=exp.Literal.string("%B"), 336 ), 337 "SCHEMA": exp.CurrentSchema.from_arg_list, 338 "DATABASE": exp.CurrentSchema.from_arg_list, 339 "STR_TO_DATE": _str_to_date, 340 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 341 "TO_DAYS": lambda args: exp.paren( 342 exp.DateDiff( 343 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 344 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 345 unit=exp.var("DAY"), 346 ) 347 + 1 348 ), 349 "WEEK": lambda args: exp.Week( 350 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 351 ), 352 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 353 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 354 } 355 356 FUNCTION_PARSERS = { 357 **parser.Parser.FUNCTION_PARSERS, 358 "CHAR": lambda self: self.expression( 359 exp.Chr, 360 expressions=self._parse_csv(self._parse_assignment), 361 charset=self._match(TokenType.USING) and self._parse_var(), 362 ), 363 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 364 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 365 "VALUES": lambda self: self.expression( 366 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 367 ), 368 "JSON_VALUE": lambda self: self._parse_json_value(), 369 "SUBSTR": lambda self: self._parse_substring(), 370 } 371 372 STATEMENT_PARSERS = { 373 **parser.Parser.STATEMENT_PARSERS, 374 TokenType.SHOW: lambda self: self._parse_show(), 375 } 376 377 SHOW_PARSERS = { 378 "BINARY LOGS": _show_parser("BINARY LOGS"), 379 "MASTER LOGS": _show_parser("BINARY LOGS"), 380 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 381 "CHARACTER SET": _show_parser("CHARACTER SET"), 382 "CHARSET": _show_parser("CHARACTER SET"), 383 "COLLATION": _show_parser("COLLATION"), 384 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 385 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 386 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 387 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 388 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 389 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 390 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 391 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 392 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 393 "DATABASES": _show_parser("DATABASES"), 394 "SCHEMAS": _show_parser("DATABASES"), 395 "ENGINE": _show_parser("ENGINE", target=True), 396 "STORAGE ENGINES": _show_parser("ENGINES"), 397 "ENGINES": _show_parser("ENGINES"), 398 "ERRORS": _show_parser("ERRORS"), 399 "EVENTS": _show_parser("EVENTS"), 400 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 401 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 402 "GRANTS": _show_parser("GRANTS", target="FOR"), 403 "INDEX": _show_parser("INDEX", target="FROM"), 404 "MASTER STATUS": _show_parser("MASTER STATUS"), 405 "OPEN TABLES": _show_parser("OPEN TABLES"), 406 "PLUGINS": _show_parser("PLUGINS"), 407 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 408 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 409 "PRIVILEGES": _show_parser("PRIVILEGES"), 410 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 411 "PROCESSLIST": _show_parser("PROCESSLIST"), 412 "PROFILE": _show_parser("PROFILE"), 413 "PROFILES": _show_parser("PROFILES"), 414 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 415 "REPLICAS": _show_parser("REPLICAS"), 416 "SLAVE HOSTS": _show_parser("REPLICAS"), 417 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 418 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 419 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 420 "SESSION STATUS": _show_parser("STATUS"), 421 "STATUS": _show_parser("STATUS"), 422 "TABLE STATUS": _show_parser("TABLE STATUS"), 423 "FULL TABLES": _show_parser("TABLES", full=True), 424 "TABLES": _show_parser("TABLES"), 425 "TRIGGERS": _show_parser("TRIGGERS"), 426 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 427 "SESSION VARIABLES": _show_parser("VARIABLES"), 428 "VARIABLES": _show_parser("VARIABLES"), 429 "WARNINGS": _show_parser("WARNINGS"), 430 } 431 432 PROPERTY_PARSERS = { 433 **parser.Parser.PROPERTY_PARSERS, 434 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 435 } 436 437 SET_PARSERS = { 438 **parser.Parser.SET_PARSERS, 439 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 440 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 441 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 442 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 443 "NAMES": lambda self: self._parse_set_item_names(), 444 } 445 446 CONSTRAINT_PARSERS = { 447 **parser.Parser.CONSTRAINT_PARSERS, 448 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 449 "INDEX": lambda self: self._parse_index_constraint(), 450 "KEY": lambda self: self._parse_index_constraint(), 451 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 452 } 453 454 ALTER_PARSERS = { 455 **parser.Parser.ALTER_PARSERS, 456 "MODIFY": lambda self: self._parse_alter_table_alter(), 457 } 458 459 ALTER_ALTER_PARSERS = { 460 **parser.Parser.ALTER_ALTER_PARSERS, 461 "INDEX": lambda self: self._parse_alter_table_alter_index(), 462 } 463 464 SCHEMA_UNNAMED_CONSTRAINTS = { 465 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 466 "FULLTEXT", 467 "INDEX", 468 "KEY", 469 "SPATIAL", 470 } 471 472 PROFILE_TYPES: parser.OPTIONS_TYPE = { 473 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 474 "BLOCK": ("IO",), 475 "CONTEXT": ("SWITCHES",), 476 "PAGE": ("FAULTS",), 477 } 478 479 TYPE_TOKENS = { 480 *parser.Parser.TYPE_TOKENS, 481 TokenType.SET, 482 } 483 484 ENUM_TYPE_TOKENS = { 485 *parser.Parser.ENUM_TYPE_TOKENS, 486 TokenType.SET, 487 } 488 489 # SELECT [ ALL | DISTINCT | DISTINCTROW ] [ <OPERATION_MODIFIERS> ] 490 OPERATION_MODIFIERS = { 491 "HIGH_PRIORITY", 492 "STRAIGHT_JOIN", 493 "SQL_SMALL_RESULT", 494 "SQL_BIG_RESULT", 495 "SQL_BUFFER_RESULT", 496 "SQL_NO_CACHE", 497 "SQL_CALC_FOUND_ROWS", 498 } 499 500 LOG_DEFAULTS_TO_LN = True 501 STRING_ALIASES = True 502 VALUES_FOLLOWED_BY_PAREN = False 503 SUPPORTS_PARTITION_SELECTION = True 504 505 def _parse_generated_as_identity( 506 self, 507 ) -> ( 508 exp.GeneratedAsIdentityColumnConstraint 509 | exp.ComputedColumnConstraint 510 | exp.GeneratedAsRowColumnConstraint 511 ): 512 this = super()._parse_generated_as_identity() 513 514 if self._match_texts(("STORED", "VIRTUAL")): 515 persisted = self._prev.text.upper() == "STORED" 516 517 if isinstance(this, exp.ComputedColumnConstraint): 518 this.set("persisted", persisted) 519 elif isinstance(this, exp.GeneratedAsIdentityColumnConstraint): 520 this = self.expression( 521 exp.ComputedColumnConstraint, this=this.expression, persisted=persisted 522 ) 523 524 return this 525 526 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 527 this = self._parse_id_var() 528 if not self._match(TokenType.L_PAREN): 529 return this 530 531 expression = self._parse_number() 532 self._match_r_paren() 533 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 534 535 def _parse_index_constraint( 536 self, kind: t.Optional[str] = None 537 ) -> exp.IndexColumnConstraint: 538 if kind: 539 self._match_texts(("INDEX", "KEY")) 540 541 this = self._parse_id_var(any_token=False) 542 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 543 expressions = self._parse_wrapped_csv(self._parse_ordered) 544 545 options = [] 546 while True: 547 if self._match_text_seq("KEY_BLOCK_SIZE"): 548 self._match(TokenType.EQ) 549 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 550 elif self._match(TokenType.USING): 551 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 552 elif self._match_text_seq("WITH", "PARSER"): 553 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 554 elif self._match(TokenType.COMMENT): 555 opt = exp.IndexConstraintOption(comment=self._parse_string()) 556 elif self._match_text_seq("VISIBLE"): 557 opt = exp.IndexConstraintOption(visible=True) 558 elif self._match_text_seq("INVISIBLE"): 559 opt = exp.IndexConstraintOption(visible=False) 560 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 561 self._match(TokenType.EQ) 562 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 563 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 564 self._match(TokenType.EQ) 565 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 566 else: 567 opt = None 568 569 if not opt: 570 break 571 572 options.append(opt) 573 574 return self.expression( 575 exp.IndexColumnConstraint, 576 this=this, 577 expressions=expressions, 578 kind=kind, 579 index_type=index_type, 580 options=options, 581 ) 582 583 def _parse_show_mysql( 584 self, 585 this: str, 586 target: bool | str = False, 587 full: t.Optional[bool] = None, 588 global_: t.Optional[bool] = None, 589 ) -> exp.Show: 590 json = self._match_text_seq("JSON") 591 592 if target: 593 if isinstance(target, str): 594 self._match_text_seq(*target.split(" ")) 595 target_id = self._parse_id_var() 596 else: 597 target_id = None 598 599 log = self._parse_string() if self._match_text_seq("IN") else None 600 601 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 602 position = self._parse_number() if self._match_text_seq("FROM") else None 603 db = None 604 else: 605 position = None 606 db = None 607 608 if self._match(TokenType.FROM): 609 db = self._parse_id_var() 610 elif self._match(TokenType.DOT): 611 db = target_id 612 target_id = self._parse_id_var() 613 614 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 615 616 like = self._parse_string() if self._match_text_seq("LIKE") else None 617 where = self._parse_where() 618 619 if this == "PROFILE": 620 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 621 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 622 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 623 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 624 else: 625 types, query = None, None 626 offset, limit = self._parse_oldstyle_limit() 627 628 mutex = True if self._match_text_seq("MUTEX") else None 629 mutex = False if self._match_text_seq("STATUS") else mutex 630 631 for_table = self._parse_id_var() if self._match_text_seq("FOR", "TABLE") else None 632 for_group = self._parse_string() if self._match_text_seq("FOR", "GROUP") else None 633 for_user = self._parse_string() if self._match_text_seq("FOR", "USER") else None 634 for_role = self._parse_string() if self._match_text_seq("FOR", "ROLE") else None 635 into_outfile = self._parse_string() if self._match_text_seq("INTO", "OUTFILE") else None 636 637 return self.expression( 638 exp.Show, 639 this=this, 640 target=target_id, 641 full=full, 642 log=log, 643 position=position, 644 db=db, 645 channel=channel, 646 like=like, 647 where=where, 648 types=types, 649 query=query, 650 offset=offset, 651 limit=limit, 652 mutex=mutex, 653 for_table=for_table, 654 for_group=for_group, 655 for_user=for_user, 656 for_role=for_role, 657 into_outfile=into_outfile, 658 json=json, 659 **{"global": global_}, # type: ignore 660 ) 661 662 def _parse_oldstyle_limit( 663 self, 664 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 665 limit = None 666 offset = None 667 if self._match_text_seq("LIMIT"): 668 parts = self._parse_csv(self._parse_number) 669 if len(parts) == 1: 670 limit = parts[0] 671 elif len(parts) == 2: 672 limit = parts[1] 673 offset = parts[0] 674 675 return offset, limit 676 677 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 678 this = self._parse_string() or self._parse_unquoted_field() 679 return self.expression(exp.SetItem, this=this, kind=kind) 680 681 def _parse_set_item_names(self) -> exp.Expression: 682 charset = self._parse_string() or self._parse_unquoted_field() 683 if self._match_text_seq("COLLATE"): 684 collate = self._parse_string() or self._parse_unquoted_field() 685 else: 686 collate = None 687 688 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 689 690 def _parse_type( 691 self, parse_interval: bool = True, fallback_to_identifier: bool = False 692 ) -> t.Optional[exp.Expression]: 693 # mysql binary is special and can work anywhere, even in order by operations 694 # it operates like a no paren func 695 if self._match(TokenType.BINARY, advance=False): 696 data_type = self._parse_types(check_func=True, allow_identifiers=False) 697 698 if isinstance(data_type, exp.DataType): 699 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 700 701 return super()._parse_type( 702 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 703 ) 704 705 def _parse_alter_table_alter_index(self) -> exp.AlterIndex: 706 index = self._parse_field(any_token=True) 707 708 if self._match_text_seq("VISIBLE"): 709 visible = True 710 elif self._match_text_seq("INVISIBLE"): 711 visible = False 712 else: 713 visible = None 714 715 return self.expression(exp.AlterIndex, this=index, visible=visible)
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
FUNC_TOKENS =
{<TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.INT: 'INT'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.UUID: 'UUID'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.NESTED: 'NESTED'>, <TokenType.RLIKE: 'RLIKE'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.UINT128: 'UINT128'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.LEFT: 'LEFT'>, <TokenType.RANGE: 'RANGE'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.VALUES: 'VALUES'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.BIT: 'BIT'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.RING: 'RING'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.POINT: 'POINT'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.LIKE: 'LIKE'>, <TokenType.INT256: 'INT256'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.UTC_TIME: 'UTC_TIME'>, <TokenType.MOD: 'MOD'>, <TokenType.UINT256: 'UINT256'>, <TokenType.TIME: 'TIME'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.UTC_TIMESTAMP: 'UTC_TIMESTAMP'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.MERGE: 'MERGE'>, <TokenType.IPV4: 'IPV4'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.UTC_DATE: 'UTC_DATE'>, <TokenType.ALL: 'ALL'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.NULL: 'NULL'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.SOME: 'SOME'>, <TokenType.PRIMARY_KEY: 'PRIMARY_KEY'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.YEAR: 'YEAR'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.IPV6: 'IPV6'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.DATE: 'DATE'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.UINT: 'UINT'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.XOR: 'XOR'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.MONEY: 'MONEY'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.VOID: 'VOID'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.LIST: 'LIST'>, <TokenType.NEXT: 'NEXT'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.BLOB: 'BLOB'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.GLOB: 'GLOB'>, <TokenType.GET: 'GET'>, <TokenType.NAME: 'NAME'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.CHAR: 'CHAR'>, <TokenType.JSONB: 'JSONB'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.GEOGRAPHYPOINT: 'GEOGRAPHYPOINT'>, <TokenType.ENUM: 'ENUM'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.FIRST: 'FIRST'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.ANY: 'ANY'>, <TokenType.INSERT: 'INSERT'>, <TokenType.ILIKE: 'ILIKE'>, <TokenType.MAP: 'MAP'>, <TokenType.DATE32: 'DATE32'>, <TokenType.UNION: 'UNION'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.SUPER: 'SUPER'>, <TokenType.BINARY: 'BINARY'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.INET: 'INET'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.FILTER: 'FILTER'>, <TokenType.XML: 'XML'>, <TokenType.VAR: 'VAR'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.JSON: 'JSON'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.TABLE: 'TABLE'>, <TokenType.ROW: 'ROW'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.INT128: 'INT128'>, <TokenType.TEXT: 'TEXT'>, <TokenType.INDEX: 'INDEX'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.WINDOW: 'WINDOW'>}
CONJUNCTION =
{<TokenType.AND: 'AND'>: <class 'sqlglot.expressions.And'>, <TokenType.DAMP: 'DAMP'>: <class 'sqlglot.expressions.And'>, <TokenType.XOR: 'XOR'>: <class 'sqlglot.expressions.Xor'>}
DISJUNCTION =
{<TokenType.OR: 'OR'>: <class 'sqlglot.expressions.Or'>, <TokenType.DPIPE: 'DPIPE'>: <class 'sqlglot.expressions.Or'>}
TABLE_ALIAS_TOKENS =
{<TokenType.REFERENCES: 'REFERENCES'>, <TokenType.SEMANTIC_VIEW: 'SEMANTIC_VIEW'>, <TokenType.APPLY: 'APPLY'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.INT: 'INT'>, <TokenType.KEEP: 'KEEP'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.UUID: 'UUID'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.NESTED: 'NESTED'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.UINT128: 'UINT128'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.RANGE: 'RANGE'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.CASE: 'CASE'>, <TokenType.DELETE: 'DELETE'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.BIT: 'BIT'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.ROWS: 'ROWS'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.RING: 'RING'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.DIV: 'DIV'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.CUBE: 'CUBE'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.IS: 'IS'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.POINT: 'POINT'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.FILE_FORMAT: 'FILE_FORMAT'>, <TokenType.SESSION: 'SESSION'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.INT256: 'INT256'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.FALSE: 'FALSE'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.RENAME: 'RENAME'>, <TokenType.UINT256: 'UINT256'>, <TokenType.TIME: 'TIME'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.SEMI: 'SEMI'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.MERGE: 'MERGE'>, <TokenType.IPV4: 'IPV4'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.ALL: 'ALL'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.END: 'END'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.MODEL: 'MODEL'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.DETACH: 'DETACH'>, <TokenType.SHOW: 'SHOW'>, <TokenType.NULL: 'NULL'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.ANTI: 'ANTI'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.CACHE: 'CACHE'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.TAG: 'TAG'>, <TokenType.SOME: 'SOME'>, <TokenType.VIEW: 'VIEW'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.COPY: 'COPY'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.YEAR: 'YEAR'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.IPV6: 'IPV6'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.DATE: 'DATE'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.UINT: 'UINT'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.MONEY: 'MONEY'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.VOID: 'VOID'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.PUT: 'PUT'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.LIST: 'LIST'>, <TokenType.NEXT: 'NEXT'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.BLOB: 'BLOB'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.GET: 'GET'>, <TokenType.NAME: 'NAME'>, <TokenType.DESC: 'DESC'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.SET: 'SET'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.CHAR: 'CHAR'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.JSONB: 'JSONB'>, <TokenType.FINAL: 'FINAL'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.GEOGRAPHYPOINT: 'GEOGRAPHYPOINT'>, <TokenType.ENUM: 'ENUM'>, <TokenType.FIRST: 'FIRST'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.ANY: 'ANY'>, <TokenType.MAP: 'MAP'>, <TokenType.DATE32: 'DATE32'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.KILL: 'KILL'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.SUPER: 'SUPER'>, <TokenType.TRUE: 'TRUE'>, <TokenType.BINARY: 'BINARY'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.INET: 'INET'>, <TokenType.SINK: 'SINK'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.FILTER: 'FILTER'>, <TokenType.TOP: 'TOP'>, <TokenType.VAR: 'VAR'>, <TokenType.STAGE: 'STAGE'>, <TokenType.XML: 'XML'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.ASC: 'ASC'>, <TokenType.JSON: 'JSON'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.TABLE: 'TABLE'>, <TokenType.ROW: 'ROW'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.INT128: 'INT128'>, <TokenType.TEXT: 'TEXT'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.INDEX: 'INDEX'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.LOAD: 'LOAD'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>}
RANGE_PARSERS =
{<TokenType.AT_GT: 'AT_GT'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.BETWEEN: 'BETWEEN'>: <function Parser.<lambda>>, <TokenType.GLOB: 'GLOB'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ILIKE: 'ILIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IN: 'IN'>: <function Parser.<lambda>>, <TokenType.IRLIKE: 'IRLIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IS: 'IS'>: <function Parser.<lambda>>, <TokenType.LIKE: 'LIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.LT_AT: 'LT_AT'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.OVERLAPS: 'OVERLAPS'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.RLIKE: 'RLIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.SIMILAR_TO: 'SIMILAR_TO'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.FOR: 'FOR'>: <function Parser.<lambda>>, <TokenType.QMARK_AMP: 'QMARK_AMP'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.QMARK_PIPE: 'QMARK_PIPE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.HASH_DASH: 'HASH_DASH'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.SOUNDS_LIKE: 'SOUNDS_LIKE'>: <function MySQL.Parser.<lambda>>, <TokenType.MEMBER_OF: 'MEMBER_OF'>: <function MySQL.Parser.<lambda>>}
FUNCTIONS =
{'AI_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AIAgg'>>, 'AI_CLASSIFY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AIClassify'>>, 'AI_SUMMARIZE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AISummarizeAgg'>>, 'ABS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Abs'>>, 'ACOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Acos'>>, 'ACOSH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Acosh'>>, 'ADD_MONTHS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AddMonths'>>, 'AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.And'>>, 'ANONYMOUS_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AnonymousAggFunc'>>, 'ANY_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AnyValue'>>, 'APPLY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Apply'>>, 'APPROX_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxDistinct'>>, 'APPROX_COUNT_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxDistinct'>>, 'APPROX_QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxQuantile'>>, 'APPROX_QUANTILES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxQuantiles'>>, 'APPROX_TOP_K': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxTopK'>>, 'APPROX_TOP_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxTopSum'>>, 'ARG_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'ARGMAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'MAX_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'ARG_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'ARGMIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'MIN_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'ARRAY': <function Parser.<lambda>>, 'ARRAY_AGG': <function Parser.<lambda>>, 'ARRAY_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayAll'>>, 'ARRAY_ANY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayAny'>>, 'ARRAY_CONCAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConcat'>>, 'ARRAY_CAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConcat'>>, 'ARRAY_CONCAT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConcatAgg'>>, 'ARRAY_CONSTRUCT_COMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConstructCompact'>>, 'ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContains'>>, 'ARRAY_HAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContains'>>, 'ARRAY_CONTAINS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContainsAll'>>, 'ARRAY_HAS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContainsAll'>>, 'FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayFilter'>>, 'ARRAY_FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayFilter'>>, 'ARRAY_FIRST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayFirst'>>, 'ARRAY_INTERSECT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayIntersect'>>, 'ARRAY_INTERSECTION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayIntersect'>>, 'ARRAY_LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayLast'>>, 'ARRAY_OVERLAPS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayOverlaps'>>, 'ARRAY_REMOVE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayRemove'>>, 'ARRAY_REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayReverse'>>, 'ARRAY_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySize'>>, 'ARRAY_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySize'>>, 'ARRAY_SLICE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySlice'>>, 'ARRAY_SORT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySort'>>, 'ARRAY_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySum'>>, 'ARRAY_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayToString'>>, 'ARRAY_JOIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayToString'>>, 'ARRAY_UNION_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayUnionAgg'>>, 'ARRAY_UNIQUE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayUniqueAgg'>>, 'ASCII': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ascii'>>, 'ASIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Asin'>>, 'ASINH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Asinh'>>, 'ATAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Atan'>>, 'ATAN2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Atan2'>>, 'ATANH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Atanh'>>, 'AVG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Avg'>>, 'BITWISE_AND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseAndAgg'>>, 'BITWISE_COUNT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseCountAgg'>>, 'BITWISE_OR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseOrAgg'>>, 'BITWISE_XOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseXorAgg'>>, 'BYTE_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ByteLength'>>, 'CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Case'>>, 'CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cast'>>, 'CAST_TO_STR_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CastToStrType'>>, 'CBRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cbrt'>>, 'CEIL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ceil'>>, 'CEILING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ceil'>>, 'CHR': <function Parser.<lambda>>, 'CHAR': <function Parser.<lambda>>, '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.CodePointsToBytes'>>, 'CODE_POINTS_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CodePointsToString'>>, 'COLLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Collate'>>, 'COLUMNS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Columns'>>, 'COMBINED_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CombinedAggFunc'>>, 'COMBINED_PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CombinedParameterizedAgg'>>, 'CONCAT': <function Parser.<lambda>>, 'CONCAT_WS': <function Parser.<lambda>>, 'CONNECT_BY_ROOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ConnectByRoot'>>, 'CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Contains'>>, 'CONVERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Convert'>>, 'CONVERT_TIMEZONE': <function build_convert_timezone>, 'CONVERT_TO_CHARSET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ConvertToCharset'>>, 'CORR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Corr'>>, 'COSINE_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CosineDistance'>>, 'COT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cot'>>, 'COTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Coth'>>, 'COUNT': <function Parser.<lambda>>, 'COUNT_IF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CountIf'>>, 'COUNTIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CountIf'>>, 'COVAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CovarPop'>>, 'COVAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CovarSamp'>>, 'CSC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Csc'>>, 'CSCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Csch'>>, 'CUME_DIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CumeDist'>>, 'CURRENT_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentDate'>>, 'CURRENT_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentDatetime'>>, 'CURRENT_SCHEMA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentSchema'>>, 'CURRENT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTime'>>, 'CURRENT_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTimestamp'>>, 'CURRENT_TIMESTAMP_L_T_Z': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTimestampLTZ'>>, 'CURRENT_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentUser'>>, 'DATE': <function MySQL.Parser.<lambda>>, 'DATE_ADD': <function build_date_delta_with_interval.<locals>._builder>, 'DATE_BIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateBin'>>, 'DATEDIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateDiff'>>, 'DATE_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateDiff'>>, 'DATE_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromParts'>>, 'DATEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromParts'>>, 'DATE_FROM_UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromUnixDate'>>, 'DATE_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateStrToDate'>>, 'DATE_SUB': <function build_date_delta_with_interval.<locals>._builder>, 'DATE_TO_DATE_STR': <function Parser.<lambda>>, 'DATE_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateToDi'>>, 'DATE_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateTrunc'>>, 'DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Datetime'>>, 'DATETIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeAdd'>>, 'DATETIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeDiff'>>, 'DATETIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeSub'>>, 'DATETIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeTrunc'>>, 'DAY': <function MySQL.Parser.<lambda>>, 'DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfMonth'>>, 'DAYOFMONTH': <function MySQL.Parser.<lambda>>, 'DAY_OF_WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfWeek'>>, 'DAYOFWEEK': <function MySQL.Parser.<lambda>>, 'DAYOFWEEK_ISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfWeekIso'>>, 'ISODOW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfWeekIso'>>, 'DAY_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfYear'>>, 'DAYOFYEAR': <function MySQL.Parser.<lambda>>, 'DECODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Decode'>>, 'DECODE_CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DecodeCase'>>, 'DENSE_RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DenseRank'>>, 'DI_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DiToDate'>>, 'ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Encode'>>, 'ENDS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.EndsWith'>>, 'ENDSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.EndsWith'>>, 'EUCLIDEAN_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.EuclideanDistance'>>, 'EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Exists'>>, 'EXP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Exp'>>, 'EXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Explode'>>, 'EXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ExplodeOuter'>>, 'EXPLODING_GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ExplodingGenerateSeries'>>, 'EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Extract'>>, 'FARM_FINGERPRINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FarmFingerprint'>>, 'FARMFINGERPRINT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FarmFingerprint'>>, 'FEATURES_AT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FeaturesAtTime'>>, 'FIRST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.First'>>, 'FIRST_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FirstValue'>>, 'FLATTEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Flatten'>>, 'FLOAT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Float64'>>, 'FLOOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Floor'>>, 'FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NumberToStr'>>, 'FROM_BASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase'>>, 'FROM_BASE32': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase32'>>, 'FROM_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase64'>>, 'FROM_ISO8601_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromISO8601Timestamp'>>, 'GAP_FILL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GapFill'>>, 'GENERATE_DATE_ARRAY': <function Parser.<lambda>>, 'GENERATE_EMBEDDING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GenerateEmbedding'>>, 'GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GenerateSeries'>>, 'GENERATE_TIMESTAMP_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GenerateTimestampArray'>>, 'GET_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GetExtract'>>, 'GREATEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Greatest'>>, 'GROUP_CONCAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GroupConcat'>>, 'GROUPING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Grouping'>>, 'HEX': <function build_hex>, 'HLL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Hll'>>, 'IF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.If'>>, 'IIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.If'>>, 'INITCAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Initcap'>>, 'INLINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Inline'>>, 'INT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Int64'>>, 'IS_ASCII': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsAscii'>>, 'IS_INF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsInf'>>, 'ISINF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsInf'>>, 'IS_NAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsNan'>>, 'ISNAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsNan'>>, 'J_S_O_N_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArray'>>, 'J_S_O_N_ARRAY_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayAgg'>>, 'JSON_ARRAY_APPEND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayAppend'>>, 'JSON_ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayContains'>>, 'JSON_ARRAY_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayInsert'>>, 'JSONB_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBContains'>>, 'J_S_O_N_B_CONTAINS_ALL_TOP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBContainsAllTopKeys'>>, 'J_S_O_N_B_CONTAINS_ANY_TOP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBContainsAnyTopKeys'>>, 'J_S_O_N_B_DELETE_AT_PATH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBDeleteAtPath'>>, 'JSONB_EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBExists'>>, 'JSONB_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBExtract'>>, 'JSONB_EXTRACT_SCALAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBExtractScalar'>>, 'J_S_O_N_B_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBObjectAgg'>>, 'J_S_O_N_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBool'>>, 'J_S_O_N_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONCast'>>, 'J_S_O_N_EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONExists'>>, 'JSON_EXTRACT': <function build_extract_json_with_path.<locals>._builder>, 'JSON_EXTRACT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONExtractArray'>>, 'JSON_EXTRACT_SCALAR': <function build_extract_json_with_path.<locals>._builder>, 'JSON_FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONFormat'>>, 'J_S_O_N_KEYS_AT_DEPTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONKeysAtDepth'>>, 'J_S_O_N_OBJECT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONObject'>>, 'J_S_O_N_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONObjectAgg'>>, 'JSON_REMOVE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONRemove'>>, 'JSON_SET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONSet'>>, 'JSON_STRIP_NULLS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONStripNulls'>>, 'J_S_O_N_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONTable'>>, 'JSON_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONType'>>, 'J_S_O_N_VALUE_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONValueArray'>>, 'JUSTIFY_DAYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JustifyDays'>>, 'JUSTIFY_HOURS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JustifyHours'>>, 'JUSTIFY_INTERVAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JustifyInterval'>>, 'LAG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lag'>>, 'LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Last'>>, 'LAST_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LastDay'>>, 'LAST_DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LastDay'>>, 'LAST_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LastValue'>>, 'LAX_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LaxBool'>>, 'LAX_FLOAT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LaxFloat64'>>, 'LAX_INT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LaxInt64'>>, 'LAX_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LaxString'>>, 'LEAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lead'>>, 'LEAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Least'>>, 'LEFT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Left'>>, 'LENGTH': <function MySQL.Parser.<lambda>>, 'LEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'CHAR_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'CHARACTER_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'LEVENSHTEIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Levenshtein'>>, 'LIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.List'>>, 'LN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ln'>>, 'LOG': <function build_logarithm>, 'LOGICAL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'BOOL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'BOOLAND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'LOGICAL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'BOOL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'BOOLOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'LOWER': <function build_lower>, 'LCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lower'>>, 'LOWER_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LowerHex'>>, 'MD5': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5'>>, 'MD5_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5Digest'>>, 'M_D5_NUMBER_LOWER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5NumberLower64'>>, 'M_D5_NUMBER_UPPER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5NumberUpper64'>>, 'M_L_FORECAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MLForecast'>>, 'M_L_TRANSLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MLTranslate'>>, 'MAKE_INTERVAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MakeInterval'>>, 'MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Map'>>, 'MAP_FROM_ENTRIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MapFromEntries'>>, 'MATCH_AGAINST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MatchAgainst'>>, 'MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Max'>>, 'MEDIAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Median'>>, 'MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Min'>>, 'MONTH': <function MySQL.Parser.<lambda>>, 'MONTHS_BETWEEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MonthsBetween'>>, 'NEXT_VALUE_FOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NextValueFor'>>, 'NORMALIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Normalize'>>, 'NTH_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NthValue'>>, 'NTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ntile'>>, 'NULLIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Nullif'>>, 'NUMBER_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NumberToStr'>>, 'NVL2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Nvl2'>>, 'OBJECT_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ObjectInsert'>>, 'OPEN_J_S_O_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.OpenJSON'>>, 'OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Or'>>, 'OVERLAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Overlay'>>, 'PAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pad'>>, 'PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParameterizedAgg'>>, 'PARSE_BIGNUMERIC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseBignumeric'>>, 'PARSE_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseDatetime'>>, 'PARSE_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseJSON'>>, 'JSON_PARSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseJSON'>>, 'PARSE_NUMERIC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseNumeric'>>, 'PARSE_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseTime'>>, 'PERCENT_RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PercentRank'>>, 'PERCENTILE_CONT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PercentileCont'>>, 'PERCENTILE_DISC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PercentileDisc'>>, 'POSEXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Posexplode'>>, 'POSEXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PosexplodeOuter'>>, 'POWER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pow'>>, 'POW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pow'>>, 'PREDICT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Predict'>>, 'QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Quantile'>>, 'QUARTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Quarter'>>, 'RAND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rand'>>, 'RANDOM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rand'>>, 'RANDN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Randn'>>, 'RANGE_BUCKET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RangeBucket'>>, 'RANGE_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RangeN'>>, 'RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rank'>>, 'READ_CSV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ReadCSV'>>, 'REDUCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Reduce'>>, 'REGEXP_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpExtract'>>, 'REGEXP_EXTRACT_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpExtractAll'>>, 'REGEXP_I_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpILike'>>, 'REGEXP_INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpInstr'>>, 'REGEXP_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpLike'>>, 'REGEXP_REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpReplace'>>, 'REGEXP_SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpSplit'>>, 'REPEAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Repeat'>>, 'REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Replace'>>, 'REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Reverse'>>, 'RIGHT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Right'>>, 'ROUND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Round'>>, 'ROW_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RowNumber'>>, 'SHA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'S_H_A1_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA1Digest'>>, 'SHA2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA2'>>, 'S_H_A2_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA2Digest'>>, 'SAFE_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeAdd'>>, 'SAFE_CONVERT_BYTES_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeConvertBytesToString'>>, 'SAFE_DIVIDE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeDivide'>>, 'SAFE_MULTIPLY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeMultiply'>>, 'SAFE_NEGATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeNegate'>>, 'SAFE_SUBTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeSubtract'>>, 'SEC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sec'>>, 'SECH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sech'>>, 'SIGN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SIGNUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sin'>>, 'SINH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sinh'>>, 'SORT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SortArray'>>, 'SOUNDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Soundex'>>, 'SPACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Space'>>, 'SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Split'>>, 'SPLIT_PART': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SplitPart'>>, 'SQRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sqrt'>>, 'ST_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StDistance'>>, 'ST_POINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StPoint'>>, 'ST_MAKEPOINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StPoint'>>, 'STANDARD_HASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StandardHash'>>, 'STAR_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StarMap'>>, 'STARTS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STARTSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STDDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDDEV_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevPop'>>, 'STDDEV_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevSamp'>>, 'STR_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrPosition'>>, 'STR_TO_DATE': <function _str_to_date>, 'STR_TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToMap'>>, 'STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToTime'>>, 'STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToUnix'>>, 'STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.String'>>, 'STRING_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'SPLIT_BY_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'STRTOK_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'STRUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Struct'>>, 'STRUCT_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StructExtract'>>, 'STUFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'SUBSTRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Substring'>>, 'SUBSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Substring'>>, 'SUBSTRING_INDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SubstringIndex'>>, 'SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sum'>>, 'TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Time'>>, 'TIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeAdd'>>, 'TIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeDiff'>>, 'TIME_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'TIMEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'TIME_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToDate'>>, 'TIME_STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToTime'>>, 'TIME_STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToUnix'>>, 'TIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeSub'>>, 'TIME_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeToStr'>>, 'TIME_TO_TIME_STR': <function Parser.<lambda>>, 'TIME_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeToUnix'>>, 'TIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeTrunc'>>, 'TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Timestamp'>>, 'TIMESTAMP_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampAdd'>>, 'TIMESTAMPDIFF': <function build_date_delta.<locals>._builder>, 'TIMESTAMP_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampDiff'>>, 'TIMESTAMP_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampFromParts'>>, 'TIMESTAMPFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampFromParts'>>, 'TIMESTAMP_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampSub'>>, 'TIMESTAMP_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampTrunc'>>, 'TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToArray'>>, 'TO_BASE32': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToBase32'>>, 'TO_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToBase64'>>, 'TO_CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToChar'>>, 'TO_CODE_POINTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToCodePoints'>>, 'TO_DAYS': <function MySQL.Parser.<lambda>>, 'TO_DOUBLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToDouble'>>, 'TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToMap'>>, 'TO_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToNumber'>>, 'TRANSFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Transform'>>, 'TRANSLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Translate'>>, 'TRIM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Trim'>>, 'TRY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Try'>>, 'TRY_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryCast'>>, 'TS_OR_DI_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDiToDi'>>, 'TS_OR_DS_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsAdd'>>, 'TS_OR_DS_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsDiff'>>, 'TS_OR_DS_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.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.TsOrDsToDatetime'>>, 'TS_OR_DS_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToTime'>>, 'TS_OR_DS_TO_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToTimestamp'>>, 'TYPEOF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Typeof'>>, 'UNHEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Unhex'>>, 'UNICODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Unicode'>>, 'UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixDate'>>, 'UNIX_MICROS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixMicros'>>, 'UNIX_MILLIS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixMillis'>>, 'UNIX_SECONDS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixSeconds'>>, 'UNIX_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToStr'>>, 'UNIX_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToTime'>>, 'UNIX_TO_TIME_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToTimeStr'>>, 'UNNEST': <function Parser.<lambda>>, 'UPPER': <function build_upper>, 'UCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Upper'>>, 'UTC_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UtcDate'>>, 'UTC_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UtcTime'>>, 'UTC_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UtcTimestamp'>>, 'UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'GEN_RANDOM_UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'GENERATE_UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'UUID_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'VAR_MAP': <function build_var_map>, 'VARIANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VARIANCE_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VARIANCE_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VariancePop'>>, 'VAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VariancePop'>>, 'VECTOR_SEARCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VectorSearch'>>, 'WEEK': <function MySQL.Parser.<lambda>>, 'WEEK_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.WeekOfYear'>>, 'WEEKOFYEAR': <function MySQL.Parser.<lambda>>, 'XMLELEMENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.XMLElement'>>, 'X_M_L_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.XMLTable'>>, 'XOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Xor'>>, 'YEAR': <function MySQL.Parser.<lambda>>, '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.StrPosition'>>, 'CHARINDEX': <function Parser.<lambda>>, 'INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrPosition'>>, 'LOCATE': <function Parser.<lambda>>, 'TO_HEX': <function build_hex>, 'BIT_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseAndAgg'>>, 'BIT_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseOrAgg'>>, 'BIT_XOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseXorAgg'>>, 'BIT_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseCountAgg'>>, 'CONVERT_TZ': <function MySQL.Parser.<lambda>>, 'CURDATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentDate'>>, 'DATE_FORMAT': <function build_formatted_time.<locals>._builder>, 'FROM_UNIXTIME': <function build_formatted_time.<locals>._builder>, 'ISNULL': <function isnull_to_is_null>, 'MAKETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'MONTHNAME': <function MySQL.Parser.<lambda>>, 'SCHEMA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentSchema'>>, 'DATABASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentSchema'>>}
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>>, 'DECODE': <function Parser.<lambda>>, 'EXTRACT': <function Parser.<lambda>>, 'FLOOR': <function Parser.<lambda>>, 'GAP_FILL': <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>>, 'CHAR': <function MySQL.Parser.<lambda>>, 'GROUP_CONCAT': <function MySQL.Parser.<lambda>>, 'VALUES': <function MySQL.Parser.<lambda>>, 'JSON_VALUE': <function MySQL.Parser.<lambda>>, 'SUBSTR': <function MySQL.Parser.<lambda>>}
STATEMENT_PARSERS =
{<TokenType.ALTER: 'ALTER'>: <function Parser.<lambda>>, <TokenType.ANALYZE: 'ANALYZE'>: <function Parser.<lambda>>, <TokenType.BEGIN: 'BEGIN'>: <function Parser.<lambda>>, <TokenType.CACHE: 'CACHE'>: <function Parser.<lambda>>, <TokenType.COMMENT: 'COMMENT'>: <function Parser.<lambda>>, <TokenType.COMMIT: 'COMMIT'>: <function Parser.<lambda>>, <TokenType.COPY: 'COPY'>: <function Parser.<lambda>>, <TokenType.CREATE: 'CREATE'>: <function Parser.<lambda>>, <TokenType.DELETE: 'DELETE'>: <function Parser.<lambda>>, <TokenType.DESC: 'DESC'>: <function Parser.<lambda>>, <TokenType.DESCRIBE: 'DESCRIBE'>: <function Parser.<lambda>>, <TokenType.DROP: 'DROP'>: <function Parser.<lambda>>, <TokenType.GRANT: 'GRANT'>: <function Parser.<lambda>>, <TokenType.REVOKE: 'REVOKE'>: <function Parser.<lambda>>, <TokenType.INSERT: 'INSERT'>: <function Parser.<lambda>>, <TokenType.KILL: 'KILL'>: <function Parser.<lambda>>, <TokenType.LOAD: 'LOAD'>: <function Parser.<lambda>>, <TokenType.MERGE: 'MERGE'>: <function Parser.<lambda>>, <TokenType.PIVOT: 'PIVOT'>: <function Parser.<lambda>>, <TokenType.PRAGMA: 'PRAGMA'>: <function Parser.<lambda>>, <TokenType.REFRESH: 'REFRESH'>: <function Parser.<lambda>>, <TokenType.ROLLBACK: 'ROLLBACK'>: <function Parser.<lambda>>, <TokenType.SET: 'SET'>: <function Parser.<lambda>>, <TokenType.TRUNCATE: 'TRUNCATE'>: <function Parser.<lambda>>, <TokenType.UNCACHE: 'UNCACHE'>: <function Parser.<lambda>>, <TokenType.UNPIVOT: 'UNPIVOT'>: <function Parser.<lambda>>, <TokenType.UPDATE: 'UPDATE'>: <function Parser.<lambda>>, <TokenType.USE: 'USE'>: <function Parser.<lambda>>, <TokenType.SEMICOLON: 'SEMICOLON'>: <function Parser.<lambda>>, <TokenType.SHOW: 'SHOW'>: <function MySQL.Parser.<lambda>>}
SHOW_PARSERS =
{'BINARY LOGS': <function _show_parser.<locals>._parse>, 'MASTER LOGS': <function _show_parser.<locals>._parse>, 'BINLOG EVENTS': <function _show_parser.<locals>._parse>, 'CHARACTER SET': <function _show_parser.<locals>._parse>, 'CHARSET': <function _show_parser.<locals>._parse>, 'COLLATION': <function _show_parser.<locals>._parse>, 'FULL COLUMNS': <function _show_parser.<locals>._parse>, 'COLUMNS': <function _show_parser.<locals>._parse>, 'CREATE DATABASE': <function _show_parser.<locals>._parse>, 'CREATE EVENT': <function _show_parser.<locals>._parse>, 'CREATE FUNCTION': <function _show_parser.<locals>._parse>, 'CREATE PROCEDURE': <function _show_parser.<locals>._parse>, 'CREATE TABLE': <function _show_parser.<locals>._parse>, 'CREATE TRIGGER': <function _show_parser.<locals>._parse>, 'CREATE VIEW': <function _show_parser.<locals>._parse>, 'DATABASES': <function _show_parser.<locals>._parse>, 'SCHEMAS': <function _show_parser.<locals>._parse>, 'ENGINE': <function _show_parser.<locals>._parse>, 'STORAGE ENGINES': <function _show_parser.<locals>._parse>, 'ENGINES': <function _show_parser.<locals>._parse>, 'ERRORS': <function _show_parser.<locals>._parse>, 'EVENTS': <function _show_parser.<locals>._parse>, 'FUNCTION CODE': <function _show_parser.<locals>._parse>, 'FUNCTION STATUS': <function _show_parser.<locals>._parse>, 'GRANTS': <function _show_parser.<locals>._parse>, 'INDEX': <function _show_parser.<locals>._parse>, 'MASTER STATUS': <function _show_parser.<locals>._parse>, 'OPEN TABLES': <function _show_parser.<locals>._parse>, 'PLUGINS': <function _show_parser.<locals>._parse>, 'PROCEDURE CODE': <function _show_parser.<locals>._parse>, 'PROCEDURE STATUS': <function _show_parser.<locals>._parse>, 'PRIVILEGES': <function _show_parser.<locals>._parse>, 'FULL PROCESSLIST': <function _show_parser.<locals>._parse>, 'PROCESSLIST': <function _show_parser.<locals>._parse>, 'PROFILE': <function _show_parser.<locals>._parse>, 'PROFILES': <function _show_parser.<locals>._parse>, 'RELAYLOG EVENTS': <function _show_parser.<locals>._parse>, 'REPLICAS': <function _show_parser.<locals>._parse>, 'SLAVE HOSTS': <function _show_parser.<locals>._parse>, 'REPLICA STATUS': <function _show_parser.<locals>._parse>, 'SLAVE STATUS': <function _show_parser.<locals>._parse>, 'GLOBAL STATUS': <function _show_parser.<locals>._parse>, 'SESSION STATUS': <function _show_parser.<locals>._parse>, 'STATUS': <function _show_parser.<locals>._parse>, 'TABLE STATUS': <function _show_parser.<locals>._parse>, 'FULL TABLES': <function _show_parser.<locals>._parse>, 'TABLES': <function _show_parser.<locals>._parse>, 'TRIGGERS': <function _show_parser.<locals>._parse>, 'GLOBAL VARIABLES': <function _show_parser.<locals>._parse>, 'SESSION VARIABLES': <function _show_parser.<locals>._parse>, 'VARIABLES': <function _show_parser.<locals>._parse>, 'WARNINGS': <function _show_parser.<locals>._parse>}
PROPERTY_PARSERS =
{'ALLOWED_VALUES': <function Parser.<lambda>>, 'ALGORITHM': <function Parser.<lambda>>, 'AUTO': <function Parser.<lambda>>, 'AUTO_INCREMENT': <function Parser.<lambda>>, 'BACKUP': <function Parser.<lambda>>, 'BLOCKCOMPRESSION': <function Parser.<lambda>>, 'CHARSET': <function Parser.<lambda>>, 'CHARACTER SET': <function Parser.<lambda>>, 'CHECKSUM': <function Parser.<lambda>>, 'CLUSTER BY': <function Parser.<lambda>>, 'CLUSTERED': <function Parser.<lambda>>, 'COLLATE': <function Parser.<lambda>>, 'COMMENT': <function Parser.<lambda>>, 'CONTAINS': <function Parser.<lambda>>, 'COPY': <function Parser.<lambda>>, 'DATABLOCKSIZE': <function Parser.<lambda>>, 'DATA_DELETION': <function Parser.<lambda>>, 'DEFINER': <function Parser.<lambda>>, 'DETERMINISTIC': <function Parser.<lambda>>, 'DISTRIBUTED': <function Parser.<lambda>>, 'DUPLICATE': <function Parser.<lambda>>, 'DYNAMIC': <function Parser.<lambda>>, 'DISTKEY': <function Parser.<lambda>>, 'DISTSTYLE': <function Parser.<lambda>>, 'EMPTY': <function Parser.<lambda>>, 'ENGINE': <function Parser.<lambda>>, 'ENVIRONMENT': <function Parser.<lambda>>, 'EXECUTE': <function Parser.<lambda>>, 'EXTERNAL': <function Parser.<lambda>>, 'FALLBACK': <function Parser.<lambda>>, 'FORMAT': <function Parser.<lambda>>, 'FREESPACE': <function Parser.<lambda>>, 'GLOBAL': <function Parser.<lambda>>, 'HEAP': <function Parser.<lambda>>, 'ICEBERG': <function Parser.<lambda>>, 'IMMUTABLE': <function Parser.<lambda>>, 'INHERITS': <function Parser.<lambda>>, 'INPUT': <function Parser.<lambda>>, 'JOURNAL': <function Parser.<lambda>>, 'LANGUAGE': <function Parser.<lambda>>, 'LAYOUT': <function Parser.<lambda>>, 'LIFETIME': <function Parser.<lambda>>, 'LIKE': <function Parser.<lambda>>, 'LOCATION': <function Parser.<lambda>>, 'LOCK': <function MySQL.Parser.<lambda>>, 'LOCKING': <function Parser.<lambda>>, 'LOG': <function Parser.<lambda>>, 'MATERIALIZED': <function Parser.<lambda>>, 'MERGEBLOCKRATIO': <function Parser.<lambda>>, 'MODIFIES': <function Parser.<lambda>>, 'MULTISET': <function Parser.<lambda>>, 'NO': <function Parser.<lambda>>, 'ON': <function Parser.<lambda>>, 'ORDER BY': <function Parser.<lambda>>, 'OUTPUT': <function Parser.<lambda>>, 'PARTITION': <function Parser.<lambda>>, 'PARTITION BY': <function Parser.<lambda>>, 'PARTITIONED BY': <function Parser.<lambda>>, 'PARTITIONED_BY': <function Parser.<lambda>>, 'PRIMARY KEY': <function Parser.<lambda>>, 'RANGE': <function Parser.<lambda>>, 'READS': <function Parser.<lambda>>, 'REMOTE': <function Parser.<lambda>>, 'RETURNS': <function Parser.<lambda>>, 'STRICT': <function Parser.<lambda>>, 'STREAMING': <function Parser.<lambda>>, 'ROW': <function Parser.<lambda>>, 'ROW_FORMAT': <function Parser.<lambda>>, 'SAMPLE': <function Parser.<lambda>>, 'SECURE': <function Parser.<lambda>>, 'SECURITY': <function Parser.<lambda>>, 'SET': <function Parser.<lambda>>, 'SETTINGS': <function Parser.<lambda>>, 'SHARING': <function Parser.<lambda>>, 'SORTKEY': <function Parser.<lambda>>, 'SOURCE': <function Parser.<lambda>>, 'STABLE': <function Parser.<lambda>>, 'STORED': <function Parser.<lambda>>, 'SYSTEM_VERSIONING': <function Parser.<lambda>>, 'TBLPROPERTIES': <function Parser.<lambda>>, 'TEMP': <function Parser.<lambda>>, 'TEMPORARY': <function Parser.<lambda>>, 'TO': <function Parser.<lambda>>, 'TRANSIENT': <function Parser.<lambda>>, 'TRANSFORM': <function Parser.<lambda>>, 'TTL': <function Parser.<lambda>>, 'USING': <function Parser.<lambda>>, 'UNLOGGED': <function Parser.<lambda>>, 'VOLATILE': <function Parser.<lambda>>, 'WITH': <function Parser.<lambda>>}
SET_PARSERS =
{'GLOBAL': <function Parser.<lambda>>, 'LOCAL': <function Parser.<lambda>>, 'SESSION': <function Parser.<lambda>>, 'TRANSACTION': <function Parser.<lambda>>, 'PERSIST': <function MySQL.Parser.<lambda>>, 'PERSIST_ONLY': <function MySQL.Parser.<lambda>>, 'CHARACTER SET': <function MySQL.Parser.<lambda>>, 'CHARSET': <function MySQL.Parser.<lambda>>, 'NAMES': <function MySQL.Parser.<lambda>>}
CONSTRAINT_PARSERS =
{'AUTOINCREMENT': <function Parser.<lambda>>, 'AUTO_INCREMENT': <function Parser.<lambda>>, 'CASESPECIFIC': <function Parser.<lambda>>, 'CHARACTER SET': <function Parser.<lambda>>, 'CHECK': <function Parser.<lambda>>, 'COLLATE': <function Parser.<lambda>>, 'COMMENT': <function Parser.<lambda>>, 'COMPRESS': <function Parser.<lambda>>, 'CLUSTERED': <function Parser.<lambda>>, 'NONCLUSTERED': <function Parser.<lambda>>, 'DEFAULT': <function Parser.<lambda>>, 'ENCODE': <function Parser.<lambda>>, 'EPHEMERAL': <function Parser.<lambda>>, 'EXCLUDE': <function Parser.<lambda>>, 'FOREIGN KEY': <function Parser.<lambda>>, 'FORMAT': <function Parser.<lambda>>, 'GENERATED': <function Parser.<lambda>>, 'IDENTITY': <function Parser.<lambda>>, 'INLINE': <function Parser.<lambda>>, 'LIKE': <function Parser.<lambda>>, 'NOT': <function Parser.<lambda>>, 'NULL': <function Parser.<lambda>>, 'ON': <function Parser.<lambda>>, 'PATH': <function Parser.<lambda>>, 'PERIOD': <function Parser.<lambda>>, 'PRIMARY KEY': <function Parser.<lambda>>, 'REFERENCES': <function Parser.<lambda>>, 'TITLE': <function Parser.<lambda>>, 'TTL': <function Parser.<lambda>>, 'UNIQUE': <function Parser.<lambda>>, 'UPPERCASE': <function Parser.<lambda>>, 'WATERMARK': <function Parser.<lambda>>, 'WITH': <function Parser.<lambda>>, 'BUCKET': <function Parser.<lambda>>, 'TRUNCATE': <function Parser.<lambda>>, 'FULLTEXT': <function MySQL.Parser.<lambda>>, 'INDEX': <function MySQL.Parser.<lambda>>, 'KEY': <function MySQL.Parser.<lambda>>, 'SPATIAL': <function MySQL.Parser.<lambda>>}
ALTER_PARSERS =
{'ADD': <function Parser.<lambda>>, 'AS': <function Parser.<lambda>>, 'ALTER': <function Parser.<lambda>>, 'CLUSTER BY': <function Parser.<lambda>>, 'DELETE': <function Parser.<lambda>>, 'DROP': <function Parser.<lambda>>, 'RENAME': <function Parser.<lambda>>, 'SET': <function Parser.<lambda>>, 'SWAP': <function Parser.<lambda>>, 'MODIFY': <function MySQL.Parser.<lambda>>}
ALTER_ALTER_PARSERS =
{'DISTKEY': <function Parser.<lambda>>, 'DISTSTYLE': <function Parser.<lambda>>, 'SORTKEY': <function Parser.<lambda>>, 'COMPOUND': <function Parser.<lambda>>, 'INDEX': <function MySQL.Parser.<lambda>>}
SCHEMA_UNNAMED_CONSTRAINTS =
{'LIKE', 'CHECK', 'KEY', 'SPATIAL', 'TRUNCATE', 'PRIMARY KEY', 'WATERMARK', 'BUCKET', 'FULLTEXT', 'EXCLUDE', 'PERIOD', 'INDEX', 'FOREIGN KEY', 'UNIQUE'}
PROFILE_TYPES: Dict[str, Sequence[Union[Sequence[str], str]]] =
{'ALL': (), 'CPU': (), 'IPC': (), 'MEMORY': (), 'SOURCE': (), 'SWAPS': (), 'BLOCK': ('IO',), 'CONTEXT': ('SWITCHES',), 'PAGE': ('FAULTS',)}
TYPE_TOKENS =
{<TokenType.NULL: 'NULL'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.INT: 'INT'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.UUID: 'UUID'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.NESTED: 'NESTED'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.UINT128: 'UINT128'>, <TokenType.YEAR: 'YEAR'>, <TokenType.IPV6: 'IPV6'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.RANGE: 'RANGE'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.DATE: 'DATE'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.UINT: 'UINT'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.MONEY: 'MONEY'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.VOID: 'VOID'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.BIT: 'BIT'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.RING: 'RING'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.LIST: 'LIST'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.BLOB: 'BLOB'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.NAME: 'NAME'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.SET: 'SET'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.POINT: 'POINT'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.CHAR: 'CHAR'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.JSONB: 'JSONB'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.GEOGRAPHYPOINT: 'GEOGRAPHYPOINT'>, <TokenType.ENUM: 'ENUM'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.MAP: 'MAP'>, <TokenType.DATE32: 'DATE32'>, <TokenType.INT256: 'INT256'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.UNION: 'UNION'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.SUPER: 'SUPER'>, <TokenType.BINARY: 'BINARY'>, <TokenType.UINT256: 'UINT256'>, <TokenType.TIME: 'TIME'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.INET: 'INET'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.XML: 'XML'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.JSON: 'JSON'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.IPV4: 'IPV4'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.INT128: 'INT128'>, <TokenType.TEXT: 'TEXT'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.NUMRANGE: 'NUMRANGE'>}
ENUM_TYPE_TOKENS =
{<TokenType.SET: 'SET'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.ENUM: 'ENUM'>}
OPERATION_MODIFIERS =
{'SQL_CALC_FOUND_ROWS', 'HIGH_PRIORITY', 'SQL_BIG_RESULT', 'SQL_NO_CACHE', 'SQL_SMALL_RESULT', 'STRAIGHT_JOIN', 'SQL_BUFFER_RESULT'}
SHOW_TRIE: Dict =
{'BINARY': {'LOGS': {0: True}}, 'MASTER': {'LOGS': {0: True}, 'STATUS': {0: True}}, 'BINLOG': {'EVENTS': {0: True}}, 'CHARACTER': {'SET': {0: True}}, 'CHARSET': {0: True}, 'COLLATION': {0: True}, 'FULL': {'COLUMNS': {0: True}, 'PROCESSLIST': {0: True}, 'TABLES': {0: True}}, 'COLUMNS': {0: True}, 'CREATE': {'DATABASE': {0: True}, 'EVENT': {0: True}, 'FUNCTION': {0: True}, 'PROCEDURE': {0: True}, 'TABLE': {0: True}, 'TRIGGER': {0: True}, 'VIEW': {0: True}}, 'DATABASES': {0: True}, 'SCHEMAS': {0: True}, 'ENGINE': {0: True}, 'STORAGE': {'ENGINES': {0: True}}, 'ENGINES': {0: True}, 'ERRORS': {0: True}, 'EVENTS': {0: True}, 'FUNCTION': {'CODE': {0: True}, 'STATUS': {0: True}}, 'GRANTS': {0: True}, 'INDEX': {0: True}, 'OPEN': {'TABLES': {0: True}}, 'PLUGINS': {0: True}, 'PROCEDURE': {'CODE': {0: True}, 'STATUS': {0: True}}, 'PRIVILEGES': {0: True}, 'PROCESSLIST': {0: True}, 'PROFILE': {0: True}, 'PROFILES': {0: True}, 'RELAYLOG': {'EVENTS': {0: True}}, 'REPLICAS': {0: True}, 'SLAVE': {'HOSTS': {0: True}, 'STATUS': {0: True}}, 'REPLICA': {'STATUS': {0: True}}, 'GLOBAL': {'STATUS': {0: True}, 'VARIABLES': {0: True}}, 'SESSION': {'STATUS': {0: True}, 'VARIABLES': {0: True}}, 'STATUS': {0: True}, 'TABLE': {'STATUS': {0: True}}, 'TABLES': {0: True}, 'TRIGGERS': {0: True}, 'VARIABLES': {0: True}, 'WARNINGS': {0: True}}
SET_TRIE: Dict =
{'GLOBAL': {0: True}, 'LOCAL': {0: True}, 'SESSION': {0: True}, 'TRANSACTION': {0: True}, 'PERSIST': {0: True}, 'PERSIST_ONLY': {0: True}, 'CHARACTER': {'SET': {0: True}}, 'CHARSET': {0: True}, 'NAMES': {0: True}}
Inherited Members
- sqlglot.parser.Parser
- Parser
- NO_PAREN_FUNCTIONS
- STRUCT_TYPE_TOKENS
- NESTED_TYPE_TOKENS
- AGGREGATE_TYPE_TOKENS
- SIGNED_TO_UNSIGNED_TYPE_TOKEN
- SUBQUERY_PREDICATES
- RESERVED_TOKENS
- DB_CREATABLES
- CREATABLES
- ALTERABLES
- ID_VAR_TOKENS
- ALIAS_TOKENS
- COLON_PLACEHOLDER_TOKENS
- ARRAY_CONSTRUCTORS
- COMMENT_TABLE_ALIAS_TOKENS
- UPDATE_ALIAS_TOKENS
- TRIM_TYPES
- ASSIGNMENT
- EQUALITY
- COMPARISON
- BITWISE
- TERM
- FACTOR
- EXPONENT
- TIMES
- TIMESTAMPS
- SET_OPERATIONS
- JOIN_METHODS
- JOIN_SIDES
- JOIN_KINDS
- JOIN_HINTS
- LAMBDAS
- COLUMN_OPERATORS
- CAST_COLUMN_OPERATORS
- EXPRESSION_PARSERS
- UNARY_PARSERS
- STRING_PARSERS
- NUMERIC_PARSERS
- PRIMARY_PARSERS
- PLACEHOLDER_PARSERS
- PIPE_SYNTAX_TRANSFORM_PARSERS
- NO_PAREN_FUNCTION_PARSERS
- INVALID_FUNC_NAME_TOKENS
- FUNCTIONS_WITH_ALIASED_ARGS
- KEY_VALUE_DEFINITIONS
- QUERY_MODIFIER_PARSERS
- QUERY_MODIFIER_TOKENS
- TYPE_LITERAL_PARSERS
- TYPE_CONVERTERS
- DDL_SELECT_TOKENS
- PRE_VOLATILE_TOKENS
- TRANSACTION_KIND
- TRANSACTION_CHARACTERISTICS
- CONFLICT_ACTIONS
- CREATE_SEQUENCE
- ISOLATED_LOADING_OPTIONS
- USABLES
- CAST_ACTIONS
- SCHEMA_BINDING_OPTIONS
- PROCEDURE_OPTIONS
- EXECUTE_AS_OPTIONS
- KEY_CONSTRAINT_OPTIONS
- WINDOW_EXCLUDE_OPTIONS
- INSERT_ALTERNATIVES
- CLONE_KEYWORDS
- HISTORICAL_DATA_PREFIX
- HISTORICAL_DATA_KIND
- OPCLASS_FOLLOW_KEYWORDS
- OPTYPE_FOLLOW_TOKENS
- TABLE_INDEX_HINT_TOKENS
- VIEW_ATTRIBUTES
- WINDOW_ALIAS_TOKENS
- WINDOW_BEFORE_PAREN_TOKENS
- WINDOW_SIDES
- JSON_KEY_VALUE_SEPARATOR_TOKENS
- FETCH_TOKENS
- ADD_CONSTRAINT_TOKENS
- DISTINCT_TOKENS
- UNNEST_OFFSET_ALIAS_TOKENS
- SELECT_START_TOKENS
- COPY_INTO_VARLEN_OPTIONS
- IS_JSON_PREDICATE_KIND
- ODBC_DATETIME_LITERALS
- ON_CONDITION_TOKENS
- PRIVILEGE_FOLLOW_TOKENS
- DESCRIBE_STYLES
- ANALYZE_STYLES
- ANALYZE_EXPRESSION_PARSERS
- PARTITION_KEYWORDS
- AMBIGUOUS_ALIAS_TOKENS
- RECURSIVE_CTE_SEARCH_KIND
- MODIFIABLES
- STRICT_CAST
- PREFIXED_PIVOT_COLUMNS
- IDENTIFY_PIVOT_STRINGS
- TABLESAMPLE_CSV
- DEFAULT_SAMPLING_METHOD
- SET_REQUIRES_ASSIGNMENT_DELIMITER
- TRIM_PATTERN_FIRST
- MODIFIERS_ATTACHED_TO_SET_OP
- SET_OP_MODIFIERS
- NO_PAREN_IF_COMMANDS
- JSON_ARROWS_REQUIRE_JSON_TYPE
- COLON_IS_VARIANT_EXTRACT
- SUPPORTS_IMPLICIT_UNNEST
- INTERVAL_SPANS
- WRAPPED_TRANSFORM_COLUMN_CONSTRAINT
- OPTIONAL_ALIAS_TOKEN_CTE
- ALTER_RENAME_REQUIRES_COLUMN
- JOINS_HAVE_EQUAL_PRECEDENCE
- ZONE_AWARE_TIMESTAMP_CONSTRUCTOR
- MAP_KEYS_ARE_ARBITRARY_EXPRESSIONS
- JSON_EXTRACT_REQUIRES_JSON_EXPRESSION
- ADD_JOIN_ON_TRUE
- error_level
- error_message_context
- max_errors
- dialect
- reset
- parse
- parse_into
- check_errors
- raise_error
- expression
- validate_expression
- parse_set_operation
- build_cast
- errors
- sql
717 class Generator(generator.Generator): 718 INTERVAL_ALLOWS_PLURAL_FORM = False 719 LOCKING_READS_SUPPORTED = True 720 NULL_ORDERING_SUPPORTED: t.Optional[bool] = None 721 JOIN_HINTS = False 722 TABLE_HINTS = True 723 DUPLICATE_KEY_UPDATE_WITH_SET = False 724 QUERY_HINT_SEP = " " 725 VALUES_AS_TABLE = False 726 NVL2_SUPPORTED = False 727 LAST_DAY_SUPPORTS_DATE_PART = False 728 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 729 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 730 JSON_KEY_VALUE_PAIR_SEP = "," 731 SUPPORTS_TO_NUMBER = False 732 PARSE_JSON_NAME: t.Optional[str] = None 733 PAD_FILL_PATTERN_IS_REQUIRED = True 734 WRAP_DERIVED_VALUES = False 735 VARCHAR_REQUIRES_SIZE = True 736 SUPPORTS_MEDIAN = False 737 738 TRANSFORMS = { 739 **generator.Generator.TRANSFORMS, 740 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 741 exp.BitwiseAndAgg: rename_func("BIT_AND"), 742 exp.BitwiseOrAgg: rename_func("BIT_OR"), 743 exp.BitwiseXorAgg: rename_func("BIT_XOR"), 744 exp.BitwiseCountAgg: rename_func("BIT_COUNT"), 745 exp.CurrentDate: no_paren_current_date_sql, 746 exp.DateDiff: _remove_ts_or_ds_to_date( 747 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 748 ), 749 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 750 exp.DateStrToDate: datestrtodate_sql, 751 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 752 exp.DateTrunc: _date_trunc_sql, 753 exp.Day: _remove_ts_or_ds_to_date(), 754 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 755 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 756 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 757 exp.GroupConcat: lambda self, 758 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 759 exp.ILike: no_ilike_sql, 760 exp.JSONExtractScalar: arrow_json_extract_sql, 761 exp.Length: length_or_char_length_sql, 762 exp.LogicalOr: rename_func("MAX"), 763 exp.LogicalAnd: rename_func("MIN"), 764 exp.Max: max_or_greatest, 765 exp.Min: min_or_least, 766 exp.Month: _remove_ts_or_ds_to_date(), 767 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 768 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 769 exp.NumberToStr: rename_func("FORMAT"), 770 exp.Pivot: no_pivot_sql, 771 exp.Select: transforms.preprocess( 772 [ 773 transforms.eliminate_distinct_on, 774 transforms.eliminate_semi_and_anti_joins, 775 transforms.eliminate_qualify, 776 transforms.eliminate_full_outer_join, 777 transforms.unnest_generate_date_array_using_recursive_cte, 778 ] 779 ), 780 exp.StrPosition: lambda self, e: strposition_sql( 781 self, e, func_name="LOCATE", supports_position=True 782 ), 783 exp.StrToDate: _str_to_date_sql, 784 exp.StrToTime: _str_to_date_sql, 785 exp.Stuff: rename_func("INSERT"), 786 exp.TableSample: no_tablesample_sql, 787 exp.TimeFromParts: rename_func("MAKETIME"), 788 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 789 exp.TimestampDiff: lambda self, e: self.func( 790 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 791 ), 792 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 793 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 794 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 795 self, 796 e, 797 include_precision=not e.args.get("zone"), 798 ), 799 exp.TimeToStr: _remove_ts_or_ds_to_date( 800 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 801 ), 802 exp.Trim: trim_sql, 803 exp.TryCast: no_trycast_sql, 804 exp.TsOrDsAdd: date_add_sql("ADD"), 805 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 806 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 807 exp.Unicode: lambda self, e: f"ORD(CONVERT({self.sql(e.this)} USING utf32))", 808 exp.UnixToTime: _unix_to_time_sql, 809 exp.Week: _remove_ts_or_ds_to_date(), 810 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 811 exp.Year: _remove_ts_or_ds_to_date(), 812 exp.UtcTimestamp: rename_func("UTC_TIMESTAMP"), 813 exp.UtcTime: rename_func("UTC_TIME"), 814 } 815 816 UNSIGNED_TYPE_MAPPING = { 817 exp.DataType.Type.UBIGINT: "BIGINT", 818 exp.DataType.Type.UINT: "INT", 819 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 820 exp.DataType.Type.USMALLINT: "SMALLINT", 821 exp.DataType.Type.UTINYINT: "TINYINT", 822 exp.DataType.Type.UDECIMAL: "DECIMAL", 823 exp.DataType.Type.UDOUBLE: "DOUBLE", 824 } 825 826 TIMESTAMP_TYPE_MAPPING = { 827 exp.DataType.Type.DATETIME2: "DATETIME", 828 exp.DataType.Type.SMALLDATETIME: "DATETIME", 829 exp.DataType.Type.TIMESTAMP: "DATETIME", 830 exp.DataType.Type.TIMESTAMPNTZ: "DATETIME", 831 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 832 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 833 } 834 835 TYPE_MAPPING = { 836 **generator.Generator.TYPE_MAPPING, 837 **UNSIGNED_TYPE_MAPPING, 838 **TIMESTAMP_TYPE_MAPPING, 839 } 840 841 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 842 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 843 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 844 TYPE_MAPPING.pop(exp.DataType.Type.BLOB) 845 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 846 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 847 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 848 849 PROPERTIES_LOCATION = { 850 **generator.Generator.PROPERTIES_LOCATION, 851 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 852 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 853 } 854 855 LIMIT_FETCH = "LIMIT" 856 857 LIMIT_ONLY_LITERALS = True 858 859 CHAR_CAST_MAPPING = dict.fromkeys( 860 ( 861 exp.DataType.Type.LONGTEXT, 862 exp.DataType.Type.LONGBLOB, 863 exp.DataType.Type.MEDIUMBLOB, 864 exp.DataType.Type.MEDIUMTEXT, 865 exp.DataType.Type.TEXT, 866 exp.DataType.Type.TINYBLOB, 867 exp.DataType.Type.TINYTEXT, 868 exp.DataType.Type.VARCHAR, 869 ), 870 "CHAR", 871 ) 872 SIGNED_CAST_MAPPING = dict.fromkeys( 873 ( 874 exp.DataType.Type.BIGINT, 875 exp.DataType.Type.BOOLEAN, 876 exp.DataType.Type.INT, 877 exp.DataType.Type.SMALLINT, 878 exp.DataType.Type.TINYINT, 879 exp.DataType.Type.MEDIUMINT, 880 ), 881 "SIGNED", 882 ) 883 884 # MySQL doesn't support many datatypes in cast. 885 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 886 CAST_MAPPING = { 887 **CHAR_CAST_MAPPING, 888 **SIGNED_CAST_MAPPING, 889 exp.DataType.Type.UBIGINT: "UNSIGNED", 890 } 891 892 TIMESTAMP_FUNC_TYPES = { 893 exp.DataType.Type.TIMESTAMPTZ, 894 exp.DataType.Type.TIMESTAMPLTZ, 895 } 896 897 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 898 RESERVED_KEYWORDS = { 899 "accessible", 900 "add", 901 "all", 902 "alter", 903 "analyze", 904 "and", 905 "as", 906 "asc", 907 "asensitive", 908 "before", 909 "between", 910 "bigint", 911 "binary", 912 "blob", 913 "both", 914 "by", 915 "call", 916 "cascade", 917 "case", 918 "change", 919 "char", 920 "character", 921 "check", 922 "collate", 923 "column", 924 "condition", 925 "constraint", 926 "continue", 927 "convert", 928 "create", 929 "cross", 930 "cube", 931 "cume_dist", 932 "current_date", 933 "current_time", 934 "current_timestamp", 935 "current_user", 936 "cursor", 937 "database", 938 "databases", 939 "day_hour", 940 "day_microsecond", 941 "day_minute", 942 "day_second", 943 "dec", 944 "decimal", 945 "declare", 946 "default", 947 "delayed", 948 "delete", 949 "dense_rank", 950 "desc", 951 "describe", 952 "deterministic", 953 "distinct", 954 "distinctrow", 955 "div", 956 "double", 957 "drop", 958 "dual", 959 "each", 960 "else", 961 "elseif", 962 "empty", 963 "enclosed", 964 "escaped", 965 "except", 966 "exists", 967 "exit", 968 "explain", 969 "false", 970 "fetch", 971 "first_value", 972 "float", 973 "float4", 974 "float8", 975 "for", 976 "force", 977 "foreign", 978 "from", 979 "fulltext", 980 "function", 981 "generated", 982 "get", 983 "grant", 984 "group", 985 "grouping", 986 "groups", 987 "having", 988 "high_priority", 989 "hour_microsecond", 990 "hour_minute", 991 "hour_second", 992 "if", 993 "ignore", 994 "in", 995 "index", 996 "infile", 997 "inner", 998 "inout", 999 "insensitive", 1000 "insert", 1001 "int", 1002 "int1", 1003 "int2", 1004 "int3", 1005 "int4", 1006 "int8", 1007 "integer", 1008 "intersect", 1009 "interval", 1010 "into", 1011 "io_after_gtids", 1012 "io_before_gtids", 1013 "is", 1014 "iterate", 1015 "join", 1016 "json_table", 1017 "key", 1018 "keys", 1019 "kill", 1020 "lag", 1021 "last_value", 1022 "lateral", 1023 "lead", 1024 "leading", 1025 "leave", 1026 "left", 1027 "like", 1028 "limit", 1029 "linear", 1030 "lines", 1031 "load", 1032 "localtime", 1033 "localtimestamp", 1034 "lock", 1035 "long", 1036 "longblob", 1037 "longtext", 1038 "loop", 1039 "low_priority", 1040 "master_bind", 1041 "master_ssl_verify_server_cert", 1042 "match", 1043 "maxvalue", 1044 "mediumblob", 1045 "mediumint", 1046 "mediumtext", 1047 "middleint", 1048 "minute_microsecond", 1049 "minute_second", 1050 "mod", 1051 "modifies", 1052 "natural", 1053 "not", 1054 "no_write_to_binlog", 1055 "nth_value", 1056 "ntile", 1057 "null", 1058 "numeric", 1059 "of", 1060 "on", 1061 "optimize", 1062 "optimizer_costs", 1063 "option", 1064 "optionally", 1065 "or", 1066 "order", 1067 "out", 1068 "outer", 1069 "outfile", 1070 "over", 1071 "partition", 1072 "percent_rank", 1073 "precision", 1074 "primary", 1075 "procedure", 1076 "purge", 1077 "range", 1078 "rank", 1079 "read", 1080 "reads", 1081 "read_write", 1082 "real", 1083 "recursive", 1084 "references", 1085 "regexp", 1086 "release", 1087 "rename", 1088 "repeat", 1089 "replace", 1090 "require", 1091 "resignal", 1092 "restrict", 1093 "return", 1094 "revoke", 1095 "right", 1096 "rlike", 1097 "row", 1098 "rows", 1099 "row_number", 1100 "schema", 1101 "schemas", 1102 "second_microsecond", 1103 "select", 1104 "sensitive", 1105 "separator", 1106 "set", 1107 "show", 1108 "signal", 1109 "smallint", 1110 "spatial", 1111 "specific", 1112 "sql", 1113 "sqlexception", 1114 "sqlstate", 1115 "sqlwarning", 1116 "sql_big_result", 1117 "sql_calc_found_rows", 1118 "sql_small_result", 1119 "ssl", 1120 "starting", 1121 "stored", 1122 "straight_join", 1123 "system", 1124 "table", 1125 "terminated", 1126 "then", 1127 "tinyblob", 1128 "tinyint", 1129 "tinytext", 1130 "to", 1131 "trailing", 1132 "trigger", 1133 "true", 1134 "undo", 1135 "union", 1136 "unique", 1137 "unlock", 1138 "unsigned", 1139 "update", 1140 "usage", 1141 "use", 1142 "using", 1143 "utc_date", 1144 "utc_time", 1145 "utc_timestamp", 1146 "values", 1147 "varbinary", 1148 "varchar", 1149 "varcharacter", 1150 "varying", 1151 "virtual", 1152 "when", 1153 "where", 1154 "while", 1155 "window", 1156 "with", 1157 "write", 1158 "xor", 1159 "year_month", 1160 "zerofill", 1161 } 1162 1163 def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str: 1164 persisted = "STORED" if expression.args.get("persisted") else "VIRTUAL" 1165 return f"GENERATED ALWAYS AS ({self.sql(expression.this.unnest())}) {persisted}" 1166 1167 def array_sql(self, expression: exp.Array) -> str: 1168 self.unsupported("Arrays are not supported by MySQL") 1169 return self.function_fallback_sql(expression) 1170 1171 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1172 self.unsupported("Array operations are not supported by MySQL") 1173 return self.function_fallback_sql(expression) 1174 1175 def dpipe_sql(self, expression: exp.DPipe) -> str: 1176 return self.func("CONCAT", *expression.flatten()) 1177 1178 def extract_sql(self, expression: exp.Extract) -> str: 1179 unit = expression.name 1180 if unit and unit.lower() == "epoch": 1181 return self.func("UNIX_TIMESTAMP", expression.expression) 1182 1183 return super().extract_sql(expression) 1184 1185 def datatype_sql(self, expression: exp.DataType) -> str: 1186 if ( 1187 self.VARCHAR_REQUIRES_SIZE 1188 and expression.is_type(exp.DataType.Type.VARCHAR) 1189 and not expression.expressions 1190 ): 1191 # `VARCHAR` must always have a size - if it doesn't, we always generate `TEXT` 1192 return "TEXT" 1193 1194 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1195 result = super().datatype_sql(expression) 1196 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1197 result = f"{result} UNSIGNED" 1198 1199 return result 1200 1201 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1202 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1203 1204 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1205 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1206 return self.func("TIMESTAMP", expression.this) 1207 1208 to = self.CAST_MAPPING.get(expression.to.this) 1209 1210 if to: 1211 expression.to.set("this", to) 1212 return super().cast_sql(expression) 1213 1214 def show_sql(self, expression: exp.Show) -> str: 1215 this = f" {expression.name}" 1216 full = " FULL" if expression.args.get("full") else "" 1217 global_ = " GLOBAL" if expression.args.get("global") else "" 1218 1219 target = self.sql(expression, "target") 1220 target = f" {target}" if target else "" 1221 if expression.name in ("COLUMNS", "INDEX"): 1222 target = f" FROM{target}" 1223 elif expression.name == "GRANTS": 1224 target = f" FOR{target}" 1225 elif expression.name in ("LINKS", "PARTITIONS"): 1226 target = f" ON{target}" if target else "" 1227 elif expression.name == "PROJECTIONS": 1228 target = f" ON TABLE{target}" if target else "" 1229 1230 db = self._prefixed_sql("FROM", expression, "db") 1231 1232 like = self._prefixed_sql("LIKE", expression, "like") 1233 where = self.sql(expression, "where") 1234 1235 types = self.expressions(expression, key="types") 1236 types = f" {types}" if types else types 1237 query = self._prefixed_sql("FOR QUERY", expression, "query") 1238 1239 if expression.name == "PROFILE": 1240 offset = self._prefixed_sql("OFFSET", expression, "offset") 1241 limit = self._prefixed_sql("LIMIT", expression, "limit") 1242 else: 1243 offset = "" 1244 limit = self._oldstyle_limit_sql(expression) 1245 1246 log = self._prefixed_sql("IN", expression, "log") 1247 position = self._prefixed_sql("FROM", expression, "position") 1248 1249 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1250 1251 if expression.name == "ENGINE": 1252 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1253 else: 1254 mutex_or_status = "" 1255 1256 for_table = self._prefixed_sql("FOR TABLE", expression, "for_table") 1257 for_group = self._prefixed_sql("FOR GROUP", expression, "for_group") 1258 for_user = self._prefixed_sql("FOR USER", expression, "for_user") 1259 for_role = self._prefixed_sql("FOR ROLE", expression, "for_role") 1260 into_outfile = self._prefixed_sql("INTO OUTFILE", expression, "into_outfile") 1261 json = " JSON" if expression.args.get("json") else "" 1262 1263 return f"SHOW{full}{global_}{this}{json}{target}{for_table}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}{for_group}{for_user}{for_role}{into_outfile}" 1264 1265 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1266 dtype = self.sql(expression, "dtype") 1267 if not dtype: 1268 return super().altercolumn_sql(expression) 1269 1270 this = self.sql(expression, "this") 1271 return f"MODIFY COLUMN {this} {dtype}" 1272 1273 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1274 sql = self.sql(expression, arg) 1275 return f" {prefix} {sql}" if sql else "" 1276 1277 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1278 limit = self.sql(expression, "limit") 1279 offset = self.sql(expression, "offset") 1280 if limit: 1281 limit_offset = f"{offset}, {limit}" if offset else limit 1282 return f" LIMIT {limit_offset}" 1283 return "" 1284 1285 def chr_sql(self, expression: exp.Chr) -> str: 1286 this = self.expressions(sqls=[expression.this] + expression.expressions) 1287 charset = expression.args.get("charset") 1288 using = f" USING {self.sql(charset)}" if charset else "" 1289 return f"CHAR({this}{using})" 1290 1291 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1292 unit = expression.args.get("unit") 1293 1294 # Pick an old-enough date to avoid negative timestamp diffs 1295 start_ts = "'0000-01-01 00:00:00'" 1296 1297 # Source: https://stackoverflow.com/a/32955740 1298 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1299 interval = exp.Interval(this=timestamp_diff, unit=unit) 1300 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1301 1302 return self.sql(dateadd) 1303 1304 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1305 from_tz = expression.args.get("source_tz") 1306 to_tz = expression.args.get("target_tz") 1307 dt = expression.args.get("timestamp") 1308 1309 return self.func("CONVERT_TZ", dt, from_tz, to_tz) 1310 1311 def attimezone_sql(self, expression: exp.AtTimeZone) -> str: 1312 self.unsupported("AT TIME ZONE is not supported by MySQL") 1313 return self.sql(expression.this) 1314 1315 def isascii_sql(self, expression: exp.IsAscii) -> str: 1316 return f"REGEXP_LIKE({self.sql(expression.this)}, '^[[:ascii:]]*$')" 1317 1318 @unsupported_args("this") 1319 def currentschema_sql(self, expression: exp.CurrentSchema) -> str: 1320 return self.func("SCHEMA")
Generator converts a given syntax tree to the corresponding SQL string.
Arguments:
- pretty: Whether to format the produced SQL string. Default: False.
- identify: Determines when an identifier should be quoted. Possible values are: False (default): Never quote, except in cases where it's mandatory by the dialect. True or 'always': Always quote. 'safe': Only quote identifiers that are case insensitive.
- normalize: Whether to normalize identifiers to lowercase. Default: False.
- pad: The pad size in a formatted string. For example, this affects the indentation of a projection in a query, relative to its nesting level. Default: 2.
- indent: The indentation size in a formatted string. For example, this affects the
indentation of subqueries and filters under a
WHERE
clause. Default: 2. - normalize_functions: How to normalize function names. Possible values are: "upper" or True (default): Convert names to uppercase. "lower": Convert names to lowercase. False: Disables function name normalization.
- unsupported_level: Determines the generator's behavior when it encounters unsupported expressions. Default ErrorLevel.WARN.
- max_unsupported: Maximum number of unsupported messages to include in a raised UnsupportedError. This is only relevant if unsupported_level is ErrorLevel.RAISE. Default: 3
- leading_comma: Whether the comma is leading or trailing in select expressions. This is only relevant when generating in pretty mode. Default: False
- max_text_width: The max number of characters in a segment before creating new lines in pretty mode. The default is on the smaller end because the length only represents a segment and not the true line length. Default: 80
- comments: Whether to preserve comments in the output SQL code. Default: True
TRANSFORMS =
{<class 'sqlglot.expressions.JSONPathFilter'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathKey'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathRecursive'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathRoot'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathScript'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathSelector'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathSlice'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathSubscript'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathUnion'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathWildcard'>: <function <lambda>>, <class 'sqlglot.expressions.AllowedValuesProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.AnalyzeColumns'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.AnalyzeWith'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ArrayContainsAll'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ArrayOverlaps'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.AutoRefreshProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.BackupProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CaseSpecificColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Ceil'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CharacterSetColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CharacterSetProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ClusteredColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CollateColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CommentColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ConnectByRoot'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ConvertToCharset'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CopyGrantsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CredentialsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.DateFormatColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.DefaultColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.DynamicProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EmptyProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EncodeColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EnviromentProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EphemeralColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ExcludeColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ExecuteAsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Except'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ExternalProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Floor'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Get'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.GlobalProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.HeapProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.IcebergProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InheritsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InlineLengthColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InputModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Intersect'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.IntervalSpan'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Int64'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.JSONBContainsAnyTopKeys'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.JSONBContainsAllTopKeys'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.JSONBDeleteAtPath'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LanguageProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LocationProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LogProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.MaterializedProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.NonClusteredColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.NoPrimaryIndexProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.NotForReplicationColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OnCommitProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OnProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OnUpdateColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Operator'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OutputModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PathColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PartitionedByBucket'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PartitionByTruncate'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PivotAny'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PositionalColumn'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ProjectionPolicyColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Put'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.RemoteWithConnectionModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ReturnsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SampleProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SecureProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SecurityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SetConfigProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SetProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SettingsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SharingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SqlReadWriteProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SqlSecurityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StabilityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Stream'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StreamingTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StrictProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SwapTable'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TableColumn'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Tags'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TemporaryProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TitleColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ToMap'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ToTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TransformModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TransientProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Union'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UnloggedProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UsingTemplateProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UsingData'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Uuid'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UppercaseColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UtcDate'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UtcTime'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.UtcTimestamp'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.VarMap'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ViewAttributeProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.VolatileProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WeekStart'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithJournalTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithProcedureOptions'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithSchemaBindingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithOperator'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ForceProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ArrayAgg'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.BitwiseAndAgg'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.BitwiseOrAgg'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.BitwiseXorAgg'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.BitwiseCountAgg'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentDate'>: <function no_paren_current_date_sql>, <class 'sqlglot.expressions.DateDiff'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DateAdd'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DateStrToDate'>: <function datestrtodate_sql>, <class 'sqlglot.expressions.DateSub'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DateTrunc'>: <function _date_trunc_sql>, <class 'sqlglot.expressions.Day'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DayOfMonth'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DayOfWeek'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DayOfYear'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.GroupConcat'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.ILike'>: <function no_ilike_sql>, <class 'sqlglot.expressions.JSONExtractScalar'>: <function arrow_json_extract_sql>, <class 'sqlglot.expressions.Length'>: <function length_or_char_length_sql>, <class 'sqlglot.expressions.LogicalOr'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.LogicalAnd'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Max'>: <function max_or_greatest>, <class 'sqlglot.expressions.Min'>: <function min_or_least>, <class 'sqlglot.expressions.Month'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.NullSafeEQ'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.NullSafeNEQ'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.NumberToStr'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Pivot'>: <function no_pivot_sql>, <class 'sqlglot.expressions.Select'>: <function preprocess.<locals>._to_sql>, <class 'sqlglot.expressions.StrPosition'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.StrToDate'>: <function _str_to_date_sql>, <class 'sqlglot.expressions.StrToTime'>: <function _str_to_date_sql>, <class 'sqlglot.expressions.Stuff'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TableSample'>: <function no_tablesample_sql>, <class 'sqlglot.expressions.TimeFromParts'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TimestampAdd'>: <function date_add_interval_sql.<locals>.func>, <class 'sqlglot.expressions.TimestampDiff'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.TimestampSub'>: <function date_add_interval_sql.<locals>.func>, <class 'sqlglot.expressions.TimeStrToUnix'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeStrToTime'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.TimeToStr'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.Trim'>: <function trim_sql>, <class 'sqlglot.expressions.TryCast'>: <function no_trycast_sql>, <class 'sqlglot.expressions.TsOrDsAdd'>: <function date_add_sql.<locals>.func>, <class 'sqlglot.expressions.TsOrDsDiff'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.TsOrDsToDate'>: <function _ts_or_ds_to_date_sql>, <class 'sqlglot.expressions.Unicode'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.UnixToTime'>: <function _unix_to_time_sql>, <class 'sqlglot.expressions.Week'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.WeekOfYear'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.Year'>: <function _remove_ts_or_ds_to_date.<locals>.func>}
UNSIGNED_TYPE_MAPPING =
{<Type.UBIGINT: 'UBIGINT'>: 'BIGINT', <Type.UINT: 'UINT'>: 'INT', <Type.UMEDIUMINT: 'UMEDIUMINT'>: 'MEDIUMINT', <Type.USMALLINT: 'USMALLINT'>: 'SMALLINT', <Type.UTINYINT: 'UTINYINT'>: 'TINYINT', <Type.UDECIMAL: 'UDECIMAL'>: 'DECIMAL', <Type.UDOUBLE: 'UDOUBLE'>: 'DOUBLE'}
TIMESTAMP_TYPE_MAPPING =
{<Type.DATETIME2: 'DATETIME2'>: 'DATETIME', <Type.SMALLDATETIME: 'SMALLDATETIME'>: 'DATETIME', <Type.TIMESTAMP: 'TIMESTAMP'>: 'DATETIME', <Type.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>: 'DATETIME', <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>: 'TIMESTAMP', <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>: 'TIMESTAMP'}
TYPE_MAPPING =
{<Type.DATETIME2: 'DATETIME2'>: 'DATETIME', <Type.NCHAR: 'NCHAR'>: 'CHAR', <Type.NVARCHAR: 'NVARCHAR'>: 'VARCHAR', <Type.INET: 'INET'>: 'INET', <Type.ROWVERSION: 'ROWVERSION'>: 'VARBINARY', <Type.SMALLDATETIME: 'SMALLDATETIME'>: 'DATETIME', <Type.UBIGINT: 'UBIGINT'>: 'BIGINT', <Type.UINT: 'UINT'>: 'INT', <Type.UMEDIUMINT: 'UMEDIUMINT'>: 'MEDIUMINT', <Type.USMALLINT: 'USMALLINT'>: 'SMALLINT', <Type.UTINYINT: 'UTINYINT'>: 'TINYINT', <Type.UDECIMAL: 'UDECIMAL'>: 'DECIMAL', <Type.UDOUBLE: 'UDOUBLE'>: 'DOUBLE', <Type.TIMESTAMP: 'TIMESTAMP'>: 'DATETIME', <Type.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>: 'DATETIME', <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>: 'TIMESTAMP', <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>: 'TIMESTAMP'}
PROPERTIES_LOCATION =
{<class 'sqlglot.expressions.AllowedValuesProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.AlgorithmProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.AutoIncrementProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.AutoRefreshProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.BackupProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.BlockCompressionProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.CharacterSetProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ChecksumProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.CollateProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.CopyGrantsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Cluster'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ClusteredByProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DistributedByProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DuplicateKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DataBlocksizeProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.DataDeletionProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DefinerProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.DictRange'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DictProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DynamicProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.DistKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DistStyleProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EmptyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EncodeProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.EngineProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EnviromentProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ExecuteAsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ExternalProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.FallbackProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.FileFormatProperty'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.FreespaceProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.GlobalProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.HeapProperty'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.InheritsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.IcebergProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.IncludeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.InputModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.IsolatedLoadingProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.JournalProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.LanguageProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LikeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LocationProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LockProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LockingProperty'>: <Location.POST_ALIAS: 'POST_ALIAS'>, <class 'sqlglot.expressions.LogProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.MaterializedProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.MergeBlockRatioProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.NoPrimaryIndexProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.OnProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.OnCommitProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.Order'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.OutputModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PartitionedByProperty'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.PartitionedOfProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PrimaryKey'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Property'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.RemoteWithConnectionModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ReturnsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatDelimitedProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatSerdeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SampleProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SchemaCommentProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SecureProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.SecurityProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SerdeProperties'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Set'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SettingsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SetProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.SetConfigProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SharingProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.SequenceProperties'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.SortKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SqlReadWriteProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SqlSecurityProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.StabilityProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.StorageHandlerProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.StreamingTableProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.StrictProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Tags'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.TemporaryProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.ToTableProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.TransientProperty'>: <Location.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.TransformModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.MergeTreeTTL'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.UnloggedProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.UsingTemplateProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ViewAttributeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.VolatileProperty'>: <Location.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.WithDataProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.WithJournalTableProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.WithProcedureOptions'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.WithSchemaBindingProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.WithSystemVersioningProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ForceProperty'>: <Location.POST_CREATE: 'POST_CREATE'>}
CHAR_CAST_MAPPING =
{<Type.LONGTEXT: 'LONGTEXT'>: 'CHAR', <Type.LONGBLOB: 'LONGBLOB'>: 'CHAR', <Type.MEDIUMBLOB: 'MEDIUMBLOB'>: 'CHAR', <Type.MEDIUMTEXT: 'MEDIUMTEXT'>: 'CHAR', <Type.TEXT: 'TEXT'>: 'CHAR', <Type.TINYBLOB: 'TINYBLOB'>: 'CHAR', <Type.TINYTEXT: 'TINYTEXT'>: 'CHAR', <Type.VARCHAR: 'VARCHAR'>: 'CHAR'}
SIGNED_CAST_MAPPING =
{<Type.BIGINT: 'BIGINT'>: 'SIGNED', <Type.BOOLEAN: 'BOOLEAN'>: 'SIGNED', <Type.INT: 'INT'>: 'SIGNED', <Type.SMALLINT: 'SMALLINT'>: 'SIGNED', <Type.TINYINT: 'TINYINT'>: 'SIGNED', <Type.MEDIUMINT: 'MEDIUMINT'>: 'SIGNED'}
CAST_MAPPING =
{<Type.LONGTEXT: 'LONGTEXT'>: 'CHAR', <Type.LONGBLOB: 'LONGBLOB'>: 'CHAR', <Type.MEDIUMBLOB: 'MEDIUMBLOB'>: 'CHAR', <Type.MEDIUMTEXT: 'MEDIUMTEXT'>: 'CHAR', <Type.TEXT: 'TEXT'>: 'CHAR', <Type.TINYBLOB: 'TINYBLOB'>: 'CHAR', <Type.TINYTEXT: 'TINYTEXT'>: 'CHAR', <Type.VARCHAR: 'VARCHAR'>: 'CHAR', <Type.BIGINT: 'BIGINT'>: 'SIGNED', <Type.BOOLEAN: 'BOOLEAN'>: 'SIGNED', <Type.INT: 'INT'>: 'SIGNED', <Type.SMALLINT: 'SMALLINT'>: 'SIGNED', <Type.TINYINT: 'TINYINT'>: 'SIGNED', <Type.MEDIUMINT: 'MEDIUMINT'>: 'SIGNED', <Type.UBIGINT: 'UBIGINT'>: 'UNSIGNED'}
RESERVED_KEYWORDS =
{'last_value', 'revoke', 'generated', 'where', 'order', 'purge', 'binary', 'float', 'sql', 'terminated', 'union', 'analyze', 'nth_value', 'convert', 'long', 'undo', 'day_minute', 'ssl', 'require', 'numeric', 'table', 'restrict', 'procedure', 'add', 'blob', 'references', 'hour_microsecond', 'current_user', 'natural', 'like', 'return', 'dec', 'distinctrow', 'utc_timestamp', 'signal', 'mediumblob', 'and', 'dual', 'deterministic', 'no_write_to_binlog', 'inner', 'exit', 'set', 'day_hour', 'on', 'year_month', 'partition', 'optimize', 'insensitive', 'rows', 'as', 'current_time', 'while', 'specific', 'sqlstate', 'cube', 'except', 'desc', 'mediumint', 'true', 'rank', 'replace', 'integer', 'float4', 'empty', 'separator', 'kill', 'dense_rank', 'both', 'recursive', 'with', 'match', 'lag', 'io_after_gtids', 'leading', 'usage', 'int4', 'declare', 'current_date', 'reads', 'high_priority', 'sqlexception', 'int8', 'maxvalue', 'condition', 'int', 'ntile', 'read', 'varchar', 'sql_big_result', 'localtime', 'second_microsecond', 'before', 'describe', 'call', 'index', 'groups', 'tinytext', 'trailing', 'localtimestamp', 'xor', 'limit', 'keys', 'zerofill', 'for', 'each', 'outfile', 'delete', 'spatial', 'drop', 'cume_dist', 'system', 'sql_calc_found_rows', 'primary', 'get', 'optimizer_costs', 'utc_date', 'release', 'int3', 'character', 'sql_small_result', 'out', 'hour_second', 'cursor', 'int1', 'over', 'not', 'float8', 'explain', 'into', 'tinyint', 'null', 'hour_minute', 'lead', 'right', 'io_before_gtids', 'ignore', 'regexp', 'change', 'asc', 'create', 'lines', 'lock', 'delayed', 'decimal', 'leave', 'values', 'left', 'utc_time', 'low_priority', 'div', 'mod', 'rlike', 'or', 'check', 'schemas', 'is', 'grant', 'use', 'elseif', 'precision', 'day_microsecond', 'fetch', 'middleint', 'linear', 'int2', 'optionally', 'iterate', 'else', 'insert', 'intersect', 'longtext', 'inout', 'force', 'in', 'straight_join', 'false', 'constraint', 'column', 'if', 'grouping', 'range', 'alter', 'group', 'current_timestamp', 'collate', 'load', 'row', 'json_table', 'default', 'schema', 'first_value', 'from', 'tinyblob', 'virtual', 'resignal', 'having', 'foreign', 'to', 'unsigned', 'real', 'databases', 'repeat', 'sqlwarning', 'show', 'key', 'option', 'modifies', 'starting', 'by', 'varying', 'longblob', 'master_ssl_verify_server_cert', 'when', 'minute_microsecond', 'between', 'lateral', 'continue', 'all', 'double', 'loop', 'varcharacter', 'case', 'interval', 'row_number', 'escaped', 'outer', 'then', 'database', 'exists', 'stored', 'bigint', 'sensitive', 'cross', 'percent_rank', 'unlock', 'window', 'cascade', 'char', 'minute_second', 'join', 'using', 'enclosed', 'of', 'mediumtext', 'accessible', 'infile', 'rename', 'function', 'fulltext', 'varbinary', 'smallint', 'distinct', 'day_second', 'update', 'trigger', 'read_write', 'master_bind', 'asensitive', 'write', 'unique', 'select'}
def
computedcolumnconstraint_sql(self, expression: sqlglot.expressions.ComputedColumnConstraint) -> str:
1185 def datatype_sql(self, expression: exp.DataType) -> str: 1186 if ( 1187 self.VARCHAR_REQUIRES_SIZE 1188 and expression.is_type(exp.DataType.Type.VARCHAR) 1189 and not expression.expressions 1190 ): 1191 # `VARCHAR` must always have a size - if it doesn't, we always generate `TEXT` 1192 return "TEXT" 1193 1194 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1195 result = super().datatype_sql(expression) 1196 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1197 result = f"{result} UNSIGNED" 1198 1199 return result
def
cast_sql( self, expression: sqlglot.expressions.Cast, safe_prefix: Optional[str] = None) -> str:
1204 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1205 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1206 return self.func("TIMESTAMP", expression.this) 1207 1208 to = self.CAST_MAPPING.get(expression.to.this) 1209 1210 if to: 1211 expression.to.set("this", to) 1212 return super().cast_sql(expression)
1214 def show_sql(self, expression: exp.Show) -> str: 1215 this = f" {expression.name}" 1216 full = " FULL" if expression.args.get("full") else "" 1217 global_ = " GLOBAL" if expression.args.get("global") else "" 1218 1219 target = self.sql(expression, "target") 1220 target = f" {target}" if target else "" 1221 if expression.name in ("COLUMNS", "INDEX"): 1222 target = f" FROM{target}" 1223 elif expression.name == "GRANTS": 1224 target = f" FOR{target}" 1225 elif expression.name in ("LINKS", "PARTITIONS"): 1226 target = f" ON{target}" if target else "" 1227 elif expression.name == "PROJECTIONS": 1228 target = f" ON TABLE{target}" if target else "" 1229 1230 db = self._prefixed_sql("FROM", expression, "db") 1231 1232 like = self._prefixed_sql("LIKE", expression, "like") 1233 where = self.sql(expression, "where") 1234 1235 types = self.expressions(expression, key="types") 1236 types = f" {types}" if types else types 1237 query = self._prefixed_sql("FOR QUERY", expression, "query") 1238 1239 if expression.name == "PROFILE": 1240 offset = self._prefixed_sql("OFFSET", expression, "offset") 1241 limit = self._prefixed_sql("LIMIT", expression, "limit") 1242 else: 1243 offset = "" 1244 limit = self._oldstyle_limit_sql(expression) 1245 1246 log = self._prefixed_sql("IN", expression, "log") 1247 position = self._prefixed_sql("FROM", expression, "position") 1248 1249 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1250 1251 if expression.name == "ENGINE": 1252 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1253 else: 1254 mutex_or_status = "" 1255 1256 for_table = self._prefixed_sql("FOR TABLE", expression, "for_table") 1257 for_group = self._prefixed_sql("FOR GROUP", expression, "for_group") 1258 for_user = self._prefixed_sql("FOR USER", expression, "for_user") 1259 for_role = self._prefixed_sql("FOR ROLE", expression, "for_role") 1260 into_outfile = self._prefixed_sql("INTO OUTFILE", expression, "into_outfile") 1261 json = " JSON" if expression.args.get("json") else "" 1262 1263 return f"SHOW{full}{global_}{this}{json}{target}{for_table}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}{for_group}{for_user}{for_role}{into_outfile}"
1291 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1292 unit = expression.args.get("unit") 1293 1294 # Pick an old-enough date to avoid negative timestamp diffs 1295 start_ts = "'0000-01-01 00:00:00'" 1296 1297 # Source: https://stackoverflow.com/a/32955740 1298 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1299 interval = exp.Interval(this=timestamp_diff, unit=unit) 1300 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1301 1302 return self.sql(dateadd)
@unsupported_args('this')
def
currentschema_sql(self, expression: sqlglot.expressions.CurrentSchema) -> str:
AFTER_HAVING_MODIFIER_TRANSFORMS =
{'windows': <function Generator.<lambda>>, 'qualify': <function Generator.<lambda>>}
Inherited Members
- sqlglot.generator.Generator
- Generator
- IGNORE_NULLS_IN_FUNC
- EXCEPT_INTERSECT_SUPPORT_ALL_CLAUSE
- CREATE_FUNCTION_RETURN_AS
- MATCHED_BY_SOURCE
- SINGLE_STRING_INTERVAL
- RENAME_TABLE_WITH_DB
- GROUPINGS_SEP
- INDEX_ON
- QUERY_HINTS
- IS_BOOL_ALLOWED
- LIMIT_IS_TOP
- RETURNING_END
- EXTRACT_ALLOWS_QUOTES
- TZ_TO_WITH_TIME_ZONE
- ALTER_TABLE_INCLUDE_COLUMN_KEYWORD
- UNNEST_WITH_ORDINALITY
- AGGREGATE_FILTER_SUPPORTED
- SEMI_ANTI_JOIN_WITH_SIDE
- COMPUTED_COLUMN_WITH_TYPE
- SUPPORTS_TABLE_COPY
- TABLESAMPLE_REQUIRES_PARENS
- TABLESAMPLE_SIZE_IS_ROWS
- TABLESAMPLE_KEYWORDS
- TABLESAMPLE_WITH_METHOD
- TABLESAMPLE_SEED_KEYWORD
- COLLATE_IS_FUNC
- DATA_TYPE_SPECIFIERS_ALLOWED
- ENSURE_BOOLS
- CTE_RECURSIVE_KEYWORD_REQUIRED
- SUPPORTS_SINGLE_ARG_CONCAT
- SUPPORTS_TABLE_ALIAS_COLUMNS
- UNPIVOT_ALIASES_ARE_IDENTIFIERS
- INSERT_OVERWRITE
- SUPPORTS_SELECT_INTO
- SUPPORTS_UNLOGGED_TABLES
- SUPPORTS_CREATE_TABLE_LIKE
- LIKE_PROPERTY_INSIDE_SCHEMA
- MULTI_ARG_DISTINCT
- JSON_PATH_SINGLE_QUOTE_ESCAPE
- SUPPORTED_JSON_PATH_PARTS
- CAN_IMPLEMENT_ARRAY_ANY
- SUPPORTS_WINDOW_EXCLUDE
- SET_OP_MODIFIERS
- COPY_PARAMS_ARE_WRAPPED
- COPY_PARAMS_EQ_REQUIRED
- COPY_HAS_INTO_KEYWORD
- UNICODE_SUBSTITUTE
- STAR_EXCEPT
- HEX_FUNC
- WITH_PROPERTIES_PREFIX
- QUOTE_JSON_PATH
- SUPPORTS_EXPLODING_PROJECTIONS
- ARRAY_CONCAT_IS_VAR_LEN
- SUPPORTS_CONVERT_TIMEZONE
- SUPPORTS_UNIX_SECONDS
- ALTER_SET_WRAPPED
- NORMALIZE_EXTRACT_DATE_PARTS
- ARRAY_SIZE_NAME
- ALTER_SET_TYPE
- ARRAY_SIZE_DIM_REQUIRED
- SUPPORTS_BETWEEN_FLAGS
- SUPPORTS_LIKE_QUANTIFIERS
- MATCH_AGAINST_TABLE_PREFIX
- UNSUPPORTED_TYPES
- TIME_PART_SINGULARS
- TOKEN_MAPPING
- STRUCT_DELIMITER
- PARAMETER_TOKEN
- NAMED_PLACEHOLDER_TOKEN
- EXPRESSION_PRECEDES_PROPERTIES_CREATABLES
- WITH_SEPARATED_COMMENTS
- EXCLUDE_COMMENTS
- UNWRAPPED_INTERVAL_VALUES
- PARAMETERIZABLE_TEXT_TYPES
- EXPRESSIONS_WITHOUT_NESTED_CTES
- RESPECT_IGNORE_NULLS_UNSUPPORTED_EXPRESSIONS
- SAFE_JSON_PATH_KEY_RE
- SENTINEL_LINE_BREAK
- pretty
- identify
- normalize
- pad
- unsupported_level
- max_unsupported
- leading_comma
- max_text_width
- comments
- dialect
- normalize_functions
- unsupported_messages
- generate
- preprocess
- unsupported
- sep
- seg
- sanitize_comment
- maybe_comment
- wrap
- no_identify
- normalize_func
- indent
- sql
- uncache_sql
- cache_sql
- characterset_sql
- column_parts
- column_sql
- columnposition_sql
- columndef_sql
- columnconstraint_sql
- autoincrementcolumnconstraint_sql
- compresscolumnconstraint_sql
- generatedasidentitycolumnconstraint_sql
- generatedasrowcolumnconstraint_sql
- periodforsystemtimeconstraint_sql
- notnullcolumnconstraint_sql
- primarykeycolumnconstraint_sql
- uniquecolumnconstraint_sql
- createable_sql
- create_sql
- sequenceproperties_sql
- clone_sql
- describe_sql
- heredoc_sql
- prepend_ctes
- with_sql
- cte_sql
- tablealias_sql
- bitstring_sql
- hexstring_sql
- bytestring_sql
- unicodestring_sql
- rawstring_sql
- datatypeparam_sql
- directory_sql
- delete_sql
- drop_sql
- set_operation
- set_operations
- fetch_sql
- limitoptions_sql
- filter_sql
- hint_sql
- indexparameters_sql
- index_sql
- identifier_sql
- hex_sql
- lowerhex_sql
- inputoutputformat_sql
- national_sql
- partition_sql
- properties_sql
- root_properties
- properties
- with_properties
- locate_properties
- property_name
- property_sql
- likeproperty_sql
- fallbackproperty_sql
- journalproperty_sql
- freespaceproperty_sql
- checksumproperty_sql
- mergeblockratioproperty_sql
- datablocksizeproperty_sql
- blockcompressionproperty_sql
- isolatedloadingproperty_sql
- partitionboundspec_sql
- partitionedofproperty_sql
- lockingproperty_sql
- withdataproperty_sql
- withsystemversioningproperty_sql
- insert_sql
- introducer_sql
- kill_sql
- pseudotype_sql
- objectidentifier_sql
- onconflict_sql
- returning_sql
- rowformatdelimitedproperty_sql
- withtablehint_sql
- indextablehint_sql
- historicaldata_sql
- table_parts
- table_sql
- tablefromrows_sql
- tablesample_sql
- pivot_sql
- version_sql
- tuple_sql
- update_sql
- values_sql
- var_sql
- into_sql
- from_sql
- groupingsets_sql
- rollup_sql
- cube_sql
- group_sql
- having_sql
- connect_sql
- prior_sql
- join_sql
- lambda_sql
- lateral_op
- lateral_sql
- limit_sql
- offset_sql
- setitem_sql
- set_sql
- queryband_sql
- pragma_sql
- lock_sql
- literal_sql
- escape_str
- loaddata_sql
- null_sql
- boolean_sql
- order_sql
- withfill_sql
- cluster_sql
- distribute_sql
- sort_sql
- ordered_sql
- matchrecognizemeasure_sql
- matchrecognize_sql
- query_modifiers
- options_modifier
- for_modifiers
- queryoption_sql
- offset_limit_modifiers
- after_limit_modifiers
- select_sql
- schema_sql
- schema_columns_sql
- star_sql
- parameter_sql
- sessionparameter_sql
- placeholder_sql
- subquery_sql
- qualify_sql
- unnest_sql
- prewhere_sql
- where_sql
- window_sql
- partition_by_sql
- windowspec_sql
- withingroup_sql
- between_sql
- bracket_offset_expressions
- bracket_sql
- all_sql
- any_sql
- exists_sql
- case_sql
- constraint_sql
- nextvaluefor_sql
- trim_sql
- convert_concat_args
- concat_sql
- concatws_sql
- check_sql
- foreignkey_sql
- primarykey_sql
- if_sql
- matchagainst_sql
- jsonkeyvalue_sql
- jsonpath_sql
- json_path_part
- formatjson_sql
- formatphrase_sql
- jsonobject_sql
- jsonobjectagg_sql
- jsonarray_sql
- jsonarrayagg_sql
- jsoncolumndef_sql
- jsonschema_sql
- jsontable_sql
- openjsoncolumndef_sql
- openjson_sql
- in_sql
- in_unnest_op
- interval_sql
- return_sql
- reference_sql
- anonymous_sql
- paren_sql
- neg_sql
- not_sql
- alias_sql
- pivotalias_sql
- aliases_sql
- atindex_sql
- fromtimezone_sql
- add_sql
- and_sql
- or_sql
- xor_sql
- connector_sql
- bitwiseand_sql
- bitwiseleftshift_sql
- bitwisenot_sql
- bitwiseor_sql
- bitwiserightshift_sql
- bitwisexor_sql
- currentdate_sql
- collate_sql
- command_sql
- comment_sql
- mergetreettlaction_sql
- mergetreettl_sql
- transaction_sql
- commit_sql
- rollback_sql
- alterindex_sql
- alterdiststyle_sql
- altersortkey_sql
- alterrename_sql
- renamecolumn_sql
- alterset_sql
- alter_sql
- altersession_sql
- add_column_sql
- droppartition_sql
- addconstraint_sql
- addpartition_sql
- distinct_sql
- ignorenulls_sql
- respectnulls_sql
- havingmax_sql
- intdiv_sql
- div_sql
- safedivide_sql
- overlaps_sql
- distance_sql
- dot_sql
- eq_sql
- propertyeq_sql
- escape_sql
- glob_sql
- gt_sql
- gte_sql
- is_sql
- like_sql
- ilike_sql
- similarto_sql
- lt_sql
- lte_sql
- mod_sql
- mul_sql
- neq_sql
- nullsafeeq_sql
- nullsafeneq_sql
- slice_sql
- sub_sql
- trycast_sql
- jsoncast_sql
- try_sql
- log_sql
- use_sql
- binary
- ceil_floor
- function_fallback_sql
- func
- format_args
- too_wide
- format_time
- expressions
- op_expressions
- naked_property
- tag_sql
- token_sql
- userdefinedfunction_sql
- joinhint_sql
- kwarg_sql
- when_sql
- whens_sql
- merge_sql
- tochar_sql
- tonumber_sql
- dictproperty_sql
- dictrange_sql
- dictsubproperty_sql
- duplicatekeyproperty_sql
- uniquekeyproperty_sql
- distributedbyproperty_sql
- oncluster_sql
- clusteredbyproperty_sql
- anyvalue_sql
- querytransform_sql
- indexconstraintoption_sql
- checkcolumnconstraint_sql
- indexcolumnconstraint_sql
- nvl2_sql
- comprehension_sql
- columnprefix_sql
- opclass_sql
- predict_sql
- generateembedding_sql
- mltranslate_sql
- mlforecast_sql
- featuresattime_sql
- vectorsearch_sql
- forin_sql
- refresh_sql
- toarray_sql
- tsordstotime_sql
- tsordstotimestamp_sql
- tsordstodatetime_sql
- tsordstodate_sql
- unixdate_sql
- lastday_sql
- dateadd_sql
- arrayany_sql
- struct_sql
- partitionrange_sql
- truncatetable_sql
- convert_sql
- copyparameter_sql
- credentials_sql
- copy_sql
- semicolon_sql
- datadeletionproperty_sql
- maskingpolicycolumnconstraint_sql
- gapfill_sql
- scope_resolution
- scoperesolution_sql
- parsejson_sql
- rand_sql
- changes_sql
- pad_sql
- summarize_sql
- explodinggenerateseries_sql
- arrayconcat_sql
- json_sql
- jsonvalue_sql
- conditionalinsert_sql
- multitableinserts_sql
- oncondition_sql
- jsonextractquote_sql
- jsonexists_sql
- arrayagg_sql
- apply_sql
- grant_sql
- revoke_sql
- grantprivilege_sql
- grantprincipal_sql
- columns_sql
- overlay_sql
- todouble_sql
- string_sql
- median_sql
- overflowtruncatebehavior_sql
- unixseconds_sql
- arraysize_sql
- attach_sql
- detach_sql
- attachoption_sql
- watermarkcolumnconstraint_sql
- encodeproperty_sql
- includeproperty_sql
- xmlelement_sql
- xmlkeyvalueoption_sql
- partitionbyrangeproperty_sql
- partitionbyrangepropertydynamic_sql
- unpivotcolumns_sql
- analyzesample_sql
- analyzestatistics_sql
- analyzehistogram_sql
- analyzedelete_sql
- analyzelistchainedrows_sql
- analyzevalidate_sql
- analyze_sql
- xmltable_sql
- xmlnamespace_sql
- export_sql
- declare_sql
- declareitem_sql
- recursivewithsearch_sql
- parameterizedagg_sql
- anonymousaggfunc_sql
- combinedaggfunc_sql
- combinedparameterizedagg_sql
- install_sql
- get_put_sql
- translatecharacters_sql
- decodecase_sql
- semanticview_sql
- getextract_sql
- datefromunixdate_sql
- space_sql
- buildproperty_sql
- refreshtriggerproperty_sql
- modelattribute_sql