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 "CHARSET": TokenType.CHARACTER_SET, 195 # The DESCRIBE and EXPLAIN statements are synonyms. 196 # https://dev.mysql.com/doc/refman/8.4/en/explain.html 197 "BLOB": TokenType.BLOB, 198 "DISTINCTROW": TokenType.DISTINCT, 199 "EXPLAIN": TokenType.DESCRIBE, 200 "FORCE": TokenType.FORCE, 201 "IGNORE": TokenType.IGNORE, 202 "KEY": TokenType.KEY, 203 "LOCK TABLES": TokenType.COMMAND, 204 "LONGBLOB": TokenType.LONGBLOB, 205 "LONGTEXT": TokenType.LONGTEXT, 206 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 207 "TINYBLOB": TokenType.TINYBLOB, 208 "TINYTEXT": TokenType.TINYTEXT, 209 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 210 "MEDIUMINT": TokenType.MEDIUMINT, 211 "MEMBER OF": TokenType.MEMBER_OF, 212 "SEPARATOR": TokenType.SEPARATOR, 213 "SERIAL": TokenType.SERIAL, 214 "START": TokenType.BEGIN, 215 "SIGNED": TokenType.BIGINT, 216 "SIGNED INTEGER": TokenType.BIGINT, 217 "TIMESTAMP": TokenType.TIMESTAMPTZ, 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.SCHEMA, 275 TokenType.VALUES, 276 } 277 278 CONJUNCTION = { 279 **parser.Parser.CONJUNCTION, 280 TokenType.DAMP: exp.And, 281 TokenType.XOR: exp.Xor, 282 } 283 284 DISJUNCTION = { 285 **parser.Parser.DISJUNCTION, 286 TokenType.DPIPE: exp.Or, 287 } 288 289 TABLE_ALIAS_TOKENS = ( 290 parser.Parser.TABLE_ALIAS_TOKENS - parser.Parser.TABLE_INDEX_HINT_TOKENS 291 ) 292 293 RANGE_PARSERS = { 294 **parser.Parser.RANGE_PARSERS, 295 TokenType.MEMBER_OF: lambda self, this: self.expression( 296 exp.JSONArrayContains, 297 this=this, 298 expression=self._parse_wrapped(self._parse_expression), 299 ), 300 } 301 302 FUNCTIONS = { 303 **parser.Parser.FUNCTIONS, 304 "BIT_AND": exp.BitwiseAndAgg.from_arg_list, 305 "BIT_OR": exp.BitwiseOrAgg.from_arg_list, 306 "BIT_XOR": exp.BitwiseXorAgg.from_arg_list, 307 "BIT_COUNT": exp.BitwiseCountAgg.from_arg_list, 308 "CONVERT_TZ": lambda args: exp.ConvertTimezone( 309 source_tz=seq_get(args, 1), target_tz=seq_get(args, 2), timestamp=seq_get(args, 0) 310 ), 311 "CURDATE": exp.CurrentDate.from_arg_list, 312 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 313 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 314 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 315 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 316 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 317 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 318 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 319 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 320 "FORMAT": exp.NumberToStr.from_arg_list, 321 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 322 "ISNULL": isnull_to_is_null, 323 "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True), 324 "MAKETIME": exp.TimeFromParts.from_arg_list, 325 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 326 "MONTHNAME": lambda args: exp.TimeToStr( 327 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 328 format=exp.Literal.string("%B"), 329 ), 330 "SCHEMA": exp.CurrentSchema.from_arg_list, 331 "DATABASE": exp.CurrentSchema.from_arg_list, 332 "STR_TO_DATE": _str_to_date, 333 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 334 "TO_DAYS": lambda args: exp.paren( 335 exp.DateDiff( 336 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 337 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 338 unit=exp.var("DAY"), 339 ) 340 + 1 341 ), 342 "WEEK": lambda args: exp.Week( 343 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 344 ), 345 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 346 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 347 } 348 349 FUNCTION_PARSERS = { 350 **parser.Parser.FUNCTION_PARSERS, 351 "CHAR": lambda self: self.expression( 352 exp.Chr, 353 expressions=self._parse_csv(self._parse_assignment), 354 charset=self._match(TokenType.USING) and self._parse_var(), 355 ), 356 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 357 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 358 "VALUES": lambda self: self.expression( 359 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 360 ), 361 "JSON_VALUE": lambda self: self._parse_json_value(), 362 } 363 364 STATEMENT_PARSERS = { 365 **parser.Parser.STATEMENT_PARSERS, 366 TokenType.SHOW: lambda self: self._parse_show(), 367 } 368 369 SHOW_PARSERS = { 370 "BINARY LOGS": _show_parser("BINARY LOGS"), 371 "MASTER LOGS": _show_parser("BINARY LOGS"), 372 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 373 "CHARACTER SET": _show_parser("CHARACTER SET"), 374 "CHARSET": _show_parser("CHARACTER SET"), 375 "COLLATION": _show_parser("COLLATION"), 376 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 377 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 378 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 379 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 380 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 381 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 382 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 383 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 384 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 385 "DATABASES": _show_parser("DATABASES"), 386 "SCHEMAS": _show_parser("DATABASES"), 387 "ENGINE": _show_parser("ENGINE", target=True), 388 "STORAGE ENGINES": _show_parser("ENGINES"), 389 "ENGINES": _show_parser("ENGINES"), 390 "ERRORS": _show_parser("ERRORS"), 391 "EVENTS": _show_parser("EVENTS"), 392 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 393 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 394 "GRANTS": _show_parser("GRANTS", target="FOR"), 395 "INDEX": _show_parser("INDEX", target="FROM"), 396 "MASTER STATUS": _show_parser("MASTER STATUS"), 397 "OPEN TABLES": _show_parser("OPEN TABLES"), 398 "PLUGINS": _show_parser("PLUGINS"), 399 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 400 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 401 "PRIVILEGES": _show_parser("PRIVILEGES"), 402 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 403 "PROCESSLIST": _show_parser("PROCESSLIST"), 404 "PROFILE": _show_parser("PROFILE"), 405 "PROFILES": _show_parser("PROFILES"), 406 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 407 "REPLICAS": _show_parser("REPLICAS"), 408 "SLAVE HOSTS": _show_parser("REPLICAS"), 409 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 410 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 411 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 412 "SESSION STATUS": _show_parser("STATUS"), 413 "STATUS": _show_parser("STATUS"), 414 "TABLE STATUS": _show_parser("TABLE STATUS"), 415 "FULL TABLES": _show_parser("TABLES", full=True), 416 "TABLES": _show_parser("TABLES"), 417 "TRIGGERS": _show_parser("TRIGGERS"), 418 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 419 "SESSION VARIABLES": _show_parser("VARIABLES"), 420 "VARIABLES": _show_parser("VARIABLES"), 421 "WARNINGS": _show_parser("WARNINGS"), 422 } 423 424 PROPERTY_PARSERS = { 425 **parser.Parser.PROPERTY_PARSERS, 426 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 427 } 428 429 SET_PARSERS = { 430 **parser.Parser.SET_PARSERS, 431 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 432 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 433 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 434 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 435 "NAMES": lambda self: self._parse_set_item_names(), 436 } 437 438 CONSTRAINT_PARSERS = { 439 **parser.Parser.CONSTRAINT_PARSERS, 440 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 441 "INDEX": lambda self: self._parse_index_constraint(), 442 "KEY": lambda self: self._parse_index_constraint(), 443 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 444 } 445 446 ALTER_PARSERS = { 447 **parser.Parser.ALTER_PARSERS, 448 "MODIFY": lambda self: self._parse_alter_table_alter(), 449 } 450 451 ALTER_ALTER_PARSERS = { 452 **parser.Parser.ALTER_ALTER_PARSERS, 453 "INDEX": lambda self: self._parse_alter_table_alter_index(), 454 } 455 456 SCHEMA_UNNAMED_CONSTRAINTS = { 457 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 458 "FULLTEXT", 459 "INDEX", 460 "KEY", 461 "SPATIAL", 462 } 463 464 PROFILE_TYPES: parser.OPTIONS_TYPE = { 465 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 466 "BLOCK": ("IO",), 467 "CONTEXT": ("SWITCHES",), 468 "PAGE": ("FAULTS",), 469 } 470 471 TYPE_TOKENS = { 472 *parser.Parser.TYPE_TOKENS, 473 TokenType.SET, 474 } 475 476 ENUM_TYPE_TOKENS = { 477 *parser.Parser.ENUM_TYPE_TOKENS, 478 TokenType.SET, 479 } 480 481 # SELECT [ ALL | DISTINCT | DISTINCTROW ] [ <OPERATION_MODIFIERS> ] 482 OPERATION_MODIFIERS = { 483 "HIGH_PRIORITY", 484 "STRAIGHT_JOIN", 485 "SQL_SMALL_RESULT", 486 "SQL_BIG_RESULT", 487 "SQL_BUFFER_RESULT", 488 "SQL_NO_CACHE", 489 "SQL_CALC_FOUND_ROWS", 490 } 491 492 LOG_DEFAULTS_TO_LN = True 493 STRING_ALIASES = True 494 VALUES_FOLLOWED_BY_PAREN = False 495 SUPPORTS_PARTITION_SELECTION = True 496 497 def _parse_generated_as_identity( 498 self, 499 ) -> ( 500 exp.GeneratedAsIdentityColumnConstraint 501 | exp.ComputedColumnConstraint 502 | exp.GeneratedAsRowColumnConstraint 503 ): 504 this = super()._parse_generated_as_identity() 505 506 if self._match_texts(("STORED", "VIRTUAL")): 507 persisted = self._prev.text.upper() == "STORED" 508 509 if isinstance(this, exp.ComputedColumnConstraint): 510 this.set("persisted", persisted) 511 elif isinstance(this, exp.GeneratedAsIdentityColumnConstraint): 512 this = self.expression( 513 exp.ComputedColumnConstraint, this=this.expression, persisted=persisted 514 ) 515 516 return this 517 518 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 519 this = self._parse_id_var() 520 if not self._match(TokenType.L_PAREN): 521 return this 522 523 expression = self._parse_number() 524 self._match_r_paren() 525 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 526 527 def _parse_index_constraint( 528 self, kind: t.Optional[str] = None 529 ) -> exp.IndexColumnConstraint: 530 if kind: 531 self._match_texts(("INDEX", "KEY")) 532 533 this = self._parse_id_var(any_token=False) 534 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 535 expressions = self._parse_wrapped_csv(self._parse_ordered) 536 537 options = [] 538 while True: 539 if self._match_text_seq("KEY_BLOCK_SIZE"): 540 self._match(TokenType.EQ) 541 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 542 elif self._match(TokenType.USING): 543 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 544 elif self._match_text_seq("WITH", "PARSER"): 545 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 546 elif self._match(TokenType.COMMENT): 547 opt = exp.IndexConstraintOption(comment=self._parse_string()) 548 elif self._match_text_seq("VISIBLE"): 549 opt = exp.IndexConstraintOption(visible=True) 550 elif self._match_text_seq("INVISIBLE"): 551 opt = exp.IndexConstraintOption(visible=False) 552 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 553 self._match(TokenType.EQ) 554 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 555 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 556 self._match(TokenType.EQ) 557 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 558 else: 559 opt = None 560 561 if not opt: 562 break 563 564 options.append(opt) 565 566 return self.expression( 567 exp.IndexColumnConstraint, 568 this=this, 569 expressions=expressions, 570 kind=kind, 571 index_type=index_type, 572 options=options, 573 ) 574 575 def _parse_show_mysql( 576 self, 577 this: str, 578 target: bool | str = False, 579 full: t.Optional[bool] = None, 580 global_: t.Optional[bool] = None, 581 ) -> exp.Show: 582 if target: 583 if isinstance(target, str): 584 self._match_text_seq(target) 585 target_id = self._parse_id_var() 586 else: 587 target_id = None 588 589 log = self._parse_string() if self._match_text_seq("IN") else None 590 591 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 592 position = self._parse_number() if self._match_text_seq("FROM") else None 593 db = None 594 else: 595 position = None 596 db = None 597 598 if self._match(TokenType.FROM): 599 db = self._parse_id_var() 600 elif self._match(TokenType.DOT): 601 db = target_id 602 target_id = self._parse_id_var() 603 604 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 605 606 like = self._parse_string() if self._match_text_seq("LIKE") else None 607 where = self._parse_where() 608 609 if this == "PROFILE": 610 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 611 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 612 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 613 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 614 else: 615 types, query = None, None 616 offset, limit = self._parse_oldstyle_limit() 617 618 mutex = True if self._match_text_seq("MUTEX") else None 619 mutex = False if self._match_text_seq("STATUS") else mutex 620 621 return self.expression( 622 exp.Show, 623 this=this, 624 target=target_id, 625 full=full, 626 log=log, 627 position=position, 628 db=db, 629 channel=channel, 630 like=like, 631 where=where, 632 types=types, 633 query=query, 634 offset=offset, 635 limit=limit, 636 mutex=mutex, 637 **{"global": global_}, # type: ignore 638 ) 639 640 def _parse_oldstyle_limit( 641 self, 642 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 643 limit = None 644 offset = None 645 if self._match_text_seq("LIMIT"): 646 parts = self._parse_csv(self._parse_number) 647 if len(parts) == 1: 648 limit = parts[0] 649 elif len(parts) == 2: 650 limit = parts[1] 651 offset = parts[0] 652 653 return offset, limit 654 655 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 656 this = self._parse_string() or self._parse_unquoted_field() 657 return self.expression(exp.SetItem, this=this, kind=kind) 658 659 def _parse_set_item_names(self) -> exp.Expression: 660 charset = self._parse_string() or self._parse_unquoted_field() 661 if self._match_text_seq("COLLATE"): 662 collate = self._parse_string() or self._parse_unquoted_field() 663 else: 664 collate = None 665 666 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 667 668 def _parse_type( 669 self, parse_interval: bool = True, fallback_to_identifier: bool = False 670 ) -> t.Optional[exp.Expression]: 671 # mysql binary is special and can work anywhere, even in order by operations 672 # it operates like a no paren func 673 if self._match(TokenType.BINARY, advance=False): 674 data_type = self._parse_types(check_func=True, allow_identifiers=False) 675 676 if isinstance(data_type, exp.DataType): 677 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 678 679 return super()._parse_type( 680 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 681 ) 682 683 def _parse_alter_table_alter_index(self) -> exp.AlterIndex: 684 index = self._parse_field(any_token=True) 685 686 if self._match_text_seq("VISIBLE"): 687 visible = True 688 elif self._match_text_seq("INVISIBLE"): 689 visible = False 690 else: 691 visible = None 692 693 return self.expression(exp.AlterIndex, this=index, visible=visible) 694 695 class Generator(generator.Generator): 696 INTERVAL_ALLOWS_PLURAL_FORM = False 697 LOCKING_READS_SUPPORTED = True 698 NULL_ORDERING_SUPPORTED: t.Optional[bool] = None 699 JOIN_HINTS = False 700 TABLE_HINTS = True 701 DUPLICATE_KEY_UPDATE_WITH_SET = False 702 QUERY_HINT_SEP = " " 703 VALUES_AS_TABLE = False 704 NVL2_SUPPORTED = False 705 LAST_DAY_SUPPORTS_DATE_PART = False 706 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 707 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 708 JSON_KEY_VALUE_PAIR_SEP = "," 709 SUPPORTS_TO_NUMBER = False 710 PARSE_JSON_NAME: t.Optional[str] = None 711 PAD_FILL_PATTERN_IS_REQUIRED = True 712 WRAP_DERIVED_VALUES = False 713 VARCHAR_REQUIRES_SIZE = True 714 SUPPORTS_MEDIAN = False 715 716 TRANSFORMS = { 717 **generator.Generator.TRANSFORMS, 718 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 719 exp.BitwiseAndAgg: rename_func("BIT_AND"), 720 exp.BitwiseOrAgg: rename_func("BIT_OR"), 721 exp.BitwiseXorAgg: rename_func("BIT_XOR"), 722 exp.BitwiseCountAgg: rename_func("BIT_COUNT"), 723 exp.CurrentDate: no_paren_current_date_sql, 724 exp.DateDiff: _remove_ts_or_ds_to_date( 725 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 726 ), 727 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 728 exp.DateStrToDate: datestrtodate_sql, 729 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 730 exp.DateTrunc: _date_trunc_sql, 731 exp.Day: _remove_ts_or_ds_to_date(), 732 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 733 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 734 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 735 exp.GroupConcat: lambda self, 736 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 737 exp.ILike: no_ilike_sql, 738 exp.JSONExtractScalar: arrow_json_extract_sql, 739 exp.Length: length_or_char_length_sql, 740 exp.LogicalOr: rename_func("MAX"), 741 exp.LogicalAnd: rename_func("MIN"), 742 exp.Max: max_or_greatest, 743 exp.Min: min_or_least, 744 exp.Month: _remove_ts_or_ds_to_date(), 745 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 746 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 747 exp.NumberToStr: rename_func("FORMAT"), 748 exp.Pivot: no_pivot_sql, 749 exp.Select: transforms.preprocess( 750 [ 751 transforms.eliminate_distinct_on, 752 transforms.eliminate_semi_and_anti_joins, 753 transforms.eliminate_qualify, 754 transforms.eliminate_full_outer_join, 755 transforms.unnest_generate_date_array_using_recursive_cte, 756 ] 757 ), 758 exp.StrPosition: lambda self, e: strposition_sql( 759 self, e, func_name="LOCATE", supports_position=True 760 ), 761 exp.StrToDate: _str_to_date_sql, 762 exp.StrToTime: _str_to_date_sql, 763 exp.Stuff: rename_func("INSERT"), 764 exp.TableSample: no_tablesample_sql, 765 exp.TimeFromParts: rename_func("MAKETIME"), 766 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 767 exp.TimestampDiff: lambda self, e: self.func( 768 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 769 ), 770 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 771 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 772 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 773 self, 774 e, 775 include_precision=not e.args.get("zone"), 776 ), 777 exp.TimeToStr: _remove_ts_or_ds_to_date( 778 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 779 ), 780 exp.Trim: trim_sql, 781 exp.TryCast: no_trycast_sql, 782 exp.TsOrDsAdd: date_add_sql("ADD"), 783 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 784 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 785 exp.Unicode: lambda self, e: f"ORD(CONVERT({self.sql(e.this)} USING utf32))", 786 exp.UnixToTime: _unix_to_time_sql, 787 exp.Week: _remove_ts_or_ds_to_date(), 788 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 789 exp.Year: _remove_ts_or_ds_to_date(), 790 exp.UtcTimestamp: rename_func("UTC_TIMESTAMP"), 791 exp.UtcTime: rename_func("UTC_TIME"), 792 } 793 794 UNSIGNED_TYPE_MAPPING = { 795 exp.DataType.Type.UBIGINT: "BIGINT", 796 exp.DataType.Type.UINT: "INT", 797 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 798 exp.DataType.Type.USMALLINT: "SMALLINT", 799 exp.DataType.Type.UTINYINT: "TINYINT", 800 exp.DataType.Type.UDECIMAL: "DECIMAL", 801 exp.DataType.Type.UDOUBLE: "DOUBLE", 802 } 803 804 TIMESTAMP_TYPE_MAPPING = { 805 exp.DataType.Type.DATETIME2: "DATETIME", 806 exp.DataType.Type.SMALLDATETIME: "DATETIME", 807 exp.DataType.Type.TIMESTAMP: "DATETIME", 808 exp.DataType.Type.TIMESTAMPNTZ: "DATETIME", 809 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 810 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 811 } 812 813 TYPE_MAPPING = { 814 **generator.Generator.TYPE_MAPPING, 815 **UNSIGNED_TYPE_MAPPING, 816 **TIMESTAMP_TYPE_MAPPING, 817 } 818 819 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 820 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 821 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 822 TYPE_MAPPING.pop(exp.DataType.Type.BLOB) 823 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 824 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 825 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 826 827 PROPERTIES_LOCATION = { 828 **generator.Generator.PROPERTIES_LOCATION, 829 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 830 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 831 } 832 833 LIMIT_FETCH = "LIMIT" 834 835 LIMIT_ONLY_LITERALS = True 836 837 CHAR_CAST_MAPPING = dict.fromkeys( 838 ( 839 exp.DataType.Type.LONGTEXT, 840 exp.DataType.Type.LONGBLOB, 841 exp.DataType.Type.MEDIUMBLOB, 842 exp.DataType.Type.MEDIUMTEXT, 843 exp.DataType.Type.TEXT, 844 exp.DataType.Type.TINYBLOB, 845 exp.DataType.Type.TINYTEXT, 846 exp.DataType.Type.VARCHAR, 847 ), 848 "CHAR", 849 ) 850 SIGNED_CAST_MAPPING = dict.fromkeys( 851 ( 852 exp.DataType.Type.BIGINT, 853 exp.DataType.Type.BOOLEAN, 854 exp.DataType.Type.INT, 855 exp.DataType.Type.SMALLINT, 856 exp.DataType.Type.TINYINT, 857 exp.DataType.Type.MEDIUMINT, 858 ), 859 "SIGNED", 860 ) 861 862 # MySQL doesn't support many datatypes in cast. 863 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 864 CAST_MAPPING = { 865 **CHAR_CAST_MAPPING, 866 **SIGNED_CAST_MAPPING, 867 exp.DataType.Type.UBIGINT: "UNSIGNED", 868 } 869 870 TIMESTAMP_FUNC_TYPES = { 871 exp.DataType.Type.TIMESTAMPTZ, 872 exp.DataType.Type.TIMESTAMPLTZ, 873 } 874 875 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 876 RESERVED_KEYWORDS = { 877 "accessible", 878 "add", 879 "all", 880 "alter", 881 "analyze", 882 "and", 883 "as", 884 "asc", 885 "asensitive", 886 "before", 887 "between", 888 "bigint", 889 "binary", 890 "blob", 891 "both", 892 "by", 893 "call", 894 "cascade", 895 "case", 896 "change", 897 "char", 898 "character", 899 "check", 900 "collate", 901 "column", 902 "condition", 903 "constraint", 904 "continue", 905 "convert", 906 "create", 907 "cross", 908 "cube", 909 "cume_dist", 910 "current_date", 911 "current_time", 912 "current_timestamp", 913 "current_user", 914 "cursor", 915 "database", 916 "databases", 917 "day_hour", 918 "day_microsecond", 919 "day_minute", 920 "day_second", 921 "dec", 922 "decimal", 923 "declare", 924 "default", 925 "delayed", 926 "delete", 927 "dense_rank", 928 "desc", 929 "describe", 930 "deterministic", 931 "distinct", 932 "distinctrow", 933 "div", 934 "double", 935 "drop", 936 "dual", 937 "each", 938 "else", 939 "elseif", 940 "empty", 941 "enclosed", 942 "escaped", 943 "except", 944 "exists", 945 "exit", 946 "explain", 947 "false", 948 "fetch", 949 "first_value", 950 "float", 951 "float4", 952 "float8", 953 "for", 954 "force", 955 "foreign", 956 "from", 957 "fulltext", 958 "function", 959 "generated", 960 "get", 961 "grant", 962 "group", 963 "grouping", 964 "groups", 965 "having", 966 "high_priority", 967 "hour_microsecond", 968 "hour_minute", 969 "hour_second", 970 "if", 971 "ignore", 972 "in", 973 "index", 974 "infile", 975 "inner", 976 "inout", 977 "insensitive", 978 "insert", 979 "int", 980 "int1", 981 "int2", 982 "int3", 983 "int4", 984 "int8", 985 "integer", 986 "intersect", 987 "interval", 988 "into", 989 "io_after_gtids", 990 "io_before_gtids", 991 "is", 992 "iterate", 993 "join", 994 "json_table", 995 "key", 996 "keys", 997 "kill", 998 "lag", 999 "last_value", 1000 "lateral", 1001 "lead", 1002 "leading", 1003 "leave", 1004 "left", 1005 "like", 1006 "limit", 1007 "linear", 1008 "lines", 1009 "load", 1010 "localtime", 1011 "localtimestamp", 1012 "lock", 1013 "long", 1014 "longblob", 1015 "longtext", 1016 "loop", 1017 "low_priority", 1018 "master_bind", 1019 "master_ssl_verify_server_cert", 1020 "match", 1021 "maxvalue", 1022 "mediumblob", 1023 "mediumint", 1024 "mediumtext", 1025 "middleint", 1026 "minute_microsecond", 1027 "minute_second", 1028 "mod", 1029 "modifies", 1030 "natural", 1031 "not", 1032 "no_write_to_binlog", 1033 "nth_value", 1034 "ntile", 1035 "null", 1036 "numeric", 1037 "of", 1038 "on", 1039 "optimize", 1040 "optimizer_costs", 1041 "option", 1042 "optionally", 1043 "or", 1044 "order", 1045 "out", 1046 "outer", 1047 "outfile", 1048 "over", 1049 "partition", 1050 "percent_rank", 1051 "precision", 1052 "primary", 1053 "procedure", 1054 "purge", 1055 "range", 1056 "rank", 1057 "read", 1058 "reads", 1059 "read_write", 1060 "real", 1061 "recursive", 1062 "references", 1063 "regexp", 1064 "release", 1065 "rename", 1066 "repeat", 1067 "replace", 1068 "require", 1069 "resignal", 1070 "restrict", 1071 "return", 1072 "revoke", 1073 "right", 1074 "rlike", 1075 "row", 1076 "rows", 1077 "row_number", 1078 "schema", 1079 "schemas", 1080 "second_microsecond", 1081 "select", 1082 "sensitive", 1083 "separator", 1084 "set", 1085 "show", 1086 "signal", 1087 "smallint", 1088 "spatial", 1089 "specific", 1090 "sql", 1091 "sqlexception", 1092 "sqlstate", 1093 "sqlwarning", 1094 "sql_big_result", 1095 "sql_calc_found_rows", 1096 "sql_small_result", 1097 "ssl", 1098 "starting", 1099 "stored", 1100 "straight_join", 1101 "system", 1102 "table", 1103 "terminated", 1104 "then", 1105 "tinyblob", 1106 "tinyint", 1107 "tinytext", 1108 "to", 1109 "trailing", 1110 "trigger", 1111 "true", 1112 "undo", 1113 "union", 1114 "unique", 1115 "unlock", 1116 "unsigned", 1117 "update", 1118 "usage", 1119 "use", 1120 "using", 1121 "utc_date", 1122 "utc_time", 1123 "utc_timestamp", 1124 "values", 1125 "varbinary", 1126 "varchar", 1127 "varcharacter", 1128 "varying", 1129 "virtual", 1130 "when", 1131 "where", 1132 "while", 1133 "window", 1134 "with", 1135 "write", 1136 "xor", 1137 "year_month", 1138 "zerofill", 1139 } 1140 1141 def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str: 1142 persisted = "STORED" if expression.args.get("persisted") else "VIRTUAL" 1143 return f"GENERATED ALWAYS AS ({self.sql(expression.this.unnest())}) {persisted}" 1144 1145 def array_sql(self, expression: exp.Array) -> str: 1146 self.unsupported("Arrays are not supported by MySQL") 1147 return self.function_fallback_sql(expression) 1148 1149 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1150 self.unsupported("Array operations are not supported by MySQL") 1151 return self.function_fallback_sql(expression) 1152 1153 def dpipe_sql(self, expression: exp.DPipe) -> str: 1154 return self.func("CONCAT", *expression.flatten()) 1155 1156 def extract_sql(self, expression: exp.Extract) -> str: 1157 unit = expression.name 1158 if unit and unit.lower() == "epoch": 1159 return self.func("UNIX_TIMESTAMP", expression.expression) 1160 1161 return super().extract_sql(expression) 1162 1163 def datatype_sql(self, expression: exp.DataType) -> str: 1164 if ( 1165 self.VARCHAR_REQUIRES_SIZE 1166 and expression.is_type(exp.DataType.Type.VARCHAR) 1167 and not expression.expressions 1168 ): 1169 # `VARCHAR` must always have a size - if it doesn't, we always generate `TEXT` 1170 return "TEXT" 1171 1172 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1173 result = super().datatype_sql(expression) 1174 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1175 result = f"{result} UNSIGNED" 1176 1177 return result 1178 1179 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1180 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1181 1182 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1183 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1184 return self.func("TIMESTAMP", expression.this) 1185 1186 to = self.CAST_MAPPING.get(expression.to.this) 1187 1188 if to: 1189 expression.to.set("this", to) 1190 return super().cast_sql(expression) 1191 1192 def show_sql(self, expression: exp.Show) -> str: 1193 this = f" {expression.name}" 1194 full = " FULL" if expression.args.get("full") else "" 1195 global_ = " GLOBAL" if expression.args.get("global") else "" 1196 1197 target = self.sql(expression, "target") 1198 target = f" {target}" if target else "" 1199 if expression.name in ("COLUMNS", "INDEX"): 1200 target = f" FROM{target}" 1201 elif expression.name == "GRANTS": 1202 target = f" FOR{target}" 1203 1204 db = self._prefixed_sql("FROM", expression, "db") 1205 1206 like = self._prefixed_sql("LIKE", expression, "like") 1207 where = self.sql(expression, "where") 1208 1209 types = self.expressions(expression, key="types") 1210 types = f" {types}" if types else types 1211 query = self._prefixed_sql("FOR QUERY", expression, "query") 1212 1213 if expression.name == "PROFILE": 1214 offset = self._prefixed_sql("OFFSET", expression, "offset") 1215 limit = self._prefixed_sql("LIMIT", expression, "limit") 1216 else: 1217 offset = "" 1218 limit = self._oldstyle_limit_sql(expression) 1219 1220 log = self._prefixed_sql("IN", expression, "log") 1221 position = self._prefixed_sql("FROM", expression, "position") 1222 1223 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1224 1225 if expression.name == "ENGINE": 1226 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1227 else: 1228 mutex_or_status = "" 1229 1230 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1231 1232 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1233 dtype = self.sql(expression, "dtype") 1234 if not dtype: 1235 return super().altercolumn_sql(expression) 1236 1237 this = self.sql(expression, "this") 1238 return f"MODIFY COLUMN {this} {dtype}" 1239 1240 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1241 sql = self.sql(expression, arg) 1242 return f" {prefix} {sql}" if sql else "" 1243 1244 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1245 limit = self.sql(expression, "limit") 1246 offset = self.sql(expression, "offset") 1247 if limit: 1248 limit_offset = f"{offset}, {limit}" if offset else limit 1249 return f" LIMIT {limit_offset}" 1250 return "" 1251 1252 def chr_sql(self, expression: exp.Chr) -> str: 1253 this = self.expressions(sqls=[expression.this] + expression.expressions) 1254 charset = expression.args.get("charset") 1255 using = f" USING {self.sql(charset)}" if charset else "" 1256 return f"CHAR({this}{using})" 1257 1258 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1259 unit = expression.args.get("unit") 1260 1261 # Pick an old-enough date to avoid negative timestamp diffs 1262 start_ts = "'0000-01-01 00:00:00'" 1263 1264 # Source: https://stackoverflow.com/a/32955740 1265 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1266 interval = exp.Interval(this=timestamp_diff, unit=unit) 1267 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1268 1269 return self.sql(dateadd) 1270 1271 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1272 from_tz = expression.args.get("source_tz") 1273 to_tz = expression.args.get("target_tz") 1274 dt = expression.args.get("timestamp") 1275 1276 return self.func("CONVERT_TZ", dt, from_tz, to_tz) 1277 1278 def attimezone_sql(self, expression: exp.AtTimeZone) -> str: 1279 self.unsupported("AT TIME ZONE is not supported by MySQL") 1280 return self.sql(expression.this) 1281 1282 def isascii_sql(self, expression: exp.IsAscii) -> str: 1283 return f"REGEXP_LIKE({self.sql(expression.this)}, '^[[:ascii:]]*$')" 1284 1285 @unsupported_args("this") 1286 def currentschema_sql(self, expression: exp.CurrentSchema) -> str: 1287 return self.func("SCHEMA")
TIME_SPECIFIERS =
{'k', 'p', 'r', 'h', 'f', 'H', 'S', 'l', 'I', 'i', 'T', 's'}
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 "CHARSET": TokenType.CHARACTER_SET, 196 # The DESCRIBE and EXPLAIN statements are synonyms. 197 # https://dev.mysql.com/doc/refman/8.4/en/explain.html 198 "BLOB": TokenType.BLOB, 199 "DISTINCTROW": TokenType.DISTINCT, 200 "EXPLAIN": TokenType.DESCRIBE, 201 "FORCE": TokenType.FORCE, 202 "IGNORE": TokenType.IGNORE, 203 "KEY": TokenType.KEY, 204 "LOCK TABLES": TokenType.COMMAND, 205 "LONGBLOB": TokenType.LONGBLOB, 206 "LONGTEXT": TokenType.LONGTEXT, 207 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 208 "TINYBLOB": TokenType.TINYBLOB, 209 "TINYTEXT": TokenType.TINYTEXT, 210 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 211 "MEDIUMINT": TokenType.MEDIUMINT, 212 "MEMBER OF": TokenType.MEMBER_OF, 213 "SEPARATOR": TokenType.SEPARATOR, 214 "SERIAL": TokenType.SERIAL, 215 "START": TokenType.BEGIN, 216 "SIGNED": TokenType.BIGINT, 217 "SIGNED INTEGER": TokenType.BIGINT, 218 "TIMESTAMP": TokenType.TIMESTAMPTZ, 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.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.MEMBER_OF: lambda self, this: self.expression( 297 exp.JSONArrayContains, 298 this=this, 299 expression=self._parse_wrapped(self._parse_expression), 300 ), 301 } 302 303 FUNCTIONS = { 304 **parser.Parser.FUNCTIONS, 305 "BIT_AND": exp.BitwiseAndAgg.from_arg_list, 306 "BIT_OR": exp.BitwiseOrAgg.from_arg_list, 307 "BIT_XOR": exp.BitwiseXorAgg.from_arg_list, 308 "BIT_COUNT": exp.BitwiseCountAgg.from_arg_list, 309 "CONVERT_TZ": lambda args: exp.ConvertTimezone( 310 source_tz=seq_get(args, 1), target_tz=seq_get(args, 2), timestamp=seq_get(args, 0) 311 ), 312 "CURDATE": exp.CurrentDate.from_arg_list, 313 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 314 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 315 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 316 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 317 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 318 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 319 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 320 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 321 "FORMAT": exp.NumberToStr.from_arg_list, 322 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 323 "ISNULL": isnull_to_is_null, 324 "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True), 325 "MAKETIME": exp.TimeFromParts.from_arg_list, 326 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 327 "MONTHNAME": lambda args: exp.TimeToStr( 328 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 329 format=exp.Literal.string("%B"), 330 ), 331 "SCHEMA": exp.CurrentSchema.from_arg_list, 332 "DATABASE": exp.CurrentSchema.from_arg_list, 333 "STR_TO_DATE": _str_to_date, 334 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 335 "TO_DAYS": lambda args: exp.paren( 336 exp.DateDiff( 337 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 338 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 339 unit=exp.var("DAY"), 340 ) 341 + 1 342 ), 343 "WEEK": lambda args: exp.Week( 344 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 345 ), 346 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 347 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 348 } 349 350 FUNCTION_PARSERS = { 351 **parser.Parser.FUNCTION_PARSERS, 352 "CHAR": lambda self: self.expression( 353 exp.Chr, 354 expressions=self._parse_csv(self._parse_assignment), 355 charset=self._match(TokenType.USING) and self._parse_var(), 356 ), 357 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 358 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 359 "VALUES": lambda self: self.expression( 360 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 361 ), 362 "JSON_VALUE": lambda self: self._parse_json_value(), 363 } 364 365 STATEMENT_PARSERS = { 366 **parser.Parser.STATEMENT_PARSERS, 367 TokenType.SHOW: lambda self: self._parse_show(), 368 } 369 370 SHOW_PARSERS = { 371 "BINARY LOGS": _show_parser("BINARY LOGS"), 372 "MASTER LOGS": _show_parser("BINARY LOGS"), 373 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 374 "CHARACTER SET": _show_parser("CHARACTER SET"), 375 "CHARSET": _show_parser("CHARACTER SET"), 376 "COLLATION": _show_parser("COLLATION"), 377 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 378 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 379 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 380 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 381 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 382 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 383 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 384 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 385 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 386 "DATABASES": _show_parser("DATABASES"), 387 "SCHEMAS": _show_parser("DATABASES"), 388 "ENGINE": _show_parser("ENGINE", target=True), 389 "STORAGE ENGINES": _show_parser("ENGINES"), 390 "ENGINES": _show_parser("ENGINES"), 391 "ERRORS": _show_parser("ERRORS"), 392 "EVENTS": _show_parser("EVENTS"), 393 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 394 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 395 "GRANTS": _show_parser("GRANTS", target="FOR"), 396 "INDEX": _show_parser("INDEX", target="FROM"), 397 "MASTER STATUS": _show_parser("MASTER STATUS"), 398 "OPEN TABLES": _show_parser("OPEN TABLES"), 399 "PLUGINS": _show_parser("PLUGINS"), 400 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 401 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 402 "PRIVILEGES": _show_parser("PRIVILEGES"), 403 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 404 "PROCESSLIST": _show_parser("PROCESSLIST"), 405 "PROFILE": _show_parser("PROFILE"), 406 "PROFILES": _show_parser("PROFILES"), 407 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 408 "REPLICAS": _show_parser("REPLICAS"), 409 "SLAVE HOSTS": _show_parser("REPLICAS"), 410 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 411 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 412 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 413 "SESSION STATUS": _show_parser("STATUS"), 414 "STATUS": _show_parser("STATUS"), 415 "TABLE STATUS": _show_parser("TABLE STATUS"), 416 "FULL TABLES": _show_parser("TABLES", full=True), 417 "TABLES": _show_parser("TABLES"), 418 "TRIGGERS": _show_parser("TRIGGERS"), 419 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 420 "SESSION VARIABLES": _show_parser("VARIABLES"), 421 "VARIABLES": _show_parser("VARIABLES"), 422 "WARNINGS": _show_parser("WARNINGS"), 423 } 424 425 PROPERTY_PARSERS = { 426 **parser.Parser.PROPERTY_PARSERS, 427 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 428 } 429 430 SET_PARSERS = { 431 **parser.Parser.SET_PARSERS, 432 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 433 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 434 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 435 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 436 "NAMES": lambda self: self._parse_set_item_names(), 437 } 438 439 CONSTRAINT_PARSERS = { 440 **parser.Parser.CONSTRAINT_PARSERS, 441 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 442 "INDEX": lambda self: self._parse_index_constraint(), 443 "KEY": lambda self: self._parse_index_constraint(), 444 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 445 } 446 447 ALTER_PARSERS = { 448 **parser.Parser.ALTER_PARSERS, 449 "MODIFY": lambda self: self._parse_alter_table_alter(), 450 } 451 452 ALTER_ALTER_PARSERS = { 453 **parser.Parser.ALTER_ALTER_PARSERS, 454 "INDEX": lambda self: self._parse_alter_table_alter_index(), 455 } 456 457 SCHEMA_UNNAMED_CONSTRAINTS = { 458 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 459 "FULLTEXT", 460 "INDEX", 461 "KEY", 462 "SPATIAL", 463 } 464 465 PROFILE_TYPES: parser.OPTIONS_TYPE = { 466 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 467 "BLOCK": ("IO",), 468 "CONTEXT": ("SWITCHES",), 469 "PAGE": ("FAULTS",), 470 } 471 472 TYPE_TOKENS = { 473 *parser.Parser.TYPE_TOKENS, 474 TokenType.SET, 475 } 476 477 ENUM_TYPE_TOKENS = { 478 *parser.Parser.ENUM_TYPE_TOKENS, 479 TokenType.SET, 480 } 481 482 # SELECT [ ALL | DISTINCT | DISTINCTROW ] [ <OPERATION_MODIFIERS> ] 483 OPERATION_MODIFIERS = { 484 "HIGH_PRIORITY", 485 "STRAIGHT_JOIN", 486 "SQL_SMALL_RESULT", 487 "SQL_BIG_RESULT", 488 "SQL_BUFFER_RESULT", 489 "SQL_NO_CACHE", 490 "SQL_CALC_FOUND_ROWS", 491 } 492 493 LOG_DEFAULTS_TO_LN = True 494 STRING_ALIASES = True 495 VALUES_FOLLOWED_BY_PAREN = False 496 SUPPORTS_PARTITION_SELECTION = True 497 498 def _parse_generated_as_identity( 499 self, 500 ) -> ( 501 exp.GeneratedAsIdentityColumnConstraint 502 | exp.ComputedColumnConstraint 503 | exp.GeneratedAsRowColumnConstraint 504 ): 505 this = super()._parse_generated_as_identity() 506 507 if self._match_texts(("STORED", "VIRTUAL")): 508 persisted = self._prev.text.upper() == "STORED" 509 510 if isinstance(this, exp.ComputedColumnConstraint): 511 this.set("persisted", persisted) 512 elif isinstance(this, exp.GeneratedAsIdentityColumnConstraint): 513 this = self.expression( 514 exp.ComputedColumnConstraint, this=this.expression, persisted=persisted 515 ) 516 517 return this 518 519 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 520 this = self._parse_id_var() 521 if not self._match(TokenType.L_PAREN): 522 return this 523 524 expression = self._parse_number() 525 self._match_r_paren() 526 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 527 528 def _parse_index_constraint( 529 self, kind: t.Optional[str] = None 530 ) -> exp.IndexColumnConstraint: 531 if kind: 532 self._match_texts(("INDEX", "KEY")) 533 534 this = self._parse_id_var(any_token=False) 535 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 536 expressions = self._parse_wrapped_csv(self._parse_ordered) 537 538 options = [] 539 while True: 540 if self._match_text_seq("KEY_BLOCK_SIZE"): 541 self._match(TokenType.EQ) 542 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 543 elif self._match(TokenType.USING): 544 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 545 elif self._match_text_seq("WITH", "PARSER"): 546 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 547 elif self._match(TokenType.COMMENT): 548 opt = exp.IndexConstraintOption(comment=self._parse_string()) 549 elif self._match_text_seq("VISIBLE"): 550 opt = exp.IndexConstraintOption(visible=True) 551 elif self._match_text_seq("INVISIBLE"): 552 opt = exp.IndexConstraintOption(visible=False) 553 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 554 self._match(TokenType.EQ) 555 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 556 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 557 self._match(TokenType.EQ) 558 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 559 else: 560 opt = None 561 562 if not opt: 563 break 564 565 options.append(opt) 566 567 return self.expression( 568 exp.IndexColumnConstraint, 569 this=this, 570 expressions=expressions, 571 kind=kind, 572 index_type=index_type, 573 options=options, 574 ) 575 576 def _parse_show_mysql( 577 self, 578 this: str, 579 target: bool | str = False, 580 full: t.Optional[bool] = None, 581 global_: t.Optional[bool] = None, 582 ) -> exp.Show: 583 if target: 584 if isinstance(target, str): 585 self._match_text_seq(target) 586 target_id = self._parse_id_var() 587 else: 588 target_id = None 589 590 log = self._parse_string() if self._match_text_seq("IN") else None 591 592 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 593 position = self._parse_number() if self._match_text_seq("FROM") else None 594 db = None 595 else: 596 position = None 597 db = None 598 599 if self._match(TokenType.FROM): 600 db = self._parse_id_var() 601 elif self._match(TokenType.DOT): 602 db = target_id 603 target_id = self._parse_id_var() 604 605 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 606 607 like = self._parse_string() if self._match_text_seq("LIKE") else None 608 where = self._parse_where() 609 610 if this == "PROFILE": 611 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 612 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 613 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 614 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 615 else: 616 types, query = None, None 617 offset, limit = self._parse_oldstyle_limit() 618 619 mutex = True if self._match_text_seq("MUTEX") else None 620 mutex = False if self._match_text_seq("STATUS") else mutex 621 622 return self.expression( 623 exp.Show, 624 this=this, 625 target=target_id, 626 full=full, 627 log=log, 628 position=position, 629 db=db, 630 channel=channel, 631 like=like, 632 where=where, 633 types=types, 634 query=query, 635 offset=offset, 636 limit=limit, 637 mutex=mutex, 638 **{"global": global_}, # type: ignore 639 ) 640 641 def _parse_oldstyle_limit( 642 self, 643 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 644 limit = None 645 offset = None 646 if self._match_text_seq("LIMIT"): 647 parts = self._parse_csv(self._parse_number) 648 if len(parts) == 1: 649 limit = parts[0] 650 elif len(parts) == 2: 651 limit = parts[1] 652 offset = parts[0] 653 654 return offset, limit 655 656 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 657 this = self._parse_string() or self._parse_unquoted_field() 658 return self.expression(exp.SetItem, this=this, kind=kind) 659 660 def _parse_set_item_names(self) -> exp.Expression: 661 charset = self._parse_string() or self._parse_unquoted_field() 662 if self._match_text_seq("COLLATE"): 663 collate = self._parse_string() or self._parse_unquoted_field() 664 else: 665 collate = None 666 667 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 668 669 def _parse_type( 670 self, parse_interval: bool = True, fallback_to_identifier: bool = False 671 ) -> t.Optional[exp.Expression]: 672 # mysql binary is special and can work anywhere, even in order by operations 673 # it operates like a no paren func 674 if self._match(TokenType.BINARY, advance=False): 675 data_type = self._parse_types(check_func=True, allow_identifiers=False) 676 677 if isinstance(data_type, exp.DataType): 678 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 679 680 return super()._parse_type( 681 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 682 ) 683 684 def _parse_alter_table_alter_index(self) -> exp.AlterIndex: 685 index = self._parse_field(any_token=True) 686 687 if self._match_text_seq("VISIBLE"): 688 visible = True 689 elif self._match_text_seq("INVISIBLE"): 690 visible = False 691 else: 692 visible = None 693 694 return self.expression(exp.AlterIndex, this=index, visible=visible) 695 696 class Generator(generator.Generator): 697 INTERVAL_ALLOWS_PLURAL_FORM = False 698 LOCKING_READS_SUPPORTED = True 699 NULL_ORDERING_SUPPORTED: t.Optional[bool] = None 700 JOIN_HINTS = False 701 TABLE_HINTS = True 702 DUPLICATE_KEY_UPDATE_WITH_SET = False 703 QUERY_HINT_SEP = " " 704 VALUES_AS_TABLE = False 705 NVL2_SUPPORTED = False 706 LAST_DAY_SUPPORTS_DATE_PART = False 707 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 708 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 709 JSON_KEY_VALUE_PAIR_SEP = "," 710 SUPPORTS_TO_NUMBER = False 711 PARSE_JSON_NAME: t.Optional[str] = None 712 PAD_FILL_PATTERN_IS_REQUIRED = True 713 WRAP_DERIVED_VALUES = False 714 VARCHAR_REQUIRES_SIZE = True 715 SUPPORTS_MEDIAN = False 716 717 TRANSFORMS = { 718 **generator.Generator.TRANSFORMS, 719 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 720 exp.BitwiseAndAgg: rename_func("BIT_AND"), 721 exp.BitwiseOrAgg: rename_func("BIT_OR"), 722 exp.BitwiseXorAgg: rename_func("BIT_XOR"), 723 exp.BitwiseCountAgg: rename_func("BIT_COUNT"), 724 exp.CurrentDate: no_paren_current_date_sql, 725 exp.DateDiff: _remove_ts_or_ds_to_date( 726 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 727 ), 728 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 729 exp.DateStrToDate: datestrtodate_sql, 730 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 731 exp.DateTrunc: _date_trunc_sql, 732 exp.Day: _remove_ts_or_ds_to_date(), 733 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 734 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 735 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 736 exp.GroupConcat: lambda self, 737 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 738 exp.ILike: no_ilike_sql, 739 exp.JSONExtractScalar: arrow_json_extract_sql, 740 exp.Length: length_or_char_length_sql, 741 exp.LogicalOr: rename_func("MAX"), 742 exp.LogicalAnd: rename_func("MIN"), 743 exp.Max: max_or_greatest, 744 exp.Min: min_or_least, 745 exp.Month: _remove_ts_or_ds_to_date(), 746 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 747 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 748 exp.NumberToStr: rename_func("FORMAT"), 749 exp.Pivot: no_pivot_sql, 750 exp.Select: transforms.preprocess( 751 [ 752 transforms.eliminate_distinct_on, 753 transforms.eliminate_semi_and_anti_joins, 754 transforms.eliminate_qualify, 755 transforms.eliminate_full_outer_join, 756 transforms.unnest_generate_date_array_using_recursive_cte, 757 ] 758 ), 759 exp.StrPosition: lambda self, e: strposition_sql( 760 self, e, func_name="LOCATE", supports_position=True 761 ), 762 exp.StrToDate: _str_to_date_sql, 763 exp.StrToTime: _str_to_date_sql, 764 exp.Stuff: rename_func("INSERT"), 765 exp.TableSample: no_tablesample_sql, 766 exp.TimeFromParts: rename_func("MAKETIME"), 767 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 768 exp.TimestampDiff: lambda self, e: self.func( 769 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 770 ), 771 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 772 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 773 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 774 self, 775 e, 776 include_precision=not e.args.get("zone"), 777 ), 778 exp.TimeToStr: _remove_ts_or_ds_to_date( 779 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 780 ), 781 exp.Trim: trim_sql, 782 exp.TryCast: no_trycast_sql, 783 exp.TsOrDsAdd: date_add_sql("ADD"), 784 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 785 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 786 exp.Unicode: lambda self, e: f"ORD(CONVERT({self.sql(e.this)} USING utf32))", 787 exp.UnixToTime: _unix_to_time_sql, 788 exp.Week: _remove_ts_or_ds_to_date(), 789 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 790 exp.Year: _remove_ts_or_ds_to_date(), 791 exp.UtcTimestamp: rename_func("UTC_TIMESTAMP"), 792 exp.UtcTime: rename_func("UTC_TIME"), 793 } 794 795 UNSIGNED_TYPE_MAPPING = { 796 exp.DataType.Type.UBIGINT: "BIGINT", 797 exp.DataType.Type.UINT: "INT", 798 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 799 exp.DataType.Type.USMALLINT: "SMALLINT", 800 exp.DataType.Type.UTINYINT: "TINYINT", 801 exp.DataType.Type.UDECIMAL: "DECIMAL", 802 exp.DataType.Type.UDOUBLE: "DOUBLE", 803 } 804 805 TIMESTAMP_TYPE_MAPPING = { 806 exp.DataType.Type.DATETIME2: "DATETIME", 807 exp.DataType.Type.SMALLDATETIME: "DATETIME", 808 exp.DataType.Type.TIMESTAMP: "DATETIME", 809 exp.DataType.Type.TIMESTAMPNTZ: "DATETIME", 810 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 811 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 812 } 813 814 TYPE_MAPPING = { 815 **generator.Generator.TYPE_MAPPING, 816 **UNSIGNED_TYPE_MAPPING, 817 **TIMESTAMP_TYPE_MAPPING, 818 } 819 820 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 821 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 822 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 823 TYPE_MAPPING.pop(exp.DataType.Type.BLOB) 824 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 825 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 826 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 827 828 PROPERTIES_LOCATION = { 829 **generator.Generator.PROPERTIES_LOCATION, 830 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 831 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 832 } 833 834 LIMIT_FETCH = "LIMIT" 835 836 LIMIT_ONLY_LITERALS = True 837 838 CHAR_CAST_MAPPING = dict.fromkeys( 839 ( 840 exp.DataType.Type.LONGTEXT, 841 exp.DataType.Type.LONGBLOB, 842 exp.DataType.Type.MEDIUMBLOB, 843 exp.DataType.Type.MEDIUMTEXT, 844 exp.DataType.Type.TEXT, 845 exp.DataType.Type.TINYBLOB, 846 exp.DataType.Type.TINYTEXT, 847 exp.DataType.Type.VARCHAR, 848 ), 849 "CHAR", 850 ) 851 SIGNED_CAST_MAPPING = dict.fromkeys( 852 ( 853 exp.DataType.Type.BIGINT, 854 exp.DataType.Type.BOOLEAN, 855 exp.DataType.Type.INT, 856 exp.DataType.Type.SMALLINT, 857 exp.DataType.Type.TINYINT, 858 exp.DataType.Type.MEDIUMINT, 859 ), 860 "SIGNED", 861 ) 862 863 # MySQL doesn't support many datatypes in cast. 864 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 865 CAST_MAPPING = { 866 **CHAR_CAST_MAPPING, 867 **SIGNED_CAST_MAPPING, 868 exp.DataType.Type.UBIGINT: "UNSIGNED", 869 } 870 871 TIMESTAMP_FUNC_TYPES = { 872 exp.DataType.Type.TIMESTAMPTZ, 873 exp.DataType.Type.TIMESTAMPLTZ, 874 } 875 876 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 877 RESERVED_KEYWORDS = { 878 "accessible", 879 "add", 880 "all", 881 "alter", 882 "analyze", 883 "and", 884 "as", 885 "asc", 886 "asensitive", 887 "before", 888 "between", 889 "bigint", 890 "binary", 891 "blob", 892 "both", 893 "by", 894 "call", 895 "cascade", 896 "case", 897 "change", 898 "char", 899 "character", 900 "check", 901 "collate", 902 "column", 903 "condition", 904 "constraint", 905 "continue", 906 "convert", 907 "create", 908 "cross", 909 "cube", 910 "cume_dist", 911 "current_date", 912 "current_time", 913 "current_timestamp", 914 "current_user", 915 "cursor", 916 "database", 917 "databases", 918 "day_hour", 919 "day_microsecond", 920 "day_minute", 921 "day_second", 922 "dec", 923 "decimal", 924 "declare", 925 "default", 926 "delayed", 927 "delete", 928 "dense_rank", 929 "desc", 930 "describe", 931 "deterministic", 932 "distinct", 933 "distinctrow", 934 "div", 935 "double", 936 "drop", 937 "dual", 938 "each", 939 "else", 940 "elseif", 941 "empty", 942 "enclosed", 943 "escaped", 944 "except", 945 "exists", 946 "exit", 947 "explain", 948 "false", 949 "fetch", 950 "first_value", 951 "float", 952 "float4", 953 "float8", 954 "for", 955 "force", 956 "foreign", 957 "from", 958 "fulltext", 959 "function", 960 "generated", 961 "get", 962 "grant", 963 "group", 964 "grouping", 965 "groups", 966 "having", 967 "high_priority", 968 "hour_microsecond", 969 "hour_minute", 970 "hour_second", 971 "if", 972 "ignore", 973 "in", 974 "index", 975 "infile", 976 "inner", 977 "inout", 978 "insensitive", 979 "insert", 980 "int", 981 "int1", 982 "int2", 983 "int3", 984 "int4", 985 "int8", 986 "integer", 987 "intersect", 988 "interval", 989 "into", 990 "io_after_gtids", 991 "io_before_gtids", 992 "is", 993 "iterate", 994 "join", 995 "json_table", 996 "key", 997 "keys", 998 "kill", 999 "lag", 1000 "last_value", 1001 "lateral", 1002 "lead", 1003 "leading", 1004 "leave", 1005 "left", 1006 "like", 1007 "limit", 1008 "linear", 1009 "lines", 1010 "load", 1011 "localtime", 1012 "localtimestamp", 1013 "lock", 1014 "long", 1015 "longblob", 1016 "longtext", 1017 "loop", 1018 "low_priority", 1019 "master_bind", 1020 "master_ssl_verify_server_cert", 1021 "match", 1022 "maxvalue", 1023 "mediumblob", 1024 "mediumint", 1025 "mediumtext", 1026 "middleint", 1027 "minute_microsecond", 1028 "minute_second", 1029 "mod", 1030 "modifies", 1031 "natural", 1032 "not", 1033 "no_write_to_binlog", 1034 "nth_value", 1035 "ntile", 1036 "null", 1037 "numeric", 1038 "of", 1039 "on", 1040 "optimize", 1041 "optimizer_costs", 1042 "option", 1043 "optionally", 1044 "or", 1045 "order", 1046 "out", 1047 "outer", 1048 "outfile", 1049 "over", 1050 "partition", 1051 "percent_rank", 1052 "precision", 1053 "primary", 1054 "procedure", 1055 "purge", 1056 "range", 1057 "rank", 1058 "read", 1059 "reads", 1060 "read_write", 1061 "real", 1062 "recursive", 1063 "references", 1064 "regexp", 1065 "release", 1066 "rename", 1067 "repeat", 1068 "replace", 1069 "require", 1070 "resignal", 1071 "restrict", 1072 "return", 1073 "revoke", 1074 "right", 1075 "rlike", 1076 "row", 1077 "rows", 1078 "row_number", 1079 "schema", 1080 "schemas", 1081 "second_microsecond", 1082 "select", 1083 "sensitive", 1084 "separator", 1085 "set", 1086 "show", 1087 "signal", 1088 "smallint", 1089 "spatial", 1090 "specific", 1091 "sql", 1092 "sqlexception", 1093 "sqlstate", 1094 "sqlwarning", 1095 "sql_big_result", 1096 "sql_calc_found_rows", 1097 "sql_small_result", 1098 "ssl", 1099 "starting", 1100 "stored", 1101 "straight_join", 1102 "system", 1103 "table", 1104 "terminated", 1105 "then", 1106 "tinyblob", 1107 "tinyint", 1108 "tinytext", 1109 "to", 1110 "trailing", 1111 "trigger", 1112 "true", 1113 "undo", 1114 "union", 1115 "unique", 1116 "unlock", 1117 "unsigned", 1118 "update", 1119 "usage", 1120 "use", 1121 "using", 1122 "utc_date", 1123 "utc_time", 1124 "utc_timestamp", 1125 "values", 1126 "varbinary", 1127 "varchar", 1128 "varcharacter", 1129 "varying", 1130 "virtual", 1131 "when", 1132 "where", 1133 "while", 1134 "window", 1135 "with", 1136 "write", 1137 "xor", 1138 "year_month", 1139 "zerofill", 1140 } 1141 1142 def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str: 1143 persisted = "STORED" if expression.args.get("persisted") else "VIRTUAL" 1144 return f"GENERATED ALWAYS AS ({self.sql(expression.this.unnest())}) {persisted}" 1145 1146 def array_sql(self, expression: exp.Array) -> str: 1147 self.unsupported("Arrays are not supported by MySQL") 1148 return self.function_fallback_sql(expression) 1149 1150 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1151 self.unsupported("Array operations are not supported by MySQL") 1152 return self.function_fallback_sql(expression) 1153 1154 def dpipe_sql(self, expression: exp.DPipe) -> str: 1155 return self.func("CONCAT", *expression.flatten()) 1156 1157 def extract_sql(self, expression: exp.Extract) -> str: 1158 unit = expression.name 1159 if unit and unit.lower() == "epoch": 1160 return self.func("UNIX_TIMESTAMP", expression.expression) 1161 1162 return super().extract_sql(expression) 1163 1164 def datatype_sql(self, expression: exp.DataType) -> str: 1165 if ( 1166 self.VARCHAR_REQUIRES_SIZE 1167 and expression.is_type(exp.DataType.Type.VARCHAR) 1168 and not expression.expressions 1169 ): 1170 # `VARCHAR` must always have a size - if it doesn't, we always generate `TEXT` 1171 return "TEXT" 1172 1173 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1174 result = super().datatype_sql(expression) 1175 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1176 result = f"{result} UNSIGNED" 1177 1178 return result 1179 1180 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1181 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1182 1183 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1184 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1185 return self.func("TIMESTAMP", expression.this) 1186 1187 to = self.CAST_MAPPING.get(expression.to.this) 1188 1189 if to: 1190 expression.to.set("this", to) 1191 return super().cast_sql(expression) 1192 1193 def show_sql(self, expression: exp.Show) -> str: 1194 this = f" {expression.name}" 1195 full = " FULL" if expression.args.get("full") else "" 1196 global_ = " GLOBAL" if expression.args.get("global") else "" 1197 1198 target = self.sql(expression, "target") 1199 target = f" {target}" if target else "" 1200 if expression.name in ("COLUMNS", "INDEX"): 1201 target = f" FROM{target}" 1202 elif expression.name == "GRANTS": 1203 target = f" FOR{target}" 1204 1205 db = self._prefixed_sql("FROM", expression, "db") 1206 1207 like = self._prefixed_sql("LIKE", expression, "like") 1208 where = self.sql(expression, "where") 1209 1210 types = self.expressions(expression, key="types") 1211 types = f" {types}" if types else types 1212 query = self._prefixed_sql("FOR QUERY", expression, "query") 1213 1214 if expression.name == "PROFILE": 1215 offset = self._prefixed_sql("OFFSET", expression, "offset") 1216 limit = self._prefixed_sql("LIMIT", expression, "limit") 1217 else: 1218 offset = "" 1219 limit = self._oldstyle_limit_sql(expression) 1220 1221 log = self._prefixed_sql("IN", expression, "log") 1222 position = self._prefixed_sql("FROM", expression, "position") 1223 1224 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1225 1226 if expression.name == "ENGINE": 1227 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1228 else: 1229 mutex_or_status = "" 1230 1231 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1232 1233 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1234 dtype = self.sql(expression, "dtype") 1235 if not dtype: 1236 return super().altercolumn_sql(expression) 1237 1238 this = self.sql(expression, "this") 1239 return f"MODIFY COLUMN {this} {dtype}" 1240 1241 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1242 sql = self.sql(expression, arg) 1243 return f" {prefix} {sql}" if sql else "" 1244 1245 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1246 limit = self.sql(expression, "limit") 1247 offset = self.sql(expression, "offset") 1248 if limit: 1249 limit_offset = f"{offset}, {limit}" if offset else limit 1250 return f" LIMIT {limit_offset}" 1251 return "" 1252 1253 def chr_sql(self, expression: exp.Chr) -> str: 1254 this = self.expressions(sqls=[expression.this] + expression.expressions) 1255 charset = expression.args.get("charset") 1256 using = f" USING {self.sql(charset)}" if charset else "" 1257 return f"CHAR({this}{using})" 1258 1259 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1260 unit = expression.args.get("unit") 1261 1262 # Pick an old-enough date to avoid negative timestamp diffs 1263 start_ts = "'0000-01-01 00:00:00'" 1264 1265 # Source: https://stackoverflow.com/a/32955740 1266 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1267 interval = exp.Interval(this=timestamp_diff, unit=unit) 1268 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1269 1270 return self.sql(dateadd) 1271 1272 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1273 from_tz = expression.args.get("source_tz") 1274 to_tz = expression.args.get("target_tz") 1275 dt = expression.args.get("timestamp") 1276 1277 return self.func("CONVERT_TZ", dt, from_tz, to_tz) 1278 1279 def attimezone_sql(self, expression: exp.AtTimeZone) -> str: 1280 self.unsupported("AT TIME ZONE is not supported by MySQL") 1281 return self.sql(expression.this) 1282 1283 def isascii_sql(self, expression: exp.IsAscii) -> str: 1284 return f"REGEXP_LIKE({self.sql(expression.this)}, '^[[:ascii:]]*$')" 1285 1286 @unsupported_args("this") 1287 def currentschema_sql(self, expression: exp.CurrentSchema) -> str: 1288 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 "CHARSET": TokenType.CHARACTER_SET, 196 # The DESCRIBE and EXPLAIN statements are synonyms. 197 # https://dev.mysql.com/doc/refman/8.4/en/explain.html 198 "BLOB": TokenType.BLOB, 199 "DISTINCTROW": TokenType.DISTINCT, 200 "EXPLAIN": TokenType.DESCRIBE, 201 "FORCE": TokenType.FORCE, 202 "IGNORE": TokenType.IGNORE, 203 "KEY": TokenType.KEY, 204 "LOCK TABLES": TokenType.COMMAND, 205 "LONGBLOB": TokenType.LONGBLOB, 206 "LONGTEXT": TokenType.LONGTEXT, 207 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 208 "TINYBLOB": TokenType.TINYBLOB, 209 "TINYTEXT": TokenType.TINYTEXT, 210 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 211 "MEDIUMINT": TokenType.MEDIUMINT, 212 "MEMBER OF": TokenType.MEMBER_OF, 213 "SEPARATOR": TokenType.SEPARATOR, 214 "SERIAL": TokenType.SERIAL, 215 "START": TokenType.BEGIN, 216 "SIGNED": TokenType.BIGINT, 217 "SIGNED INTEGER": TokenType.BIGINT, 218 "TIMESTAMP": TokenType.TIMESTAMPTZ, 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'>, 'SEPARATOR': <TokenType.SEPARATOR: 'SEPARATOR'>, 'SERIAL': <TokenType.SERIAL: 'SERIAL'>, 'START': <TokenType.BEGIN: 'BEGIN'>, 'SIGNED': <TokenType.BIGINT: 'BIGINT'>, 'SIGNED INTEGER': <TokenType.BIGINT: 'BIGINT'>, '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.REPLACE: 'REPLACE'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.FETCH: 'FETCH'>, <TokenType.EXECUTE: 'EXECUTE'>, <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.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.MEMBER_OF: lambda self, this: self.expression( 297 exp.JSONArrayContains, 298 this=this, 299 expression=self._parse_wrapped(self._parse_expression), 300 ), 301 } 302 303 FUNCTIONS = { 304 **parser.Parser.FUNCTIONS, 305 "BIT_AND": exp.BitwiseAndAgg.from_arg_list, 306 "BIT_OR": exp.BitwiseOrAgg.from_arg_list, 307 "BIT_XOR": exp.BitwiseXorAgg.from_arg_list, 308 "BIT_COUNT": exp.BitwiseCountAgg.from_arg_list, 309 "CONVERT_TZ": lambda args: exp.ConvertTimezone( 310 source_tz=seq_get(args, 1), target_tz=seq_get(args, 2), timestamp=seq_get(args, 0) 311 ), 312 "CURDATE": exp.CurrentDate.from_arg_list, 313 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 314 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 315 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 316 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 317 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 318 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 319 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 320 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 321 "FORMAT": exp.NumberToStr.from_arg_list, 322 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 323 "ISNULL": isnull_to_is_null, 324 "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True), 325 "MAKETIME": exp.TimeFromParts.from_arg_list, 326 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 327 "MONTHNAME": lambda args: exp.TimeToStr( 328 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 329 format=exp.Literal.string("%B"), 330 ), 331 "SCHEMA": exp.CurrentSchema.from_arg_list, 332 "DATABASE": exp.CurrentSchema.from_arg_list, 333 "STR_TO_DATE": _str_to_date, 334 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 335 "TO_DAYS": lambda args: exp.paren( 336 exp.DateDiff( 337 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 338 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 339 unit=exp.var("DAY"), 340 ) 341 + 1 342 ), 343 "WEEK": lambda args: exp.Week( 344 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 345 ), 346 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 347 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 348 } 349 350 FUNCTION_PARSERS = { 351 **parser.Parser.FUNCTION_PARSERS, 352 "CHAR": lambda self: self.expression( 353 exp.Chr, 354 expressions=self._parse_csv(self._parse_assignment), 355 charset=self._match(TokenType.USING) and self._parse_var(), 356 ), 357 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 358 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 359 "VALUES": lambda self: self.expression( 360 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 361 ), 362 "JSON_VALUE": lambda self: self._parse_json_value(), 363 } 364 365 STATEMENT_PARSERS = { 366 **parser.Parser.STATEMENT_PARSERS, 367 TokenType.SHOW: lambda self: self._parse_show(), 368 } 369 370 SHOW_PARSERS = { 371 "BINARY LOGS": _show_parser("BINARY LOGS"), 372 "MASTER LOGS": _show_parser("BINARY LOGS"), 373 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 374 "CHARACTER SET": _show_parser("CHARACTER SET"), 375 "CHARSET": _show_parser("CHARACTER SET"), 376 "COLLATION": _show_parser("COLLATION"), 377 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 378 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 379 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 380 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 381 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 382 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 383 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 384 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 385 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 386 "DATABASES": _show_parser("DATABASES"), 387 "SCHEMAS": _show_parser("DATABASES"), 388 "ENGINE": _show_parser("ENGINE", target=True), 389 "STORAGE ENGINES": _show_parser("ENGINES"), 390 "ENGINES": _show_parser("ENGINES"), 391 "ERRORS": _show_parser("ERRORS"), 392 "EVENTS": _show_parser("EVENTS"), 393 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 394 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 395 "GRANTS": _show_parser("GRANTS", target="FOR"), 396 "INDEX": _show_parser("INDEX", target="FROM"), 397 "MASTER STATUS": _show_parser("MASTER STATUS"), 398 "OPEN TABLES": _show_parser("OPEN TABLES"), 399 "PLUGINS": _show_parser("PLUGINS"), 400 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 401 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 402 "PRIVILEGES": _show_parser("PRIVILEGES"), 403 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 404 "PROCESSLIST": _show_parser("PROCESSLIST"), 405 "PROFILE": _show_parser("PROFILE"), 406 "PROFILES": _show_parser("PROFILES"), 407 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 408 "REPLICAS": _show_parser("REPLICAS"), 409 "SLAVE HOSTS": _show_parser("REPLICAS"), 410 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 411 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 412 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 413 "SESSION STATUS": _show_parser("STATUS"), 414 "STATUS": _show_parser("STATUS"), 415 "TABLE STATUS": _show_parser("TABLE STATUS"), 416 "FULL TABLES": _show_parser("TABLES", full=True), 417 "TABLES": _show_parser("TABLES"), 418 "TRIGGERS": _show_parser("TRIGGERS"), 419 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 420 "SESSION VARIABLES": _show_parser("VARIABLES"), 421 "VARIABLES": _show_parser("VARIABLES"), 422 "WARNINGS": _show_parser("WARNINGS"), 423 } 424 425 PROPERTY_PARSERS = { 426 **parser.Parser.PROPERTY_PARSERS, 427 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 428 } 429 430 SET_PARSERS = { 431 **parser.Parser.SET_PARSERS, 432 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 433 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 434 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 435 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 436 "NAMES": lambda self: self._parse_set_item_names(), 437 } 438 439 CONSTRAINT_PARSERS = { 440 **parser.Parser.CONSTRAINT_PARSERS, 441 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 442 "INDEX": lambda self: self._parse_index_constraint(), 443 "KEY": lambda self: self._parse_index_constraint(), 444 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 445 } 446 447 ALTER_PARSERS = { 448 **parser.Parser.ALTER_PARSERS, 449 "MODIFY": lambda self: self._parse_alter_table_alter(), 450 } 451 452 ALTER_ALTER_PARSERS = { 453 **parser.Parser.ALTER_ALTER_PARSERS, 454 "INDEX": lambda self: self._parse_alter_table_alter_index(), 455 } 456 457 SCHEMA_UNNAMED_CONSTRAINTS = { 458 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 459 "FULLTEXT", 460 "INDEX", 461 "KEY", 462 "SPATIAL", 463 } 464 465 PROFILE_TYPES: parser.OPTIONS_TYPE = { 466 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 467 "BLOCK": ("IO",), 468 "CONTEXT": ("SWITCHES",), 469 "PAGE": ("FAULTS",), 470 } 471 472 TYPE_TOKENS = { 473 *parser.Parser.TYPE_TOKENS, 474 TokenType.SET, 475 } 476 477 ENUM_TYPE_TOKENS = { 478 *parser.Parser.ENUM_TYPE_TOKENS, 479 TokenType.SET, 480 } 481 482 # SELECT [ ALL | DISTINCT | DISTINCTROW ] [ <OPERATION_MODIFIERS> ] 483 OPERATION_MODIFIERS = { 484 "HIGH_PRIORITY", 485 "STRAIGHT_JOIN", 486 "SQL_SMALL_RESULT", 487 "SQL_BIG_RESULT", 488 "SQL_BUFFER_RESULT", 489 "SQL_NO_CACHE", 490 "SQL_CALC_FOUND_ROWS", 491 } 492 493 LOG_DEFAULTS_TO_LN = True 494 STRING_ALIASES = True 495 VALUES_FOLLOWED_BY_PAREN = False 496 SUPPORTS_PARTITION_SELECTION = True 497 498 def _parse_generated_as_identity( 499 self, 500 ) -> ( 501 exp.GeneratedAsIdentityColumnConstraint 502 | exp.ComputedColumnConstraint 503 | exp.GeneratedAsRowColumnConstraint 504 ): 505 this = super()._parse_generated_as_identity() 506 507 if self._match_texts(("STORED", "VIRTUAL")): 508 persisted = self._prev.text.upper() == "STORED" 509 510 if isinstance(this, exp.ComputedColumnConstraint): 511 this.set("persisted", persisted) 512 elif isinstance(this, exp.GeneratedAsIdentityColumnConstraint): 513 this = self.expression( 514 exp.ComputedColumnConstraint, this=this.expression, persisted=persisted 515 ) 516 517 return this 518 519 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 520 this = self._parse_id_var() 521 if not self._match(TokenType.L_PAREN): 522 return this 523 524 expression = self._parse_number() 525 self._match_r_paren() 526 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 527 528 def _parse_index_constraint( 529 self, kind: t.Optional[str] = None 530 ) -> exp.IndexColumnConstraint: 531 if kind: 532 self._match_texts(("INDEX", "KEY")) 533 534 this = self._parse_id_var(any_token=False) 535 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 536 expressions = self._parse_wrapped_csv(self._parse_ordered) 537 538 options = [] 539 while True: 540 if self._match_text_seq("KEY_BLOCK_SIZE"): 541 self._match(TokenType.EQ) 542 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 543 elif self._match(TokenType.USING): 544 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 545 elif self._match_text_seq("WITH", "PARSER"): 546 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 547 elif self._match(TokenType.COMMENT): 548 opt = exp.IndexConstraintOption(comment=self._parse_string()) 549 elif self._match_text_seq("VISIBLE"): 550 opt = exp.IndexConstraintOption(visible=True) 551 elif self._match_text_seq("INVISIBLE"): 552 opt = exp.IndexConstraintOption(visible=False) 553 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 554 self._match(TokenType.EQ) 555 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 556 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 557 self._match(TokenType.EQ) 558 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 559 else: 560 opt = None 561 562 if not opt: 563 break 564 565 options.append(opt) 566 567 return self.expression( 568 exp.IndexColumnConstraint, 569 this=this, 570 expressions=expressions, 571 kind=kind, 572 index_type=index_type, 573 options=options, 574 ) 575 576 def _parse_show_mysql( 577 self, 578 this: str, 579 target: bool | str = False, 580 full: t.Optional[bool] = None, 581 global_: t.Optional[bool] = None, 582 ) -> exp.Show: 583 if target: 584 if isinstance(target, str): 585 self._match_text_seq(target) 586 target_id = self._parse_id_var() 587 else: 588 target_id = None 589 590 log = self._parse_string() if self._match_text_seq("IN") else None 591 592 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 593 position = self._parse_number() if self._match_text_seq("FROM") else None 594 db = None 595 else: 596 position = None 597 db = None 598 599 if self._match(TokenType.FROM): 600 db = self._parse_id_var() 601 elif self._match(TokenType.DOT): 602 db = target_id 603 target_id = self._parse_id_var() 604 605 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 606 607 like = self._parse_string() if self._match_text_seq("LIKE") else None 608 where = self._parse_where() 609 610 if this == "PROFILE": 611 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 612 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 613 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 614 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 615 else: 616 types, query = None, None 617 offset, limit = self._parse_oldstyle_limit() 618 619 mutex = True if self._match_text_seq("MUTEX") else None 620 mutex = False if self._match_text_seq("STATUS") else mutex 621 622 return self.expression( 623 exp.Show, 624 this=this, 625 target=target_id, 626 full=full, 627 log=log, 628 position=position, 629 db=db, 630 channel=channel, 631 like=like, 632 where=where, 633 types=types, 634 query=query, 635 offset=offset, 636 limit=limit, 637 mutex=mutex, 638 **{"global": global_}, # type: ignore 639 ) 640 641 def _parse_oldstyle_limit( 642 self, 643 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 644 limit = None 645 offset = None 646 if self._match_text_seq("LIMIT"): 647 parts = self._parse_csv(self._parse_number) 648 if len(parts) == 1: 649 limit = parts[0] 650 elif len(parts) == 2: 651 limit = parts[1] 652 offset = parts[0] 653 654 return offset, limit 655 656 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 657 this = self._parse_string() or self._parse_unquoted_field() 658 return self.expression(exp.SetItem, this=this, kind=kind) 659 660 def _parse_set_item_names(self) -> exp.Expression: 661 charset = self._parse_string() or self._parse_unquoted_field() 662 if self._match_text_seq("COLLATE"): 663 collate = self._parse_string() or self._parse_unquoted_field() 664 else: 665 collate = None 666 667 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 668 669 def _parse_type( 670 self, parse_interval: bool = True, fallback_to_identifier: bool = False 671 ) -> t.Optional[exp.Expression]: 672 # mysql binary is special and can work anywhere, even in order by operations 673 # it operates like a no paren func 674 if self._match(TokenType.BINARY, advance=False): 675 data_type = self._parse_types(check_func=True, allow_identifiers=False) 676 677 if isinstance(data_type, exp.DataType): 678 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 679 680 return super()._parse_type( 681 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 682 ) 683 684 def _parse_alter_table_alter_index(self) -> exp.AlterIndex: 685 index = self._parse_field(any_token=True) 686 687 if self._match_text_seq("VISIBLE"): 688 visible = True 689 elif self._match_text_seq("INVISIBLE"): 690 visible = False 691 else: 692 visible = None 693 694 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.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.TABLE: 'TABLE'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.SOME: 'SOME'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.UUID: 'UUID'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.JSON: 'JSON'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.TEXT: 'TEXT'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.IPV4: 'IPV4'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.VAR: 'VAR'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.NULL: 'NULL'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.FILTER: 'FILTER'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.VOID: 'VOID'>, <TokenType.NEXT: 'NEXT'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.UINT128: 'UINT128'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.ILIKE: 'ILIKE'>, <TokenType.BIT: 'BIT'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.ENUM: 'ENUM'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.ROW: 'ROW'>, <TokenType.NESTED: 'NESTED'>, <TokenType.INET: 'INET'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.NAME: 'NAME'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.UTC_TIMESTAMP: 'UTC_TIMESTAMP'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.XML: 'XML'>, <TokenType.UINT256: 'UINT256'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.DATE32: 'DATE32'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.MAP: 'MAP'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.UTC_TIME: 'UTC_TIME'>, <TokenType.INT128: 'INT128'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.XOR: 'XOR'>, <TokenType.LIKE: 'LIKE'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.GET: 'GET'>, <TokenType.POINT: 'POINT'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.UINT: 'UINT'>, <TokenType.CHAR: 'CHAR'>, <TokenType.RING: 'RING'>, <TokenType.IPV6: 'IPV6'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.GEOGRAPHYPOINT: 'GEOGRAPHYPOINT'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.INDEX: 'INDEX'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.DATE: 'DATE'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.RLIKE: 'RLIKE'>, <TokenType.RANGE: 'RANGE'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.VALUES: 'VALUES'>, <TokenType.LEFT: 'LEFT'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.ALL: 'ALL'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.MERGE: 'MERGE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.UNION: 'UNION'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.SUPER: 'SUPER'>, <TokenType.YEAR: 'YEAR'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.LIST: 'LIST'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.UTC_DATE: 'UTC_DATE'>, <TokenType.BLOB: 'BLOB'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.JSONB: 'JSONB'>, <TokenType.FIRST: 'FIRST'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.INT256: 'INT256'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.ANY: 'ANY'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.PRIMARY_KEY: 'PRIMARY_KEY'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.INSERT: 'INSERT'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.BINARY: 'BINARY'>, <TokenType.INT: 'INT'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.TIME: 'TIME'>, <TokenType.GLOB: 'GLOB'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.MONEY: 'MONEY'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.DATABASE: 'DATABASE'>}
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.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.TABLE: 'TABLE'>, <TokenType.ASC: 'ASC'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.SOME: 'SOME'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.MODEL: 'MODEL'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.UUID: 'UUID'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.JSON: 'JSON'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.TEXT: 'TEXT'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.DELETE: 'DELETE'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.SEMANTIC_VIEW: 'SEMANTIC_VIEW'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.IPV4: 'IPV4'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.VAR: 'VAR'>, <TokenType.SET: 'SET'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.CUBE: 'CUBE'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.COPY: 'COPY'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.NULL: 'NULL'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.FILTER: 'FILTER'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.VOID: 'VOID'>, <TokenType.NEXT: 'NEXT'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.UINT128: 'UINT128'>, <TokenType.FALSE: 'FALSE'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.BIT: 'BIT'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.ENUM: 'ENUM'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.ROW: 'ROW'>, <TokenType.NESTED: 'NESTED'>, <TokenType.INET: 'INET'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.FILE_FORMAT: 'FILE_FORMAT'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.DETACH: 'DETACH'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.PUT: 'PUT'>, <TokenType.NAME: 'NAME'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.XML: 'XML'>, <TokenType.UINT256: 'UINT256'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.SESSION: 'SESSION'>, <TokenType.DATE32: 'DATE32'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.APPLY: 'APPLY'>, <TokenType.TOP: 'TOP'>, <TokenType.CACHE: 'CACHE'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.MAP: 'MAP'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.KEEP: 'KEEP'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.INT128: 'INT128'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.DESC: 'DESC'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.RENAME: 'RENAME'>, <TokenType.CASE: 'CASE'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.LOAD: 'LOAD'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.GET: 'GET'>, <TokenType.POINT: 'POINT'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.TAG: 'TAG'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.UINT: 'UINT'>, <TokenType.CHAR: 'CHAR'>, <TokenType.RING: 'RING'>, <TokenType.IPV6: 'IPV6'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.GEOGRAPHYPOINT: 'GEOGRAPHYPOINT'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.INDEX: 'INDEX'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.DATE: 'DATE'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.RANGE: 'RANGE'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.TRUE: 'TRUE'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.SEMI: 'SEMI'>, <TokenType.ALL: 'ALL'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.MERGE: 'MERGE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.SUPER: 'SUPER'>, <TokenType.YEAR: 'YEAR'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.STAGE: 'STAGE'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.ROWS: 'ROWS'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.ANTI: 'ANTI'>, <TokenType.FINAL: 'FINAL'>, <TokenType.LIST: 'LIST'>, <TokenType.SINK: 'SINK'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.BLOB: 'BLOB'>, <TokenType.VIEW: 'VIEW'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.JSONB: 'JSONB'>, <TokenType.FIRST: 'FIRST'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.SHOW: 'SHOW'>, <TokenType.INT256: 'INT256'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.DIV: 'DIV'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.IS: 'IS'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.END: 'END'>, <TokenType.ANY: 'ANY'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.BINARY: 'BINARY'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.INT: 'INT'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.TIME: 'TIME'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.KILL: 'KILL'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.MONEY: 'MONEY'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.PROCEDURE: 'PROCEDURE'>}
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.MEMBER_OF: 'MEMBER_OF'>: <function MySQL.Parser.<lambda>>}
FUNCTIONS =
{'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'>>, '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'>>, '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'>>, 'SHA2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA2'>>, '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>>}
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', 'INDEX', 'PRIMARY KEY', 'PERIOD', 'TRUNCATE', 'WATERMARK', 'BUCKET', 'FULLTEXT', 'CHECK', 'KEY', 'SPATIAL', 'UNIQUE', 'FOREIGN KEY', 'EXCLUDE'}
PROFILE_TYPES: Dict[str, Sequence[Union[Sequence[str], str]]] =
{'ALL': (), 'CPU': (), 'IPC': (), 'MEMORY': (), 'SOURCE': (), 'SWAPS': (), 'BLOCK': ('IO',), 'CONTEXT': ('SWITCHES',), 'PAGE': ('FAULTS',)}
TYPE_TOKENS =
{<TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.UINT: 'UINT'>, <TokenType.CHAR: 'CHAR'>, <TokenType.RING: 'RING'>, <TokenType.IPV6: 'IPV6'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.UUID: 'UUID'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.GEOGRAPHYPOINT: 'GEOGRAPHYPOINT'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.JSON: 'JSON'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.DATE: 'DATE'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.RANGE: 'RANGE'>, <TokenType.TEXT: 'TEXT'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.IPV4: 'IPV4'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.UNION: 'UNION'>, <TokenType.SET: 'SET'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.SUPER: 'SUPER'>, <TokenType.YEAR: 'YEAR'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.NULL: 'NULL'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.VOID: 'VOID'>, <TokenType.LIST: 'LIST'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.UINT128: 'UINT128'>, <TokenType.BLOB: 'BLOB'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.BIT: 'BIT'>, <TokenType.ENUM: 'ENUM'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.JSONB: 'JSONB'>, <TokenType.INET: 'INET'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.INT256: 'INT256'>, <TokenType.NAME: 'NAME'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.XML: 'XML'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.UINT256: 'UINT256'>, <TokenType.DATE32: 'DATE32'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.MAP: 'MAP'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.BINARY: 'BINARY'>, <TokenType.INT128: 'INT128'>, <TokenType.INT: 'INT'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.TIME: 'TIME'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.MONEY: 'MONEY'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.POINT: 'POINT'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.STRUCT: 'STRUCT'>}
ENUM_TYPE_TOKENS =
{<TokenType.ENUM8: 'ENUM8'>, <TokenType.ENUM: 'ENUM'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.SET: 'SET'>, <TokenType.ENUM16: 'ENUM16'>}
OPERATION_MODIFIERS =
{'SQL_BUFFER_RESULT', 'SQL_BIG_RESULT', 'HIGH_PRIORITY', 'SQL_CALC_FOUND_ROWS', 'STRAIGHT_JOIN', 'SQL_NO_CACHE', 'SQL_SMALL_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
- NULL_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
- 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
696 class Generator(generator.Generator): 697 INTERVAL_ALLOWS_PLURAL_FORM = False 698 LOCKING_READS_SUPPORTED = True 699 NULL_ORDERING_SUPPORTED: t.Optional[bool] = None 700 JOIN_HINTS = False 701 TABLE_HINTS = True 702 DUPLICATE_KEY_UPDATE_WITH_SET = False 703 QUERY_HINT_SEP = " " 704 VALUES_AS_TABLE = False 705 NVL2_SUPPORTED = False 706 LAST_DAY_SUPPORTS_DATE_PART = False 707 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 708 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 709 JSON_KEY_VALUE_PAIR_SEP = "," 710 SUPPORTS_TO_NUMBER = False 711 PARSE_JSON_NAME: t.Optional[str] = None 712 PAD_FILL_PATTERN_IS_REQUIRED = True 713 WRAP_DERIVED_VALUES = False 714 VARCHAR_REQUIRES_SIZE = True 715 SUPPORTS_MEDIAN = False 716 717 TRANSFORMS = { 718 **generator.Generator.TRANSFORMS, 719 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 720 exp.BitwiseAndAgg: rename_func("BIT_AND"), 721 exp.BitwiseOrAgg: rename_func("BIT_OR"), 722 exp.BitwiseXorAgg: rename_func("BIT_XOR"), 723 exp.BitwiseCountAgg: rename_func("BIT_COUNT"), 724 exp.CurrentDate: no_paren_current_date_sql, 725 exp.DateDiff: _remove_ts_or_ds_to_date( 726 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 727 ), 728 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 729 exp.DateStrToDate: datestrtodate_sql, 730 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 731 exp.DateTrunc: _date_trunc_sql, 732 exp.Day: _remove_ts_or_ds_to_date(), 733 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 734 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 735 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 736 exp.GroupConcat: lambda self, 737 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 738 exp.ILike: no_ilike_sql, 739 exp.JSONExtractScalar: arrow_json_extract_sql, 740 exp.Length: length_or_char_length_sql, 741 exp.LogicalOr: rename_func("MAX"), 742 exp.LogicalAnd: rename_func("MIN"), 743 exp.Max: max_or_greatest, 744 exp.Min: min_or_least, 745 exp.Month: _remove_ts_or_ds_to_date(), 746 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 747 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 748 exp.NumberToStr: rename_func("FORMAT"), 749 exp.Pivot: no_pivot_sql, 750 exp.Select: transforms.preprocess( 751 [ 752 transforms.eliminate_distinct_on, 753 transforms.eliminate_semi_and_anti_joins, 754 transforms.eliminate_qualify, 755 transforms.eliminate_full_outer_join, 756 transforms.unnest_generate_date_array_using_recursive_cte, 757 ] 758 ), 759 exp.StrPosition: lambda self, e: strposition_sql( 760 self, e, func_name="LOCATE", supports_position=True 761 ), 762 exp.StrToDate: _str_to_date_sql, 763 exp.StrToTime: _str_to_date_sql, 764 exp.Stuff: rename_func("INSERT"), 765 exp.TableSample: no_tablesample_sql, 766 exp.TimeFromParts: rename_func("MAKETIME"), 767 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 768 exp.TimestampDiff: lambda self, e: self.func( 769 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 770 ), 771 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 772 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 773 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 774 self, 775 e, 776 include_precision=not e.args.get("zone"), 777 ), 778 exp.TimeToStr: _remove_ts_or_ds_to_date( 779 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 780 ), 781 exp.Trim: trim_sql, 782 exp.TryCast: no_trycast_sql, 783 exp.TsOrDsAdd: date_add_sql("ADD"), 784 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 785 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 786 exp.Unicode: lambda self, e: f"ORD(CONVERT({self.sql(e.this)} USING utf32))", 787 exp.UnixToTime: _unix_to_time_sql, 788 exp.Week: _remove_ts_or_ds_to_date(), 789 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 790 exp.Year: _remove_ts_or_ds_to_date(), 791 exp.UtcTimestamp: rename_func("UTC_TIMESTAMP"), 792 exp.UtcTime: rename_func("UTC_TIME"), 793 } 794 795 UNSIGNED_TYPE_MAPPING = { 796 exp.DataType.Type.UBIGINT: "BIGINT", 797 exp.DataType.Type.UINT: "INT", 798 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 799 exp.DataType.Type.USMALLINT: "SMALLINT", 800 exp.DataType.Type.UTINYINT: "TINYINT", 801 exp.DataType.Type.UDECIMAL: "DECIMAL", 802 exp.DataType.Type.UDOUBLE: "DOUBLE", 803 } 804 805 TIMESTAMP_TYPE_MAPPING = { 806 exp.DataType.Type.DATETIME2: "DATETIME", 807 exp.DataType.Type.SMALLDATETIME: "DATETIME", 808 exp.DataType.Type.TIMESTAMP: "DATETIME", 809 exp.DataType.Type.TIMESTAMPNTZ: "DATETIME", 810 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 811 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 812 } 813 814 TYPE_MAPPING = { 815 **generator.Generator.TYPE_MAPPING, 816 **UNSIGNED_TYPE_MAPPING, 817 **TIMESTAMP_TYPE_MAPPING, 818 } 819 820 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 821 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 822 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 823 TYPE_MAPPING.pop(exp.DataType.Type.BLOB) 824 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 825 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 826 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 827 828 PROPERTIES_LOCATION = { 829 **generator.Generator.PROPERTIES_LOCATION, 830 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 831 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 832 } 833 834 LIMIT_FETCH = "LIMIT" 835 836 LIMIT_ONLY_LITERALS = True 837 838 CHAR_CAST_MAPPING = dict.fromkeys( 839 ( 840 exp.DataType.Type.LONGTEXT, 841 exp.DataType.Type.LONGBLOB, 842 exp.DataType.Type.MEDIUMBLOB, 843 exp.DataType.Type.MEDIUMTEXT, 844 exp.DataType.Type.TEXT, 845 exp.DataType.Type.TINYBLOB, 846 exp.DataType.Type.TINYTEXT, 847 exp.DataType.Type.VARCHAR, 848 ), 849 "CHAR", 850 ) 851 SIGNED_CAST_MAPPING = dict.fromkeys( 852 ( 853 exp.DataType.Type.BIGINT, 854 exp.DataType.Type.BOOLEAN, 855 exp.DataType.Type.INT, 856 exp.DataType.Type.SMALLINT, 857 exp.DataType.Type.TINYINT, 858 exp.DataType.Type.MEDIUMINT, 859 ), 860 "SIGNED", 861 ) 862 863 # MySQL doesn't support many datatypes in cast. 864 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 865 CAST_MAPPING = { 866 **CHAR_CAST_MAPPING, 867 **SIGNED_CAST_MAPPING, 868 exp.DataType.Type.UBIGINT: "UNSIGNED", 869 } 870 871 TIMESTAMP_FUNC_TYPES = { 872 exp.DataType.Type.TIMESTAMPTZ, 873 exp.DataType.Type.TIMESTAMPLTZ, 874 } 875 876 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 877 RESERVED_KEYWORDS = { 878 "accessible", 879 "add", 880 "all", 881 "alter", 882 "analyze", 883 "and", 884 "as", 885 "asc", 886 "asensitive", 887 "before", 888 "between", 889 "bigint", 890 "binary", 891 "blob", 892 "both", 893 "by", 894 "call", 895 "cascade", 896 "case", 897 "change", 898 "char", 899 "character", 900 "check", 901 "collate", 902 "column", 903 "condition", 904 "constraint", 905 "continue", 906 "convert", 907 "create", 908 "cross", 909 "cube", 910 "cume_dist", 911 "current_date", 912 "current_time", 913 "current_timestamp", 914 "current_user", 915 "cursor", 916 "database", 917 "databases", 918 "day_hour", 919 "day_microsecond", 920 "day_minute", 921 "day_second", 922 "dec", 923 "decimal", 924 "declare", 925 "default", 926 "delayed", 927 "delete", 928 "dense_rank", 929 "desc", 930 "describe", 931 "deterministic", 932 "distinct", 933 "distinctrow", 934 "div", 935 "double", 936 "drop", 937 "dual", 938 "each", 939 "else", 940 "elseif", 941 "empty", 942 "enclosed", 943 "escaped", 944 "except", 945 "exists", 946 "exit", 947 "explain", 948 "false", 949 "fetch", 950 "first_value", 951 "float", 952 "float4", 953 "float8", 954 "for", 955 "force", 956 "foreign", 957 "from", 958 "fulltext", 959 "function", 960 "generated", 961 "get", 962 "grant", 963 "group", 964 "grouping", 965 "groups", 966 "having", 967 "high_priority", 968 "hour_microsecond", 969 "hour_minute", 970 "hour_second", 971 "if", 972 "ignore", 973 "in", 974 "index", 975 "infile", 976 "inner", 977 "inout", 978 "insensitive", 979 "insert", 980 "int", 981 "int1", 982 "int2", 983 "int3", 984 "int4", 985 "int8", 986 "integer", 987 "intersect", 988 "interval", 989 "into", 990 "io_after_gtids", 991 "io_before_gtids", 992 "is", 993 "iterate", 994 "join", 995 "json_table", 996 "key", 997 "keys", 998 "kill", 999 "lag", 1000 "last_value", 1001 "lateral", 1002 "lead", 1003 "leading", 1004 "leave", 1005 "left", 1006 "like", 1007 "limit", 1008 "linear", 1009 "lines", 1010 "load", 1011 "localtime", 1012 "localtimestamp", 1013 "lock", 1014 "long", 1015 "longblob", 1016 "longtext", 1017 "loop", 1018 "low_priority", 1019 "master_bind", 1020 "master_ssl_verify_server_cert", 1021 "match", 1022 "maxvalue", 1023 "mediumblob", 1024 "mediumint", 1025 "mediumtext", 1026 "middleint", 1027 "minute_microsecond", 1028 "minute_second", 1029 "mod", 1030 "modifies", 1031 "natural", 1032 "not", 1033 "no_write_to_binlog", 1034 "nth_value", 1035 "ntile", 1036 "null", 1037 "numeric", 1038 "of", 1039 "on", 1040 "optimize", 1041 "optimizer_costs", 1042 "option", 1043 "optionally", 1044 "or", 1045 "order", 1046 "out", 1047 "outer", 1048 "outfile", 1049 "over", 1050 "partition", 1051 "percent_rank", 1052 "precision", 1053 "primary", 1054 "procedure", 1055 "purge", 1056 "range", 1057 "rank", 1058 "read", 1059 "reads", 1060 "read_write", 1061 "real", 1062 "recursive", 1063 "references", 1064 "regexp", 1065 "release", 1066 "rename", 1067 "repeat", 1068 "replace", 1069 "require", 1070 "resignal", 1071 "restrict", 1072 "return", 1073 "revoke", 1074 "right", 1075 "rlike", 1076 "row", 1077 "rows", 1078 "row_number", 1079 "schema", 1080 "schemas", 1081 "second_microsecond", 1082 "select", 1083 "sensitive", 1084 "separator", 1085 "set", 1086 "show", 1087 "signal", 1088 "smallint", 1089 "spatial", 1090 "specific", 1091 "sql", 1092 "sqlexception", 1093 "sqlstate", 1094 "sqlwarning", 1095 "sql_big_result", 1096 "sql_calc_found_rows", 1097 "sql_small_result", 1098 "ssl", 1099 "starting", 1100 "stored", 1101 "straight_join", 1102 "system", 1103 "table", 1104 "terminated", 1105 "then", 1106 "tinyblob", 1107 "tinyint", 1108 "tinytext", 1109 "to", 1110 "trailing", 1111 "trigger", 1112 "true", 1113 "undo", 1114 "union", 1115 "unique", 1116 "unlock", 1117 "unsigned", 1118 "update", 1119 "usage", 1120 "use", 1121 "using", 1122 "utc_date", 1123 "utc_time", 1124 "utc_timestamp", 1125 "values", 1126 "varbinary", 1127 "varchar", 1128 "varcharacter", 1129 "varying", 1130 "virtual", 1131 "when", 1132 "where", 1133 "while", 1134 "window", 1135 "with", 1136 "write", 1137 "xor", 1138 "year_month", 1139 "zerofill", 1140 } 1141 1142 def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str: 1143 persisted = "STORED" if expression.args.get("persisted") else "VIRTUAL" 1144 return f"GENERATED ALWAYS AS ({self.sql(expression.this.unnest())}) {persisted}" 1145 1146 def array_sql(self, expression: exp.Array) -> str: 1147 self.unsupported("Arrays are not supported by MySQL") 1148 return self.function_fallback_sql(expression) 1149 1150 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1151 self.unsupported("Array operations are not supported by MySQL") 1152 return self.function_fallback_sql(expression) 1153 1154 def dpipe_sql(self, expression: exp.DPipe) -> str: 1155 return self.func("CONCAT", *expression.flatten()) 1156 1157 def extract_sql(self, expression: exp.Extract) -> str: 1158 unit = expression.name 1159 if unit and unit.lower() == "epoch": 1160 return self.func("UNIX_TIMESTAMP", expression.expression) 1161 1162 return super().extract_sql(expression) 1163 1164 def datatype_sql(self, expression: exp.DataType) -> str: 1165 if ( 1166 self.VARCHAR_REQUIRES_SIZE 1167 and expression.is_type(exp.DataType.Type.VARCHAR) 1168 and not expression.expressions 1169 ): 1170 # `VARCHAR` must always have a size - if it doesn't, we always generate `TEXT` 1171 return "TEXT" 1172 1173 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1174 result = super().datatype_sql(expression) 1175 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1176 result = f"{result} UNSIGNED" 1177 1178 return result 1179 1180 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1181 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1182 1183 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1184 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1185 return self.func("TIMESTAMP", expression.this) 1186 1187 to = self.CAST_MAPPING.get(expression.to.this) 1188 1189 if to: 1190 expression.to.set("this", to) 1191 return super().cast_sql(expression) 1192 1193 def show_sql(self, expression: exp.Show) -> str: 1194 this = f" {expression.name}" 1195 full = " FULL" if expression.args.get("full") else "" 1196 global_ = " GLOBAL" if expression.args.get("global") else "" 1197 1198 target = self.sql(expression, "target") 1199 target = f" {target}" if target else "" 1200 if expression.name in ("COLUMNS", "INDEX"): 1201 target = f" FROM{target}" 1202 elif expression.name == "GRANTS": 1203 target = f" FOR{target}" 1204 1205 db = self._prefixed_sql("FROM", expression, "db") 1206 1207 like = self._prefixed_sql("LIKE", expression, "like") 1208 where = self.sql(expression, "where") 1209 1210 types = self.expressions(expression, key="types") 1211 types = f" {types}" if types else types 1212 query = self._prefixed_sql("FOR QUERY", expression, "query") 1213 1214 if expression.name == "PROFILE": 1215 offset = self._prefixed_sql("OFFSET", expression, "offset") 1216 limit = self._prefixed_sql("LIMIT", expression, "limit") 1217 else: 1218 offset = "" 1219 limit = self._oldstyle_limit_sql(expression) 1220 1221 log = self._prefixed_sql("IN", expression, "log") 1222 position = self._prefixed_sql("FROM", expression, "position") 1223 1224 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1225 1226 if expression.name == "ENGINE": 1227 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1228 else: 1229 mutex_or_status = "" 1230 1231 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1232 1233 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1234 dtype = self.sql(expression, "dtype") 1235 if not dtype: 1236 return super().altercolumn_sql(expression) 1237 1238 this = self.sql(expression, "this") 1239 return f"MODIFY COLUMN {this} {dtype}" 1240 1241 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1242 sql = self.sql(expression, arg) 1243 return f" {prefix} {sql}" if sql else "" 1244 1245 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1246 limit = self.sql(expression, "limit") 1247 offset = self.sql(expression, "offset") 1248 if limit: 1249 limit_offset = f"{offset}, {limit}" if offset else limit 1250 return f" LIMIT {limit_offset}" 1251 return "" 1252 1253 def chr_sql(self, expression: exp.Chr) -> str: 1254 this = self.expressions(sqls=[expression.this] + expression.expressions) 1255 charset = expression.args.get("charset") 1256 using = f" USING {self.sql(charset)}" if charset else "" 1257 return f"CHAR({this}{using})" 1258 1259 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1260 unit = expression.args.get("unit") 1261 1262 # Pick an old-enough date to avoid negative timestamp diffs 1263 start_ts = "'0000-01-01 00:00:00'" 1264 1265 # Source: https://stackoverflow.com/a/32955740 1266 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1267 interval = exp.Interval(this=timestamp_diff, unit=unit) 1268 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1269 1270 return self.sql(dateadd) 1271 1272 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1273 from_tz = expression.args.get("source_tz") 1274 to_tz = expression.args.get("target_tz") 1275 dt = expression.args.get("timestamp") 1276 1277 return self.func("CONVERT_TZ", dt, from_tz, to_tz) 1278 1279 def attimezone_sql(self, expression: exp.AtTimeZone) -> str: 1280 self.unsupported("AT TIME ZONE is not supported by MySQL") 1281 return self.sql(expression.this) 1282 1283 def isascii_sql(self, expression: exp.IsAscii) -> str: 1284 return f"REGEXP_LIKE({self.sql(expression.this)}, '^[[:ascii:]]*$')" 1285 1286 @unsupported_args("this") 1287 def currentschema_sql(self, expression: exp.CurrentSchema) -> str: 1288 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
WHEREclause. 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.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 =
{'empty', 'float8', 'reads', 'sql_small_result', 'int', 'databases', 'delayed', 'grant', 'io_before_gtids', 'nth_value', 'constraint', 'current_time', 'first_value', 'describe', 'like', 'optimize', 'on', 'distinctrow', 'call', 'between', 'alter', 'all', 'insensitive', 'kill', 'sensitive', 'where', 'show', 'terminated', 'decimal', 'high_priority', 'right', 'limit', 'low_priority', 'exit', 'asc', 'int2', 'int3', 'day_second', 'int4', 'smallint', 'blob', 'lag', 'enclosed', 'middleint', 'generated', 'bigint', 'replace', 'fulltext', 'varcharacter', 'linear', 'with', 'foreign', 'procedure', 'desc', 'unlock', 'key', 'of', 'load', 'straight_join', 'undo', 'int1', 'as', 'join', 'repeat', 'or', 'localtime', 'unsigned', 'in', 'true', 'default', 'current_timestamp', 'else', 'return', 'from', 'cascade', 'zerofill', 'int8', 'purge', 'tinyblob', 'null', 'current_user', 'lateral', 'natural', 'mod', 'option', 'utc_date', 'function', 'then', 'select', 'varchar', 'sql_calc_found_rows', 'rank', 'year_month', 'check', 'dual', 'fetch', 'window', 'mediumtext', 'longtext', 'escaped', 'inner', 'integer', 'precision', 'continue', 'delete', 'index', 'optimizer_costs', 'stored', 'unique', 'percent_rank', 'not', 'sqlwarning', 'current_date', 'infile', 'inout', 'separator', 'outfile', 'hour_microsecond', 'grouping', 'groups', 'sql', 'is', 'iterate', 'declare', 'last_value', 'require', 'schema', 'varbinary', 'case', 'intersect', 'day_hour', 'dec', 'using', 'ignore', 'mediumblob', 'tinytext', 'sql_big_result', 'hour_minute', 'spatial', 'false', 'leading', 'table', 'accessible', 'over', 'drop', 'each', 'when', 'maxvalue', 'ssl', 'both', 'localtimestamp', 'insert', 'tinyint', 'revoke', 'write', 'exists', 'sqlstate', 'usage', 'json_table', 'outer', 'longblob', 'column', 'master_bind', 'set', 'day_minute', 'by', 'for', 'long', 'master_ssl_verify_server_cert', 'modifies', 'signal', 'float4', 'if', 'resignal', 'rows', 'specific', 'distinct', 'no_write_to_binlog', 'order', 'cursor', 'partition', 'cross', 'read', 'use', 'loop', 'real', 'schemas', 'update', 'rlike', 'to', 'utc_time', 'references', 'lead', 'restrict', 'character', 'analyze', 'char', 'create', 'elseif', 'rename', 'dense_rank', 'union', 'double', 'into', 'numeric', 'day_microsecond', 'while', 'minute_second', 'out', 'row', 'and', 'cube', 'convert', 'release', 'binary', 'recursive', 'row_number', 'ntile', 'varying', 'trailing', 'virtual', 'change', 'force', 'leave', 'keys', 'match', 'minute_microsecond', 'add', 'sqlexception', 'system', 'group', 'having', 'optionally', 'mediumint', 'read_write', 'except', 'trigger', 'explain', 'deterministic', 'values', 'left', 'lines', 'condition', 'xor', 'hour_second', 'range', 'div', 'float', 'utc_timestamp', 'io_after_gtids', 'asensitive', 'database', 'primary', 'lock', 'second_microsecond', 'before', 'get', 'cume_dist', 'collate', 'starting', 'regexp', 'interval'}
def
computedcolumnconstraint_sql(self, expression: sqlglot.expressions.ComputedColumnConstraint) -> str:
1164 def datatype_sql(self, expression: exp.DataType) -> str: 1165 if ( 1166 self.VARCHAR_REQUIRES_SIZE 1167 and expression.is_type(exp.DataType.Type.VARCHAR) 1168 and not expression.expressions 1169 ): 1170 # `VARCHAR` must always have a size - if it doesn't, we always generate `TEXT` 1171 return "TEXT" 1172 1173 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1174 result = super().datatype_sql(expression) 1175 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1176 result = f"{result} UNSIGNED" 1177 1178 return result
def
cast_sql( self, expression: sqlglot.expressions.Cast, safe_prefix: Optional[str] = None) -> str:
1183 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1184 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1185 return self.func("TIMESTAMP", expression.this) 1186 1187 to = self.CAST_MAPPING.get(expression.to.this) 1188 1189 if to: 1190 expression.to.set("this", to) 1191 return super().cast_sql(expression)
1193 def show_sql(self, expression: exp.Show) -> str: 1194 this = f" {expression.name}" 1195 full = " FULL" if expression.args.get("full") else "" 1196 global_ = " GLOBAL" if expression.args.get("global") else "" 1197 1198 target = self.sql(expression, "target") 1199 target = f" {target}" if target else "" 1200 if expression.name in ("COLUMNS", "INDEX"): 1201 target = f" FROM{target}" 1202 elif expression.name == "GRANTS": 1203 target = f" FOR{target}" 1204 1205 db = self._prefixed_sql("FROM", expression, "db") 1206 1207 like = self._prefixed_sql("LIKE", expression, "like") 1208 where = self.sql(expression, "where") 1209 1210 types = self.expressions(expression, key="types") 1211 types = f" {types}" if types else types 1212 query = self._prefixed_sql("FOR QUERY", expression, "query") 1213 1214 if expression.name == "PROFILE": 1215 offset = self._prefixed_sql("OFFSET", expression, "offset") 1216 limit = self._prefixed_sql("LIMIT", expression, "limit") 1217 else: 1218 offset = "" 1219 limit = self._oldstyle_limit_sql(expression) 1220 1221 log = self._prefixed_sql("IN", expression, "log") 1222 position = self._prefixed_sql("FROM", expression, "position") 1223 1224 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1225 1226 if expression.name == "ENGINE": 1227 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1228 else: 1229 mutex_or_status = "" 1230 1231 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}"
1259 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1260 unit = expression.args.get("unit") 1261 1262 # Pick an old-enough date to avoid negative timestamp diffs 1263 start_ts = "'0000-01-01 00:00:00'" 1264 1265 # Source: https://stackoverflow.com/a/32955740 1266 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1267 interval = exp.Interval(this=timestamp_diff, unit=unit) 1268 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1269 1270 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
- 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
- get_put_sql
- translatecharacters_sql
- decodecase_sql
- semanticview_sql
- getextract_sql
- datefromunixdate_sql
- space_sql
- buildproperty_sql
- refreshtriggerproperty_sql