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 locate_to_strposition, 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_to_locate_sql, 26 unit_to_var, 27) 28from sqlglot.helper import seq_get 29from sqlglot.tokens import TokenType 30 31 32def _show_parser(*args: t.Any, **kwargs: t.Any) -> t.Callable[[MySQL.Parser], exp.Show]: 33 def _parse(self: MySQL.Parser) -> exp.Show: 34 return self._parse_show_mysql(*args, **kwargs) 35 36 return _parse 37 38 39def _date_trunc_sql(self: MySQL.Generator, expression: exp.DateTrunc) -> str: 40 expr = self.sql(expression, "this") 41 unit = expression.text("unit").upper() 42 43 if unit == "WEEK": 44 concat = f"CONCAT(YEAR({expr}), ' ', WEEK({expr}, 1), ' 1')" 45 date_format = "%Y %u %w" 46 elif unit == "MONTH": 47 concat = f"CONCAT(YEAR({expr}), ' ', MONTH({expr}), ' 1')" 48 date_format = "%Y %c %e" 49 elif unit == "QUARTER": 50 concat = f"CONCAT(YEAR({expr}), ' ', QUARTER({expr}) * 3 - 2, ' 1')" 51 date_format = "%Y %c %e" 52 elif unit == "YEAR": 53 concat = f"CONCAT(YEAR({expr}), ' 1 1')" 54 date_format = "%Y %c %e" 55 else: 56 if unit != "DAY": 57 self.unsupported(f"Unexpected interval unit: {unit}") 58 return self.func("DATE", expr) 59 60 return self.func("STR_TO_DATE", concat, f"'{date_format}'") 61 62 63# All specifiers for time parts (as opposed to date parts) 64# https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format 65TIME_SPECIFIERS = {"f", "H", "h", "I", "i", "k", "l", "p", "r", "S", "s", "T"} 66 67 68def _has_time_specifier(date_format: str) -> bool: 69 i = 0 70 length = len(date_format) 71 72 while i < length: 73 if date_format[i] == "%": 74 i += 1 75 if i < length and date_format[i] in TIME_SPECIFIERS: 76 return True 77 i += 1 78 return False 79 80 81def _str_to_date(args: t.List) -> exp.StrToDate | exp.StrToTime: 82 mysql_date_format = seq_get(args, 1) 83 date_format = MySQL.format_time(mysql_date_format) 84 this = seq_get(args, 0) 85 86 if mysql_date_format and _has_time_specifier(mysql_date_format.name): 87 return exp.StrToTime(this=this, format=date_format) 88 89 return exp.StrToDate(this=this, format=date_format) 90 91 92def _str_to_date_sql( 93 self: MySQL.Generator, expression: exp.StrToDate | exp.StrToTime | exp.TsOrDsToDate 94) -> str: 95 return self.func("STR_TO_DATE", expression.this, self.format_time(expression)) 96 97 98def _trim_sql(self: MySQL.Generator, expression: exp.Trim) -> str: 99 target = self.sql(expression, "this") 100 trim_type = self.sql(expression, "position") 101 remove_chars = self.sql(expression, "expression") 102 103 # Use TRIM/LTRIM/RTRIM syntax if the expression isn't mysql-specific 104 if not remove_chars: 105 return self.trim_sql(expression) 106 107 trim_type = f"{trim_type} " if trim_type else "" 108 remove_chars = f"{remove_chars} " if remove_chars else "" 109 from_part = "FROM " if trim_type or remove_chars else "" 110 return f"TRIM({trim_type}{remove_chars}{from_part}{target})" 111 112 113def _unix_to_time_sql(self: MySQL.Generator, expression: exp.UnixToTime) -> str: 114 scale = expression.args.get("scale") 115 timestamp = expression.this 116 117 if scale in (None, exp.UnixToTime.SECONDS): 118 return self.func("FROM_UNIXTIME", timestamp, self.format_time(expression)) 119 120 return self.func( 121 "FROM_UNIXTIME", 122 exp.Div(this=timestamp, expression=exp.func("POW", 10, scale)), 123 self.format_time(expression), 124 ) 125 126 127def date_add_sql( 128 kind: str, 129) -> t.Callable[[generator.Generator, exp.Expression], str]: 130 def func(self: generator.Generator, expression: exp.Expression) -> str: 131 return self.func( 132 f"DATE_{kind}", 133 expression.this, 134 exp.Interval(this=expression.expression, unit=unit_to_var(expression)), 135 ) 136 137 return func 138 139 140def _ts_or_ds_to_date_sql(self: MySQL.Generator, expression: exp.TsOrDsToDate) -> str: 141 time_format = expression.args.get("format") 142 return _str_to_date_sql(self, expression) if time_format else self.func("DATE", expression.this) 143 144 145def _remove_ts_or_ds_to_date( 146 to_sql: t.Optional[t.Callable[[MySQL.Generator, exp.Expression], str]] = None, 147 args: t.Tuple[str, ...] = ("this",), 148) -> t.Callable[[MySQL.Generator, exp.Func], str]: 149 def func(self: MySQL.Generator, expression: exp.Func) -> str: 150 for arg_key in args: 151 arg = expression.args.get(arg_key) 152 if isinstance(arg, exp.TsOrDsToDate) and not arg.args.get("format"): 153 expression.set(arg_key, arg.this) 154 155 return to_sql(self, expression) if to_sql else self.function_fallback_sql(expression) 156 157 return func 158 159 160class MySQL(Dialect): 161 # https://dev.mysql.com/doc/refman/8.0/en/identifiers.html 162 IDENTIFIERS_CAN_START_WITH_DIGIT = True 163 164 # We default to treating all identifiers as case-sensitive, since it matches MySQL's 165 # behavior on Linux systems. For MacOS and Windows systems, one can override this 166 # setting by specifying `dialect="mysql, normalization_strategy = lowercase"`. 167 # 168 # See also https://dev.mysql.com/doc/refman/8.2/en/identifier-case-sensitivity.html 169 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_SENSITIVE 170 171 TIME_FORMAT = "'%Y-%m-%d %T'" 172 DPIPE_IS_STRING_CONCAT = False 173 SUPPORTS_USER_DEFINED_TYPES = False 174 SUPPORTS_SEMI_ANTI_JOIN = False 175 SAFE_DIVISION = True 176 177 # https://prestodb.io/docs/current/functions/datetime.html#mysql-date-functions 178 TIME_MAPPING = { 179 "%M": "%B", 180 "%c": "%-m", 181 "%e": "%-d", 182 "%h": "%I", 183 "%i": "%M", 184 "%s": "%S", 185 "%u": "%W", 186 "%k": "%-H", 187 "%l": "%-I", 188 "%T": "%H:%M:%S", 189 "%W": "%a", 190 } 191 192 class Tokenizer(tokens.Tokenizer): 193 QUOTES = ["'", '"'] 194 COMMENTS = ["--", "#", ("/*", "*/")] 195 IDENTIFIERS = ["`"] 196 STRING_ESCAPES = ["'", '"', "\\"] 197 BIT_STRINGS = [("b'", "'"), ("B'", "'"), ("0b", "")] 198 HEX_STRINGS = [("x'", "'"), ("X'", "'"), ("0x", "")] 199 200 KEYWORDS = { 201 **tokens.Tokenizer.KEYWORDS, 202 "CHARSET": TokenType.CHARACTER_SET, 203 "FORCE": TokenType.FORCE, 204 "IGNORE": TokenType.IGNORE, 205 "LOCK TABLES": TokenType.COMMAND, 206 "LONGBLOB": TokenType.LONGBLOB, 207 "LONGTEXT": TokenType.LONGTEXT, 208 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 209 "TINYBLOB": TokenType.TINYBLOB, 210 "TINYTEXT": TokenType.TINYTEXT, 211 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 212 "MEDIUMINT": TokenType.MEDIUMINT, 213 "MEMBER OF": TokenType.MEMBER_OF, 214 "SEPARATOR": TokenType.SEPARATOR, 215 "START": TokenType.BEGIN, 216 "SIGNED": TokenType.BIGINT, 217 "SIGNED INTEGER": TokenType.BIGINT, 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 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 305 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 306 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 307 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 308 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 309 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 310 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 311 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 312 "INSTR": lambda args: exp.StrPosition(substr=seq_get(args, 1), this=seq_get(args, 0)), 313 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 314 "ISNULL": isnull_to_is_null, 315 "LOCATE": locate_to_strposition, 316 "MAKETIME": exp.TimeFromParts.from_arg_list, 317 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 318 "MONTHNAME": lambda args: exp.TimeToStr( 319 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 320 format=exp.Literal.string("%B"), 321 ), 322 "STR_TO_DATE": _str_to_date, 323 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 324 "TO_DAYS": lambda args: exp.paren( 325 exp.DateDiff( 326 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 327 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 328 unit=exp.var("DAY"), 329 ) 330 + 1 331 ), 332 "WEEK": lambda args: exp.Week( 333 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 334 ), 335 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 336 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 337 } 338 339 FUNCTION_PARSERS = { 340 **parser.Parser.FUNCTION_PARSERS, 341 "CHAR": lambda self: self._parse_chr(), 342 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 343 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 344 "VALUES": lambda self: self.expression( 345 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 346 ), 347 } 348 349 STATEMENT_PARSERS = { 350 **parser.Parser.STATEMENT_PARSERS, 351 TokenType.SHOW: lambda self: self._parse_show(), 352 } 353 354 SHOW_PARSERS = { 355 "BINARY LOGS": _show_parser("BINARY LOGS"), 356 "MASTER LOGS": _show_parser("BINARY LOGS"), 357 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 358 "CHARACTER SET": _show_parser("CHARACTER SET"), 359 "CHARSET": _show_parser("CHARACTER SET"), 360 "COLLATION": _show_parser("COLLATION"), 361 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 362 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 363 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 364 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 365 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 366 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 367 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 368 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 369 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 370 "DATABASES": _show_parser("DATABASES"), 371 "SCHEMAS": _show_parser("DATABASES"), 372 "ENGINE": _show_parser("ENGINE", target=True), 373 "STORAGE ENGINES": _show_parser("ENGINES"), 374 "ENGINES": _show_parser("ENGINES"), 375 "ERRORS": _show_parser("ERRORS"), 376 "EVENTS": _show_parser("EVENTS"), 377 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 378 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 379 "GRANTS": _show_parser("GRANTS", target="FOR"), 380 "INDEX": _show_parser("INDEX", target="FROM"), 381 "MASTER STATUS": _show_parser("MASTER STATUS"), 382 "OPEN TABLES": _show_parser("OPEN TABLES"), 383 "PLUGINS": _show_parser("PLUGINS"), 384 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 385 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 386 "PRIVILEGES": _show_parser("PRIVILEGES"), 387 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 388 "PROCESSLIST": _show_parser("PROCESSLIST"), 389 "PROFILE": _show_parser("PROFILE"), 390 "PROFILES": _show_parser("PROFILES"), 391 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 392 "REPLICAS": _show_parser("REPLICAS"), 393 "SLAVE HOSTS": _show_parser("REPLICAS"), 394 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 395 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 396 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 397 "SESSION STATUS": _show_parser("STATUS"), 398 "STATUS": _show_parser("STATUS"), 399 "TABLE STATUS": _show_parser("TABLE STATUS"), 400 "FULL TABLES": _show_parser("TABLES", full=True), 401 "TABLES": _show_parser("TABLES"), 402 "TRIGGERS": _show_parser("TRIGGERS"), 403 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 404 "SESSION VARIABLES": _show_parser("VARIABLES"), 405 "VARIABLES": _show_parser("VARIABLES"), 406 "WARNINGS": _show_parser("WARNINGS"), 407 } 408 409 PROPERTY_PARSERS = { 410 **parser.Parser.PROPERTY_PARSERS, 411 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 412 } 413 414 SET_PARSERS = { 415 **parser.Parser.SET_PARSERS, 416 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 417 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 418 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 419 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 420 "NAMES": lambda self: self._parse_set_item_names(), 421 } 422 423 CONSTRAINT_PARSERS = { 424 **parser.Parser.CONSTRAINT_PARSERS, 425 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 426 "INDEX": lambda self: self._parse_index_constraint(), 427 "KEY": lambda self: self._parse_index_constraint(), 428 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 429 } 430 431 ALTER_PARSERS = { 432 **parser.Parser.ALTER_PARSERS, 433 "MODIFY": lambda self: self._parse_alter_table_alter(), 434 } 435 436 SCHEMA_UNNAMED_CONSTRAINTS = { 437 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 438 "FULLTEXT", 439 "INDEX", 440 "KEY", 441 "SPATIAL", 442 } 443 444 PROFILE_TYPES: parser.OPTIONS_TYPE = { 445 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 446 "BLOCK": ("IO",), 447 "CONTEXT": ("SWITCHES",), 448 "PAGE": ("FAULTS",), 449 } 450 451 TYPE_TOKENS = { 452 *parser.Parser.TYPE_TOKENS, 453 TokenType.SET, 454 } 455 456 ENUM_TYPE_TOKENS = { 457 *parser.Parser.ENUM_TYPE_TOKENS, 458 TokenType.SET, 459 } 460 461 LOG_DEFAULTS_TO_LN = True 462 STRING_ALIASES = True 463 VALUES_FOLLOWED_BY_PAREN = False 464 SUPPORTS_PARTITION_SELECTION = True 465 466 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 467 this = self._parse_id_var() 468 if not self._match(TokenType.L_PAREN): 469 return this 470 471 expression = self._parse_number() 472 self._match_r_paren() 473 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 474 475 def _parse_index_constraint( 476 self, kind: t.Optional[str] = None 477 ) -> exp.IndexColumnConstraint: 478 if kind: 479 self._match_texts(("INDEX", "KEY")) 480 481 this = self._parse_id_var(any_token=False) 482 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 483 expressions = self._parse_wrapped_csv(self._parse_ordered) 484 485 options = [] 486 while True: 487 if self._match_text_seq("KEY_BLOCK_SIZE"): 488 self._match(TokenType.EQ) 489 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 490 elif self._match(TokenType.USING): 491 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 492 elif self._match_text_seq("WITH", "PARSER"): 493 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 494 elif self._match(TokenType.COMMENT): 495 opt = exp.IndexConstraintOption(comment=self._parse_string()) 496 elif self._match_text_seq("VISIBLE"): 497 opt = exp.IndexConstraintOption(visible=True) 498 elif self._match_text_seq("INVISIBLE"): 499 opt = exp.IndexConstraintOption(visible=False) 500 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 501 self._match(TokenType.EQ) 502 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 503 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 504 self._match(TokenType.EQ) 505 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 506 else: 507 opt = None 508 509 if not opt: 510 break 511 512 options.append(opt) 513 514 return self.expression( 515 exp.IndexColumnConstraint, 516 this=this, 517 expressions=expressions, 518 kind=kind, 519 index_type=index_type, 520 options=options, 521 ) 522 523 def _parse_show_mysql( 524 self, 525 this: str, 526 target: bool | str = False, 527 full: t.Optional[bool] = None, 528 global_: t.Optional[bool] = None, 529 ) -> exp.Show: 530 if target: 531 if isinstance(target, str): 532 self._match_text_seq(target) 533 target_id = self._parse_id_var() 534 else: 535 target_id = None 536 537 log = self._parse_string() if self._match_text_seq("IN") else None 538 539 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 540 position = self._parse_number() if self._match_text_seq("FROM") else None 541 db = None 542 else: 543 position = None 544 db = None 545 546 if self._match(TokenType.FROM): 547 db = self._parse_id_var() 548 elif self._match(TokenType.DOT): 549 db = target_id 550 target_id = self._parse_id_var() 551 552 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 553 554 like = self._parse_string() if self._match_text_seq("LIKE") else None 555 where = self._parse_where() 556 557 if this == "PROFILE": 558 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 559 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 560 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 561 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 562 else: 563 types, query = None, None 564 offset, limit = self._parse_oldstyle_limit() 565 566 mutex = True if self._match_text_seq("MUTEX") else None 567 mutex = False if self._match_text_seq("STATUS") else mutex 568 569 return self.expression( 570 exp.Show, 571 this=this, 572 target=target_id, 573 full=full, 574 log=log, 575 position=position, 576 db=db, 577 channel=channel, 578 like=like, 579 where=where, 580 types=types, 581 query=query, 582 offset=offset, 583 limit=limit, 584 mutex=mutex, 585 **{"global": global_}, # type: ignore 586 ) 587 588 def _parse_oldstyle_limit( 589 self, 590 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 591 limit = None 592 offset = None 593 if self._match_text_seq("LIMIT"): 594 parts = self._parse_csv(self._parse_number) 595 if len(parts) == 1: 596 limit = parts[0] 597 elif len(parts) == 2: 598 limit = parts[1] 599 offset = parts[0] 600 601 return offset, limit 602 603 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 604 this = self._parse_string() or self._parse_unquoted_field() 605 return self.expression(exp.SetItem, this=this, kind=kind) 606 607 def _parse_set_item_names(self) -> exp.Expression: 608 charset = self._parse_string() or self._parse_unquoted_field() 609 if self._match_text_seq("COLLATE"): 610 collate = self._parse_string() or self._parse_unquoted_field() 611 else: 612 collate = None 613 614 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 615 616 def _parse_type( 617 self, parse_interval: bool = True, fallback_to_identifier: bool = False 618 ) -> t.Optional[exp.Expression]: 619 # mysql binary is special and can work anywhere, even in order by operations 620 # it operates like a no paren func 621 if self._match(TokenType.BINARY, advance=False): 622 data_type = self._parse_types(check_func=True, allow_identifiers=False) 623 624 if isinstance(data_type, exp.DataType): 625 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 626 627 return super()._parse_type( 628 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 629 ) 630 631 def _parse_chr(self) -> t.Optional[exp.Expression]: 632 expressions = self._parse_csv(self._parse_assignment) 633 kwargs: t.Dict[str, t.Any] = {"this": seq_get(expressions, 0)} 634 635 if len(expressions) > 1: 636 kwargs["expressions"] = expressions[1:] 637 638 if self._match(TokenType.USING): 639 kwargs["charset"] = self._parse_var() 640 641 return self.expression(exp.Chr, **kwargs) 642 643 def _parse_group_concat(self) -> t.Optional[exp.Expression]: 644 def concat_exprs( 645 node: t.Optional[exp.Expression], exprs: t.List[exp.Expression] 646 ) -> exp.Expression: 647 if isinstance(node, exp.Distinct) and len(node.expressions) > 1: 648 concat_exprs = [ 649 self.expression(exp.Concat, expressions=node.expressions, safe=True) 650 ] 651 node.set("expressions", concat_exprs) 652 return node 653 if len(exprs) == 1: 654 return exprs[0] 655 return self.expression(exp.Concat, expressions=args, safe=True) 656 657 args = self._parse_csv(self._parse_lambda) 658 659 if args: 660 order = args[-1] if isinstance(args[-1], exp.Order) else None 661 662 if order: 663 # Order By is the last (or only) expression in the list and has consumed the 'expr' before it, 664 # remove 'expr' from exp.Order and add it back to args 665 args[-1] = order.this 666 order.set("this", concat_exprs(order.this, args)) 667 668 this = order or concat_exprs(args[0], args) 669 else: 670 this = None 671 672 separator = self._parse_field() if self._match(TokenType.SEPARATOR) else None 673 674 return self.expression(exp.GroupConcat, this=this, separator=separator) 675 676 class Generator(generator.Generator): 677 INTERVAL_ALLOWS_PLURAL_FORM = False 678 LOCKING_READS_SUPPORTED = True 679 NULL_ORDERING_SUPPORTED = None 680 JOIN_HINTS = False 681 TABLE_HINTS = True 682 DUPLICATE_KEY_UPDATE_WITH_SET = False 683 QUERY_HINT_SEP = " " 684 VALUES_AS_TABLE = False 685 NVL2_SUPPORTED = False 686 LAST_DAY_SUPPORTS_DATE_PART = False 687 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 688 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 689 JSON_KEY_VALUE_PAIR_SEP = "," 690 SUPPORTS_TO_NUMBER = False 691 692 TRANSFORMS = { 693 **generator.Generator.TRANSFORMS, 694 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 695 exp.CurrentDate: no_paren_current_date_sql, 696 exp.DateDiff: _remove_ts_or_ds_to_date( 697 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 698 ), 699 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 700 exp.DateStrToDate: datestrtodate_sql, 701 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 702 exp.DateTrunc: _date_trunc_sql, 703 exp.Day: _remove_ts_or_ds_to_date(), 704 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 705 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 706 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 707 exp.GroupConcat: lambda self, 708 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 709 exp.ILike: no_ilike_sql, 710 exp.JSONExtractScalar: arrow_json_extract_sql, 711 exp.Max: max_or_greatest, 712 exp.Min: min_or_least, 713 exp.Month: _remove_ts_or_ds_to_date(), 714 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 715 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 716 exp.ParseJSON: lambda self, e: self.sql(e, "this"), 717 exp.Pivot: no_pivot_sql, 718 exp.Select: transforms.preprocess( 719 [ 720 transforms.eliminate_distinct_on, 721 transforms.eliminate_semi_and_anti_joins, 722 transforms.eliminate_qualify, 723 transforms.eliminate_full_outer_join, 724 ] 725 ), 726 exp.StrPosition: strposition_to_locate_sql, 727 exp.StrToDate: _str_to_date_sql, 728 exp.StrToTime: _str_to_date_sql, 729 exp.Stuff: rename_func("INSERT"), 730 exp.TableSample: no_tablesample_sql, 731 exp.TimeFromParts: rename_func("MAKETIME"), 732 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 733 exp.TimestampDiff: lambda self, e: self.func( 734 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 735 ), 736 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 737 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 738 exp.TimeStrToTime: lambda self, e: self.sql( 739 exp.cast(e.this, exp.DataType.Type.DATETIME, copy=True) 740 ), 741 exp.TimeToStr: _remove_ts_or_ds_to_date( 742 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 743 ), 744 exp.Trim: _trim_sql, 745 exp.TryCast: no_trycast_sql, 746 exp.TsOrDsAdd: date_add_sql("ADD"), 747 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 748 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 749 exp.UnixToTime: _unix_to_time_sql, 750 exp.Week: _remove_ts_or_ds_to_date(), 751 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 752 exp.Year: _remove_ts_or_ds_to_date(), 753 } 754 755 UNSIGNED_TYPE_MAPPING = { 756 exp.DataType.Type.UBIGINT: "BIGINT", 757 exp.DataType.Type.UINT: "INT", 758 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 759 exp.DataType.Type.USMALLINT: "SMALLINT", 760 exp.DataType.Type.UTINYINT: "TINYINT", 761 exp.DataType.Type.UDECIMAL: "DECIMAL", 762 } 763 764 TIMESTAMP_TYPE_MAPPING = { 765 exp.DataType.Type.TIMESTAMP: "DATETIME", 766 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 767 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 768 } 769 770 TYPE_MAPPING = { 771 **generator.Generator.TYPE_MAPPING, 772 **UNSIGNED_TYPE_MAPPING, 773 **TIMESTAMP_TYPE_MAPPING, 774 } 775 776 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 777 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 778 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 779 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 780 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 781 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 782 783 PROPERTIES_LOCATION = { 784 **generator.Generator.PROPERTIES_LOCATION, 785 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 786 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 787 } 788 789 LIMIT_FETCH = "LIMIT" 790 791 LIMIT_ONLY_LITERALS = True 792 793 CHAR_CAST_MAPPING = dict.fromkeys( 794 ( 795 exp.DataType.Type.LONGTEXT, 796 exp.DataType.Type.LONGBLOB, 797 exp.DataType.Type.MEDIUMBLOB, 798 exp.DataType.Type.MEDIUMTEXT, 799 exp.DataType.Type.TEXT, 800 exp.DataType.Type.TINYBLOB, 801 exp.DataType.Type.TINYTEXT, 802 exp.DataType.Type.VARCHAR, 803 ), 804 "CHAR", 805 ) 806 SIGNED_CAST_MAPPING = dict.fromkeys( 807 ( 808 exp.DataType.Type.BIGINT, 809 exp.DataType.Type.BOOLEAN, 810 exp.DataType.Type.INT, 811 exp.DataType.Type.SMALLINT, 812 exp.DataType.Type.TINYINT, 813 exp.DataType.Type.MEDIUMINT, 814 ), 815 "SIGNED", 816 ) 817 818 # MySQL doesn't support many datatypes in cast. 819 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 820 CAST_MAPPING = { 821 **CHAR_CAST_MAPPING, 822 **SIGNED_CAST_MAPPING, 823 exp.DataType.Type.UBIGINT: "UNSIGNED", 824 } 825 826 TIMESTAMP_FUNC_TYPES = { 827 exp.DataType.Type.TIMESTAMPTZ, 828 exp.DataType.Type.TIMESTAMPLTZ, 829 } 830 831 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 832 RESERVED_KEYWORDS = { 833 "accessible", 834 "add", 835 "all", 836 "alter", 837 "analyze", 838 "and", 839 "as", 840 "asc", 841 "asensitive", 842 "before", 843 "between", 844 "bigint", 845 "binary", 846 "blob", 847 "both", 848 "by", 849 "call", 850 "cascade", 851 "case", 852 "change", 853 "char", 854 "character", 855 "check", 856 "collate", 857 "column", 858 "condition", 859 "constraint", 860 "continue", 861 "convert", 862 "create", 863 "cross", 864 "cube", 865 "cume_dist", 866 "current_date", 867 "current_time", 868 "current_timestamp", 869 "current_user", 870 "cursor", 871 "database", 872 "databases", 873 "day_hour", 874 "day_microsecond", 875 "day_minute", 876 "day_second", 877 "dec", 878 "decimal", 879 "declare", 880 "default", 881 "delayed", 882 "delete", 883 "dense_rank", 884 "desc", 885 "describe", 886 "deterministic", 887 "distinct", 888 "distinctrow", 889 "div", 890 "double", 891 "drop", 892 "dual", 893 "each", 894 "else", 895 "elseif", 896 "empty", 897 "enclosed", 898 "escaped", 899 "except", 900 "exists", 901 "exit", 902 "explain", 903 "false", 904 "fetch", 905 "first_value", 906 "float", 907 "float4", 908 "float8", 909 "for", 910 "force", 911 "foreign", 912 "from", 913 "fulltext", 914 "function", 915 "generated", 916 "get", 917 "grant", 918 "group", 919 "grouping", 920 "groups", 921 "having", 922 "high_priority", 923 "hour_microsecond", 924 "hour_minute", 925 "hour_second", 926 "if", 927 "ignore", 928 "in", 929 "index", 930 "infile", 931 "inner", 932 "inout", 933 "insensitive", 934 "insert", 935 "int", 936 "int1", 937 "int2", 938 "int3", 939 "int4", 940 "int8", 941 "integer", 942 "intersect", 943 "interval", 944 "into", 945 "io_after_gtids", 946 "io_before_gtids", 947 "is", 948 "iterate", 949 "join", 950 "json_table", 951 "key", 952 "keys", 953 "kill", 954 "lag", 955 "last_value", 956 "lateral", 957 "lead", 958 "leading", 959 "leave", 960 "left", 961 "like", 962 "limit", 963 "linear", 964 "lines", 965 "load", 966 "localtime", 967 "localtimestamp", 968 "lock", 969 "long", 970 "longblob", 971 "longtext", 972 "loop", 973 "low_priority", 974 "master_bind", 975 "master_ssl_verify_server_cert", 976 "match", 977 "maxvalue", 978 "mediumblob", 979 "mediumint", 980 "mediumtext", 981 "middleint", 982 "minute_microsecond", 983 "minute_second", 984 "mod", 985 "modifies", 986 "natural", 987 "not", 988 "no_write_to_binlog", 989 "nth_value", 990 "ntile", 991 "null", 992 "numeric", 993 "of", 994 "on", 995 "optimize", 996 "optimizer_costs", 997 "option", 998 "optionally", 999 "or", 1000 "order", 1001 "out", 1002 "outer", 1003 "outfile", 1004 "over", 1005 "partition", 1006 "percent_rank", 1007 "precision", 1008 "primary", 1009 "procedure", 1010 "purge", 1011 "range", 1012 "rank", 1013 "read", 1014 "reads", 1015 "read_write", 1016 "real", 1017 "recursive", 1018 "references", 1019 "regexp", 1020 "release", 1021 "rename", 1022 "repeat", 1023 "replace", 1024 "require", 1025 "resignal", 1026 "restrict", 1027 "return", 1028 "revoke", 1029 "right", 1030 "rlike", 1031 "row", 1032 "rows", 1033 "row_number", 1034 "schema", 1035 "schemas", 1036 "second_microsecond", 1037 "select", 1038 "sensitive", 1039 "separator", 1040 "set", 1041 "show", 1042 "signal", 1043 "smallint", 1044 "spatial", 1045 "specific", 1046 "sql", 1047 "sqlexception", 1048 "sqlstate", 1049 "sqlwarning", 1050 "sql_big_result", 1051 "sql_calc_found_rows", 1052 "sql_small_result", 1053 "ssl", 1054 "starting", 1055 "stored", 1056 "straight_join", 1057 "system", 1058 "table", 1059 "terminated", 1060 "then", 1061 "tinyblob", 1062 "tinyint", 1063 "tinytext", 1064 "to", 1065 "trailing", 1066 "trigger", 1067 "true", 1068 "undo", 1069 "union", 1070 "unique", 1071 "unlock", 1072 "unsigned", 1073 "update", 1074 "usage", 1075 "use", 1076 "using", 1077 "utc_date", 1078 "utc_time", 1079 "utc_timestamp", 1080 "values", 1081 "varbinary", 1082 "varchar", 1083 "varcharacter", 1084 "varying", 1085 "virtual", 1086 "when", 1087 "where", 1088 "while", 1089 "window", 1090 "with", 1091 "write", 1092 "xor", 1093 "year_month", 1094 "zerofill", 1095 "cume_dist", 1096 "dense_rank", 1097 "empty", 1098 "except", 1099 "first_value", 1100 "grouping", 1101 "groups", 1102 "intersect", 1103 "json_table", 1104 "lag", 1105 "last_value", 1106 "lateral", 1107 "lead", 1108 "nth_value", 1109 "ntile", 1110 "of", 1111 "over", 1112 "percent_rank", 1113 "rank", 1114 "recursive", 1115 "row_number", 1116 "system", 1117 "window", 1118 } 1119 1120 def array_sql(self, expression: exp.Array) -> str: 1121 self.unsupported("Arrays are not supported by MySQL") 1122 return self.function_fallback_sql(expression) 1123 1124 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1125 self.unsupported("Array operations are not supported by MySQL") 1126 return self.function_fallback_sql(expression) 1127 1128 def dpipe_sql(self, expression: exp.DPipe) -> str: 1129 return self.func("CONCAT", *expression.flatten()) 1130 1131 def extract_sql(self, expression: exp.Extract) -> str: 1132 unit = expression.name 1133 if unit and unit.lower() == "epoch": 1134 return self.func("UNIX_TIMESTAMP", expression.expression) 1135 1136 return super().extract_sql(expression) 1137 1138 def datatype_sql(self, expression: exp.DataType) -> str: 1139 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1140 result = super().datatype_sql(expression) 1141 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1142 result = f"{result} UNSIGNED" 1143 return result 1144 1145 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1146 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1147 1148 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1149 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1150 return self.func("TIMESTAMP", expression.this) 1151 1152 to = self.CAST_MAPPING.get(expression.to.this) 1153 1154 if to: 1155 expression.to.set("this", to) 1156 return super().cast_sql(expression) 1157 1158 def show_sql(self, expression: exp.Show) -> str: 1159 this = f" {expression.name}" 1160 full = " FULL" if expression.args.get("full") else "" 1161 global_ = " GLOBAL" if expression.args.get("global") else "" 1162 1163 target = self.sql(expression, "target") 1164 target = f" {target}" if target else "" 1165 if expression.name in ("COLUMNS", "INDEX"): 1166 target = f" FROM{target}" 1167 elif expression.name == "GRANTS": 1168 target = f" FOR{target}" 1169 1170 db = self._prefixed_sql("FROM", expression, "db") 1171 1172 like = self._prefixed_sql("LIKE", expression, "like") 1173 where = self.sql(expression, "where") 1174 1175 types = self.expressions(expression, key="types") 1176 types = f" {types}" if types else types 1177 query = self._prefixed_sql("FOR QUERY", expression, "query") 1178 1179 if expression.name == "PROFILE": 1180 offset = self._prefixed_sql("OFFSET", expression, "offset") 1181 limit = self._prefixed_sql("LIMIT", expression, "limit") 1182 else: 1183 offset = "" 1184 limit = self._oldstyle_limit_sql(expression) 1185 1186 log = self._prefixed_sql("IN", expression, "log") 1187 position = self._prefixed_sql("FROM", expression, "position") 1188 1189 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1190 1191 if expression.name == "ENGINE": 1192 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1193 else: 1194 mutex_or_status = "" 1195 1196 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1197 1198 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1199 dtype = self.sql(expression, "dtype") 1200 if not dtype: 1201 return super().altercolumn_sql(expression) 1202 1203 this = self.sql(expression, "this") 1204 return f"MODIFY COLUMN {this} {dtype}" 1205 1206 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1207 sql = self.sql(expression, arg) 1208 return f" {prefix} {sql}" if sql else "" 1209 1210 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1211 limit = self.sql(expression, "limit") 1212 offset = self.sql(expression, "offset") 1213 if limit: 1214 limit_offset = f"{offset}, {limit}" if offset else limit 1215 return f" LIMIT {limit_offset}" 1216 return "" 1217 1218 def chr_sql(self, expression: exp.Chr) -> str: 1219 this = self.expressions(sqls=[expression.this] + expression.expressions) 1220 charset = expression.args.get("charset") 1221 using = f" USING {self.sql(charset)}" if charset else "" 1222 return f"CHAR({this}{using})" 1223 1224 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1225 unit = expression.args.get("unit") 1226 1227 # Pick an old-enough date to avoid negative timestamp diffs 1228 start_ts = "'0000-01-01 00:00:00'" 1229 1230 # Source: https://stackoverflow.com/a/32955740 1231 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1232 interval = exp.Interval(this=timestamp_diff, unit=unit) 1233 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1234 1235 return self.sql(dateadd)
TIME_SPECIFIERS =
{'I', 's', 'i', 'f', 'l', 'H', 'k', 'r', 'T', 'p', 'h', 'S'}
def
date_add_sql( kind: str) -> Callable[[sqlglot.generator.Generator, sqlglot.expressions.Expression], str]:
128def date_add_sql( 129 kind: str, 130) -> t.Callable[[generator.Generator, exp.Expression], str]: 131 def func(self: generator.Generator, expression: exp.Expression) -> str: 132 return self.func( 133 f"DATE_{kind}", 134 expression.this, 135 exp.Interval(this=expression.expression, unit=unit_to_var(expression)), 136 ) 137 138 return func
161class MySQL(Dialect): 162 # https://dev.mysql.com/doc/refman/8.0/en/identifiers.html 163 IDENTIFIERS_CAN_START_WITH_DIGIT = True 164 165 # We default to treating all identifiers as case-sensitive, since it matches MySQL's 166 # behavior on Linux systems. For MacOS and Windows systems, one can override this 167 # setting by specifying `dialect="mysql, normalization_strategy = lowercase"`. 168 # 169 # See also https://dev.mysql.com/doc/refman/8.2/en/identifier-case-sensitivity.html 170 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_SENSITIVE 171 172 TIME_FORMAT = "'%Y-%m-%d %T'" 173 DPIPE_IS_STRING_CONCAT = False 174 SUPPORTS_USER_DEFINED_TYPES = False 175 SUPPORTS_SEMI_ANTI_JOIN = False 176 SAFE_DIVISION = True 177 178 # https://prestodb.io/docs/current/functions/datetime.html#mysql-date-functions 179 TIME_MAPPING = { 180 "%M": "%B", 181 "%c": "%-m", 182 "%e": "%-d", 183 "%h": "%I", 184 "%i": "%M", 185 "%s": "%S", 186 "%u": "%W", 187 "%k": "%-H", 188 "%l": "%-I", 189 "%T": "%H:%M:%S", 190 "%W": "%a", 191 } 192 193 class Tokenizer(tokens.Tokenizer): 194 QUOTES = ["'", '"'] 195 COMMENTS = ["--", "#", ("/*", "*/")] 196 IDENTIFIERS = ["`"] 197 STRING_ESCAPES = ["'", '"', "\\"] 198 BIT_STRINGS = [("b'", "'"), ("B'", "'"), ("0b", "")] 199 HEX_STRINGS = [("x'", "'"), ("X'", "'"), ("0x", "")] 200 201 KEYWORDS = { 202 **tokens.Tokenizer.KEYWORDS, 203 "CHARSET": TokenType.CHARACTER_SET, 204 "FORCE": TokenType.FORCE, 205 "IGNORE": TokenType.IGNORE, 206 "LOCK TABLES": TokenType.COMMAND, 207 "LONGBLOB": TokenType.LONGBLOB, 208 "LONGTEXT": TokenType.LONGTEXT, 209 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 210 "TINYBLOB": TokenType.TINYBLOB, 211 "TINYTEXT": TokenType.TINYTEXT, 212 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 213 "MEDIUMINT": TokenType.MEDIUMINT, 214 "MEMBER OF": TokenType.MEMBER_OF, 215 "SEPARATOR": TokenType.SEPARATOR, 216 "START": TokenType.BEGIN, 217 "SIGNED": TokenType.BIGINT, 218 "SIGNED INTEGER": TokenType.BIGINT, 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 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 306 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 307 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 308 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 309 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 310 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 311 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 312 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 313 "INSTR": lambda args: exp.StrPosition(substr=seq_get(args, 1), this=seq_get(args, 0)), 314 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 315 "ISNULL": isnull_to_is_null, 316 "LOCATE": locate_to_strposition, 317 "MAKETIME": exp.TimeFromParts.from_arg_list, 318 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 319 "MONTHNAME": lambda args: exp.TimeToStr( 320 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 321 format=exp.Literal.string("%B"), 322 ), 323 "STR_TO_DATE": _str_to_date, 324 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 325 "TO_DAYS": lambda args: exp.paren( 326 exp.DateDiff( 327 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 328 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 329 unit=exp.var("DAY"), 330 ) 331 + 1 332 ), 333 "WEEK": lambda args: exp.Week( 334 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 335 ), 336 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 337 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 338 } 339 340 FUNCTION_PARSERS = { 341 **parser.Parser.FUNCTION_PARSERS, 342 "CHAR": lambda self: self._parse_chr(), 343 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 344 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 345 "VALUES": lambda self: self.expression( 346 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 347 ), 348 } 349 350 STATEMENT_PARSERS = { 351 **parser.Parser.STATEMENT_PARSERS, 352 TokenType.SHOW: lambda self: self._parse_show(), 353 } 354 355 SHOW_PARSERS = { 356 "BINARY LOGS": _show_parser("BINARY LOGS"), 357 "MASTER LOGS": _show_parser("BINARY LOGS"), 358 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 359 "CHARACTER SET": _show_parser("CHARACTER SET"), 360 "CHARSET": _show_parser("CHARACTER SET"), 361 "COLLATION": _show_parser("COLLATION"), 362 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 363 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 364 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 365 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 366 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 367 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 368 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 369 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 370 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 371 "DATABASES": _show_parser("DATABASES"), 372 "SCHEMAS": _show_parser("DATABASES"), 373 "ENGINE": _show_parser("ENGINE", target=True), 374 "STORAGE ENGINES": _show_parser("ENGINES"), 375 "ENGINES": _show_parser("ENGINES"), 376 "ERRORS": _show_parser("ERRORS"), 377 "EVENTS": _show_parser("EVENTS"), 378 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 379 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 380 "GRANTS": _show_parser("GRANTS", target="FOR"), 381 "INDEX": _show_parser("INDEX", target="FROM"), 382 "MASTER STATUS": _show_parser("MASTER STATUS"), 383 "OPEN TABLES": _show_parser("OPEN TABLES"), 384 "PLUGINS": _show_parser("PLUGINS"), 385 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 386 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 387 "PRIVILEGES": _show_parser("PRIVILEGES"), 388 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 389 "PROCESSLIST": _show_parser("PROCESSLIST"), 390 "PROFILE": _show_parser("PROFILE"), 391 "PROFILES": _show_parser("PROFILES"), 392 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 393 "REPLICAS": _show_parser("REPLICAS"), 394 "SLAVE HOSTS": _show_parser("REPLICAS"), 395 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 396 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 397 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 398 "SESSION STATUS": _show_parser("STATUS"), 399 "STATUS": _show_parser("STATUS"), 400 "TABLE STATUS": _show_parser("TABLE STATUS"), 401 "FULL TABLES": _show_parser("TABLES", full=True), 402 "TABLES": _show_parser("TABLES"), 403 "TRIGGERS": _show_parser("TRIGGERS"), 404 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 405 "SESSION VARIABLES": _show_parser("VARIABLES"), 406 "VARIABLES": _show_parser("VARIABLES"), 407 "WARNINGS": _show_parser("WARNINGS"), 408 } 409 410 PROPERTY_PARSERS = { 411 **parser.Parser.PROPERTY_PARSERS, 412 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 413 } 414 415 SET_PARSERS = { 416 **parser.Parser.SET_PARSERS, 417 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 418 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 419 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 420 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 421 "NAMES": lambda self: self._parse_set_item_names(), 422 } 423 424 CONSTRAINT_PARSERS = { 425 **parser.Parser.CONSTRAINT_PARSERS, 426 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 427 "INDEX": lambda self: self._parse_index_constraint(), 428 "KEY": lambda self: self._parse_index_constraint(), 429 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 430 } 431 432 ALTER_PARSERS = { 433 **parser.Parser.ALTER_PARSERS, 434 "MODIFY": lambda self: self._parse_alter_table_alter(), 435 } 436 437 SCHEMA_UNNAMED_CONSTRAINTS = { 438 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 439 "FULLTEXT", 440 "INDEX", 441 "KEY", 442 "SPATIAL", 443 } 444 445 PROFILE_TYPES: parser.OPTIONS_TYPE = { 446 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 447 "BLOCK": ("IO",), 448 "CONTEXT": ("SWITCHES",), 449 "PAGE": ("FAULTS",), 450 } 451 452 TYPE_TOKENS = { 453 *parser.Parser.TYPE_TOKENS, 454 TokenType.SET, 455 } 456 457 ENUM_TYPE_TOKENS = { 458 *parser.Parser.ENUM_TYPE_TOKENS, 459 TokenType.SET, 460 } 461 462 LOG_DEFAULTS_TO_LN = True 463 STRING_ALIASES = True 464 VALUES_FOLLOWED_BY_PAREN = False 465 SUPPORTS_PARTITION_SELECTION = True 466 467 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 468 this = self._parse_id_var() 469 if not self._match(TokenType.L_PAREN): 470 return this 471 472 expression = self._parse_number() 473 self._match_r_paren() 474 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 475 476 def _parse_index_constraint( 477 self, kind: t.Optional[str] = None 478 ) -> exp.IndexColumnConstraint: 479 if kind: 480 self._match_texts(("INDEX", "KEY")) 481 482 this = self._parse_id_var(any_token=False) 483 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 484 expressions = self._parse_wrapped_csv(self._parse_ordered) 485 486 options = [] 487 while True: 488 if self._match_text_seq("KEY_BLOCK_SIZE"): 489 self._match(TokenType.EQ) 490 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 491 elif self._match(TokenType.USING): 492 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 493 elif self._match_text_seq("WITH", "PARSER"): 494 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 495 elif self._match(TokenType.COMMENT): 496 opt = exp.IndexConstraintOption(comment=self._parse_string()) 497 elif self._match_text_seq("VISIBLE"): 498 opt = exp.IndexConstraintOption(visible=True) 499 elif self._match_text_seq("INVISIBLE"): 500 opt = exp.IndexConstraintOption(visible=False) 501 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 502 self._match(TokenType.EQ) 503 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 504 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 505 self._match(TokenType.EQ) 506 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 507 else: 508 opt = None 509 510 if not opt: 511 break 512 513 options.append(opt) 514 515 return self.expression( 516 exp.IndexColumnConstraint, 517 this=this, 518 expressions=expressions, 519 kind=kind, 520 index_type=index_type, 521 options=options, 522 ) 523 524 def _parse_show_mysql( 525 self, 526 this: str, 527 target: bool | str = False, 528 full: t.Optional[bool] = None, 529 global_: t.Optional[bool] = None, 530 ) -> exp.Show: 531 if target: 532 if isinstance(target, str): 533 self._match_text_seq(target) 534 target_id = self._parse_id_var() 535 else: 536 target_id = None 537 538 log = self._parse_string() if self._match_text_seq("IN") else None 539 540 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 541 position = self._parse_number() if self._match_text_seq("FROM") else None 542 db = None 543 else: 544 position = None 545 db = None 546 547 if self._match(TokenType.FROM): 548 db = self._parse_id_var() 549 elif self._match(TokenType.DOT): 550 db = target_id 551 target_id = self._parse_id_var() 552 553 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 554 555 like = self._parse_string() if self._match_text_seq("LIKE") else None 556 where = self._parse_where() 557 558 if this == "PROFILE": 559 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 560 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 561 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 562 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 563 else: 564 types, query = None, None 565 offset, limit = self._parse_oldstyle_limit() 566 567 mutex = True if self._match_text_seq("MUTEX") else None 568 mutex = False if self._match_text_seq("STATUS") else mutex 569 570 return self.expression( 571 exp.Show, 572 this=this, 573 target=target_id, 574 full=full, 575 log=log, 576 position=position, 577 db=db, 578 channel=channel, 579 like=like, 580 where=where, 581 types=types, 582 query=query, 583 offset=offset, 584 limit=limit, 585 mutex=mutex, 586 **{"global": global_}, # type: ignore 587 ) 588 589 def _parse_oldstyle_limit( 590 self, 591 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 592 limit = None 593 offset = None 594 if self._match_text_seq("LIMIT"): 595 parts = self._parse_csv(self._parse_number) 596 if len(parts) == 1: 597 limit = parts[0] 598 elif len(parts) == 2: 599 limit = parts[1] 600 offset = parts[0] 601 602 return offset, limit 603 604 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 605 this = self._parse_string() or self._parse_unquoted_field() 606 return self.expression(exp.SetItem, this=this, kind=kind) 607 608 def _parse_set_item_names(self) -> exp.Expression: 609 charset = self._parse_string() or self._parse_unquoted_field() 610 if self._match_text_seq("COLLATE"): 611 collate = self._parse_string() or self._parse_unquoted_field() 612 else: 613 collate = None 614 615 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 616 617 def _parse_type( 618 self, parse_interval: bool = True, fallback_to_identifier: bool = False 619 ) -> t.Optional[exp.Expression]: 620 # mysql binary is special and can work anywhere, even in order by operations 621 # it operates like a no paren func 622 if self._match(TokenType.BINARY, advance=False): 623 data_type = self._parse_types(check_func=True, allow_identifiers=False) 624 625 if isinstance(data_type, exp.DataType): 626 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 627 628 return super()._parse_type( 629 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 630 ) 631 632 def _parse_chr(self) -> t.Optional[exp.Expression]: 633 expressions = self._parse_csv(self._parse_assignment) 634 kwargs: t.Dict[str, t.Any] = {"this": seq_get(expressions, 0)} 635 636 if len(expressions) > 1: 637 kwargs["expressions"] = expressions[1:] 638 639 if self._match(TokenType.USING): 640 kwargs["charset"] = self._parse_var() 641 642 return self.expression(exp.Chr, **kwargs) 643 644 def _parse_group_concat(self) -> t.Optional[exp.Expression]: 645 def concat_exprs( 646 node: t.Optional[exp.Expression], exprs: t.List[exp.Expression] 647 ) -> exp.Expression: 648 if isinstance(node, exp.Distinct) and len(node.expressions) > 1: 649 concat_exprs = [ 650 self.expression(exp.Concat, expressions=node.expressions, safe=True) 651 ] 652 node.set("expressions", concat_exprs) 653 return node 654 if len(exprs) == 1: 655 return exprs[0] 656 return self.expression(exp.Concat, expressions=args, safe=True) 657 658 args = self._parse_csv(self._parse_lambda) 659 660 if args: 661 order = args[-1] if isinstance(args[-1], exp.Order) else None 662 663 if order: 664 # Order By is the last (or only) expression in the list and has consumed the 'expr' before it, 665 # remove 'expr' from exp.Order and add it back to args 666 args[-1] = order.this 667 order.set("this", concat_exprs(order.this, args)) 668 669 this = order or concat_exprs(args[0], args) 670 else: 671 this = None 672 673 separator = self._parse_field() if self._match(TokenType.SEPARATOR) else None 674 675 return self.expression(exp.GroupConcat, this=this, separator=separator) 676 677 class Generator(generator.Generator): 678 INTERVAL_ALLOWS_PLURAL_FORM = False 679 LOCKING_READS_SUPPORTED = True 680 NULL_ORDERING_SUPPORTED = None 681 JOIN_HINTS = False 682 TABLE_HINTS = True 683 DUPLICATE_KEY_UPDATE_WITH_SET = False 684 QUERY_HINT_SEP = " " 685 VALUES_AS_TABLE = False 686 NVL2_SUPPORTED = False 687 LAST_DAY_SUPPORTS_DATE_PART = False 688 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 689 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 690 JSON_KEY_VALUE_PAIR_SEP = "," 691 SUPPORTS_TO_NUMBER = False 692 693 TRANSFORMS = { 694 **generator.Generator.TRANSFORMS, 695 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 696 exp.CurrentDate: no_paren_current_date_sql, 697 exp.DateDiff: _remove_ts_or_ds_to_date( 698 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 699 ), 700 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 701 exp.DateStrToDate: datestrtodate_sql, 702 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 703 exp.DateTrunc: _date_trunc_sql, 704 exp.Day: _remove_ts_or_ds_to_date(), 705 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 706 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 707 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 708 exp.GroupConcat: lambda self, 709 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 710 exp.ILike: no_ilike_sql, 711 exp.JSONExtractScalar: arrow_json_extract_sql, 712 exp.Max: max_or_greatest, 713 exp.Min: min_or_least, 714 exp.Month: _remove_ts_or_ds_to_date(), 715 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 716 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 717 exp.ParseJSON: lambda self, e: self.sql(e, "this"), 718 exp.Pivot: no_pivot_sql, 719 exp.Select: transforms.preprocess( 720 [ 721 transforms.eliminate_distinct_on, 722 transforms.eliminate_semi_and_anti_joins, 723 transforms.eliminate_qualify, 724 transforms.eliminate_full_outer_join, 725 ] 726 ), 727 exp.StrPosition: strposition_to_locate_sql, 728 exp.StrToDate: _str_to_date_sql, 729 exp.StrToTime: _str_to_date_sql, 730 exp.Stuff: rename_func("INSERT"), 731 exp.TableSample: no_tablesample_sql, 732 exp.TimeFromParts: rename_func("MAKETIME"), 733 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 734 exp.TimestampDiff: lambda self, e: self.func( 735 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 736 ), 737 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 738 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 739 exp.TimeStrToTime: lambda self, e: self.sql( 740 exp.cast(e.this, exp.DataType.Type.DATETIME, copy=True) 741 ), 742 exp.TimeToStr: _remove_ts_or_ds_to_date( 743 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 744 ), 745 exp.Trim: _trim_sql, 746 exp.TryCast: no_trycast_sql, 747 exp.TsOrDsAdd: date_add_sql("ADD"), 748 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 749 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 750 exp.UnixToTime: _unix_to_time_sql, 751 exp.Week: _remove_ts_or_ds_to_date(), 752 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 753 exp.Year: _remove_ts_or_ds_to_date(), 754 } 755 756 UNSIGNED_TYPE_MAPPING = { 757 exp.DataType.Type.UBIGINT: "BIGINT", 758 exp.DataType.Type.UINT: "INT", 759 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 760 exp.DataType.Type.USMALLINT: "SMALLINT", 761 exp.DataType.Type.UTINYINT: "TINYINT", 762 exp.DataType.Type.UDECIMAL: "DECIMAL", 763 } 764 765 TIMESTAMP_TYPE_MAPPING = { 766 exp.DataType.Type.TIMESTAMP: "DATETIME", 767 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 768 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 769 } 770 771 TYPE_MAPPING = { 772 **generator.Generator.TYPE_MAPPING, 773 **UNSIGNED_TYPE_MAPPING, 774 **TIMESTAMP_TYPE_MAPPING, 775 } 776 777 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 778 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 779 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 780 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 781 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 782 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 783 784 PROPERTIES_LOCATION = { 785 **generator.Generator.PROPERTIES_LOCATION, 786 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 787 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 788 } 789 790 LIMIT_FETCH = "LIMIT" 791 792 LIMIT_ONLY_LITERALS = True 793 794 CHAR_CAST_MAPPING = dict.fromkeys( 795 ( 796 exp.DataType.Type.LONGTEXT, 797 exp.DataType.Type.LONGBLOB, 798 exp.DataType.Type.MEDIUMBLOB, 799 exp.DataType.Type.MEDIUMTEXT, 800 exp.DataType.Type.TEXT, 801 exp.DataType.Type.TINYBLOB, 802 exp.DataType.Type.TINYTEXT, 803 exp.DataType.Type.VARCHAR, 804 ), 805 "CHAR", 806 ) 807 SIGNED_CAST_MAPPING = dict.fromkeys( 808 ( 809 exp.DataType.Type.BIGINT, 810 exp.DataType.Type.BOOLEAN, 811 exp.DataType.Type.INT, 812 exp.DataType.Type.SMALLINT, 813 exp.DataType.Type.TINYINT, 814 exp.DataType.Type.MEDIUMINT, 815 ), 816 "SIGNED", 817 ) 818 819 # MySQL doesn't support many datatypes in cast. 820 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 821 CAST_MAPPING = { 822 **CHAR_CAST_MAPPING, 823 **SIGNED_CAST_MAPPING, 824 exp.DataType.Type.UBIGINT: "UNSIGNED", 825 } 826 827 TIMESTAMP_FUNC_TYPES = { 828 exp.DataType.Type.TIMESTAMPTZ, 829 exp.DataType.Type.TIMESTAMPLTZ, 830 } 831 832 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 833 RESERVED_KEYWORDS = { 834 "accessible", 835 "add", 836 "all", 837 "alter", 838 "analyze", 839 "and", 840 "as", 841 "asc", 842 "asensitive", 843 "before", 844 "between", 845 "bigint", 846 "binary", 847 "blob", 848 "both", 849 "by", 850 "call", 851 "cascade", 852 "case", 853 "change", 854 "char", 855 "character", 856 "check", 857 "collate", 858 "column", 859 "condition", 860 "constraint", 861 "continue", 862 "convert", 863 "create", 864 "cross", 865 "cube", 866 "cume_dist", 867 "current_date", 868 "current_time", 869 "current_timestamp", 870 "current_user", 871 "cursor", 872 "database", 873 "databases", 874 "day_hour", 875 "day_microsecond", 876 "day_minute", 877 "day_second", 878 "dec", 879 "decimal", 880 "declare", 881 "default", 882 "delayed", 883 "delete", 884 "dense_rank", 885 "desc", 886 "describe", 887 "deterministic", 888 "distinct", 889 "distinctrow", 890 "div", 891 "double", 892 "drop", 893 "dual", 894 "each", 895 "else", 896 "elseif", 897 "empty", 898 "enclosed", 899 "escaped", 900 "except", 901 "exists", 902 "exit", 903 "explain", 904 "false", 905 "fetch", 906 "first_value", 907 "float", 908 "float4", 909 "float8", 910 "for", 911 "force", 912 "foreign", 913 "from", 914 "fulltext", 915 "function", 916 "generated", 917 "get", 918 "grant", 919 "group", 920 "grouping", 921 "groups", 922 "having", 923 "high_priority", 924 "hour_microsecond", 925 "hour_minute", 926 "hour_second", 927 "if", 928 "ignore", 929 "in", 930 "index", 931 "infile", 932 "inner", 933 "inout", 934 "insensitive", 935 "insert", 936 "int", 937 "int1", 938 "int2", 939 "int3", 940 "int4", 941 "int8", 942 "integer", 943 "intersect", 944 "interval", 945 "into", 946 "io_after_gtids", 947 "io_before_gtids", 948 "is", 949 "iterate", 950 "join", 951 "json_table", 952 "key", 953 "keys", 954 "kill", 955 "lag", 956 "last_value", 957 "lateral", 958 "lead", 959 "leading", 960 "leave", 961 "left", 962 "like", 963 "limit", 964 "linear", 965 "lines", 966 "load", 967 "localtime", 968 "localtimestamp", 969 "lock", 970 "long", 971 "longblob", 972 "longtext", 973 "loop", 974 "low_priority", 975 "master_bind", 976 "master_ssl_verify_server_cert", 977 "match", 978 "maxvalue", 979 "mediumblob", 980 "mediumint", 981 "mediumtext", 982 "middleint", 983 "minute_microsecond", 984 "minute_second", 985 "mod", 986 "modifies", 987 "natural", 988 "not", 989 "no_write_to_binlog", 990 "nth_value", 991 "ntile", 992 "null", 993 "numeric", 994 "of", 995 "on", 996 "optimize", 997 "optimizer_costs", 998 "option", 999 "optionally", 1000 "or", 1001 "order", 1002 "out", 1003 "outer", 1004 "outfile", 1005 "over", 1006 "partition", 1007 "percent_rank", 1008 "precision", 1009 "primary", 1010 "procedure", 1011 "purge", 1012 "range", 1013 "rank", 1014 "read", 1015 "reads", 1016 "read_write", 1017 "real", 1018 "recursive", 1019 "references", 1020 "regexp", 1021 "release", 1022 "rename", 1023 "repeat", 1024 "replace", 1025 "require", 1026 "resignal", 1027 "restrict", 1028 "return", 1029 "revoke", 1030 "right", 1031 "rlike", 1032 "row", 1033 "rows", 1034 "row_number", 1035 "schema", 1036 "schemas", 1037 "second_microsecond", 1038 "select", 1039 "sensitive", 1040 "separator", 1041 "set", 1042 "show", 1043 "signal", 1044 "smallint", 1045 "spatial", 1046 "specific", 1047 "sql", 1048 "sqlexception", 1049 "sqlstate", 1050 "sqlwarning", 1051 "sql_big_result", 1052 "sql_calc_found_rows", 1053 "sql_small_result", 1054 "ssl", 1055 "starting", 1056 "stored", 1057 "straight_join", 1058 "system", 1059 "table", 1060 "terminated", 1061 "then", 1062 "tinyblob", 1063 "tinyint", 1064 "tinytext", 1065 "to", 1066 "trailing", 1067 "trigger", 1068 "true", 1069 "undo", 1070 "union", 1071 "unique", 1072 "unlock", 1073 "unsigned", 1074 "update", 1075 "usage", 1076 "use", 1077 "using", 1078 "utc_date", 1079 "utc_time", 1080 "utc_timestamp", 1081 "values", 1082 "varbinary", 1083 "varchar", 1084 "varcharacter", 1085 "varying", 1086 "virtual", 1087 "when", 1088 "where", 1089 "while", 1090 "window", 1091 "with", 1092 "write", 1093 "xor", 1094 "year_month", 1095 "zerofill", 1096 "cume_dist", 1097 "dense_rank", 1098 "empty", 1099 "except", 1100 "first_value", 1101 "grouping", 1102 "groups", 1103 "intersect", 1104 "json_table", 1105 "lag", 1106 "last_value", 1107 "lateral", 1108 "lead", 1109 "nth_value", 1110 "ntile", 1111 "of", 1112 "over", 1113 "percent_rank", 1114 "rank", 1115 "recursive", 1116 "row_number", 1117 "system", 1118 "window", 1119 } 1120 1121 def array_sql(self, expression: exp.Array) -> str: 1122 self.unsupported("Arrays are not supported by MySQL") 1123 return self.function_fallback_sql(expression) 1124 1125 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1126 self.unsupported("Array operations are not supported by MySQL") 1127 return self.function_fallback_sql(expression) 1128 1129 def dpipe_sql(self, expression: exp.DPipe) -> str: 1130 return self.func("CONCAT", *expression.flatten()) 1131 1132 def extract_sql(self, expression: exp.Extract) -> str: 1133 unit = expression.name 1134 if unit and unit.lower() == "epoch": 1135 return self.func("UNIX_TIMESTAMP", expression.expression) 1136 1137 return super().extract_sql(expression) 1138 1139 def datatype_sql(self, expression: exp.DataType) -> str: 1140 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1141 result = super().datatype_sql(expression) 1142 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1143 result = f"{result} UNSIGNED" 1144 return result 1145 1146 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1147 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1148 1149 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1150 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1151 return self.func("TIMESTAMP", expression.this) 1152 1153 to = self.CAST_MAPPING.get(expression.to.this) 1154 1155 if to: 1156 expression.to.set("this", to) 1157 return super().cast_sql(expression) 1158 1159 def show_sql(self, expression: exp.Show) -> str: 1160 this = f" {expression.name}" 1161 full = " FULL" if expression.args.get("full") else "" 1162 global_ = " GLOBAL" if expression.args.get("global") else "" 1163 1164 target = self.sql(expression, "target") 1165 target = f" {target}" if target else "" 1166 if expression.name in ("COLUMNS", "INDEX"): 1167 target = f" FROM{target}" 1168 elif expression.name == "GRANTS": 1169 target = f" FOR{target}" 1170 1171 db = self._prefixed_sql("FROM", expression, "db") 1172 1173 like = self._prefixed_sql("LIKE", expression, "like") 1174 where = self.sql(expression, "where") 1175 1176 types = self.expressions(expression, key="types") 1177 types = f" {types}" if types else types 1178 query = self._prefixed_sql("FOR QUERY", expression, "query") 1179 1180 if expression.name == "PROFILE": 1181 offset = self._prefixed_sql("OFFSET", expression, "offset") 1182 limit = self._prefixed_sql("LIMIT", expression, "limit") 1183 else: 1184 offset = "" 1185 limit = self._oldstyle_limit_sql(expression) 1186 1187 log = self._prefixed_sql("IN", expression, "log") 1188 position = self._prefixed_sql("FROM", expression, "position") 1189 1190 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1191 1192 if expression.name == "ENGINE": 1193 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1194 else: 1195 mutex_or_status = "" 1196 1197 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1198 1199 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1200 dtype = self.sql(expression, "dtype") 1201 if not dtype: 1202 return super().altercolumn_sql(expression) 1203 1204 this = self.sql(expression, "this") 1205 return f"MODIFY COLUMN {this} {dtype}" 1206 1207 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1208 sql = self.sql(expression, arg) 1209 return f" {prefix} {sql}" if sql else "" 1210 1211 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1212 limit = self.sql(expression, "limit") 1213 offset = self.sql(expression, "offset") 1214 if limit: 1215 limit_offset = f"{offset}, {limit}" if offset else limit 1216 return f" LIMIT {limit_offset}" 1217 return "" 1218 1219 def chr_sql(self, expression: exp.Chr) -> str: 1220 this = self.expressions(sqls=[expression.this] + expression.expressions) 1221 charset = expression.args.get("charset") 1222 using = f" USING {self.sql(charset)}" if charset else "" 1223 return f"CHAR({this}{using})" 1224 1225 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1226 unit = expression.args.get("unit") 1227 1228 # Pick an old-enough date to avoid negative timestamp diffs 1229 start_ts = "'0000-01-01 00:00:00'" 1230 1231 # Source: https://stackoverflow.com/a/32955740 1232 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1233 interval = exp.Interval(this=timestamp_diff, unit=unit) 1234 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1235 1236 return self.sql(dateadd)
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}}}
ESCAPED_SEQUENCES: Dict[str, str] =
{'\x07': '\\a', '\x08': '\\b', '\x0c': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t', '\x0b': '\\v', '\\': '\\\\'}
Inherited Members
- sqlglot.dialects.dialect.Dialect
- Dialect
- INDEX_OFFSET
- WEEK_OFFSET
- UNNEST_COLUMN_ONLY
- ALIAS_POST_TABLESAMPLE
- TABLESAMPLE_SIZE_IS_PERCENT
- STRICT_STRING_CONCAT
- NORMALIZE_FUNCTIONS
- LOG_BASE_FIRST
- NULL_ORDERING
- TYPED_DIVISION
- CONCAT_COALESCE
- HEX_LOWERCASE
- DATE_FORMAT
- DATEINT_FORMAT
- FORMAT_MAPPING
- PSEUDOCOLUMNS
- PREFER_CTE_ALIAS_COLUMN
- COPY_PARAMS_ARE_CSV
- get_or_raise
- format_time
- normalize_identifier
- case_sensitive
- can_identify
- quote_identifier
- to_json_path
- parse
- parse_into
- generate
- transpile
- tokenize
- tokenizer
- parser
- generator
193 class Tokenizer(tokens.Tokenizer): 194 QUOTES = ["'", '"'] 195 COMMENTS = ["--", "#", ("/*", "*/")] 196 IDENTIFIERS = ["`"] 197 STRING_ESCAPES = ["'", '"', "\\"] 198 BIT_STRINGS = [("b'", "'"), ("B'", "'"), ("0b", "")] 199 HEX_STRINGS = [("x'", "'"), ("X'", "'"), ("0x", "")] 200 201 KEYWORDS = { 202 **tokens.Tokenizer.KEYWORDS, 203 "CHARSET": TokenType.CHARACTER_SET, 204 "FORCE": TokenType.FORCE, 205 "IGNORE": TokenType.IGNORE, 206 "LOCK TABLES": TokenType.COMMAND, 207 "LONGBLOB": TokenType.LONGBLOB, 208 "LONGTEXT": TokenType.LONGTEXT, 209 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 210 "TINYBLOB": TokenType.TINYBLOB, 211 "TINYTEXT": TokenType.TINYTEXT, 212 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 213 "MEDIUMINT": TokenType.MEDIUMINT, 214 "MEMBER OF": TokenType.MEMBER_OF, 215 "SEPARATOR": TokenType.SEPARATOR, 216 "START": TokenType.BEGIN, 217 "SIGNED": TokenType.BIGINT, 218 "SIGNED INTEGER": TokenType.BIGINT, 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.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'>, 'ALL': <TokenType.ALL: 'ALL'>, 'ALWAYS': <TokenType.ALWAYS: 'ALWAYS'>, '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_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'>, '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'>, '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'>, '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'>, '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'>, 'INT128': <TokenType.INT128: 'INT128'>, 'HUGEINT': <TokenType.INT128: 'INT128'>, 'INT2': <TokenType.SMALLINT: 'SMALLINT'>, 'INTEGER': <TokenType.INT: 'INT'>, 'INT': <TokenType.INT: 'INT'>, 'INT4': <TokenType.INT: 'INT'>, 'INT32': <TokenType.INT: 'INT'>, 'INT64': <TokenType.BIGINT: 'BIGINT'>, 'LONG': <TokenType.BIGINT: 'BIGINT'>, 'BIGINT': <TokenType.BIGINT: 'BIGINT'>, 'INT8': <TokenType.TINYINT: 'TINYINT'>, 'UINT': <TokenType.UINT: 'UINT'>, 'DEC': <TokenType.DECIMAL: 'DECIMAL'>, 'DECIMAL': <TokenType.DECIMAL: 'DECIMAL'>, 'BIGDECIMAL': <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, 'BIGNUMERIC': <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, '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'>, '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.VARBINARY: 'VARBINARY'>, '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.TIMESTAMP: 'TIMESTAMP'>, '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'>, 'STRUCT': <TokenType.STRUCT: 'STRUCT'>, 'SEQUENCE': <TokenType.SEQUENCE: 'SEQUENCE'>, 'VARIANT': <TokenType.VARIANT: 'VARIANT'>, 'ALTER': <TokenType.ALTER: 'ALTER'>, 'ANALYZE': <TokenType.COMMAND: 'COMMAND'>, 'CALL': <TokenType.COMMAND: 'COMMAND'>, 'COMMENT': <TokenType.COMMENT: 'COMMENT'>, 'EXPLAIN': <TokenType.COMMAND: 'COMMAND'>, 'GRANT': <TokenType.COMMAND: 'COMMAND'>, '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'>, 'FORCE': <TokenType.FORCE: 'FORCE'>, 'IGNORE': <TokenType.IGNORE: 'IGNORE'>, 'LOCK TABLES': <TokenType.COMMAND: 'COMMAND'>, 'MEMBER OF': <TokenType.MEMBER_OF: 'MEMBER_OF'>, 'SEPARATOR': <TokenType.SEPARATOR: 'SEPARATOR'>, '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.FETCH: 'FETCH'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.EXECUTE: 'EXECUTE'>}
Inherited Members
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 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 306 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 307 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 308 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 309 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 310 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 311 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 312 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 313 "INSTR": lambda args: exp.StrPosition(substr=seq_get(args, 1), this=seq_get(args, 0)), 314 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 315 "ISNULL": isnull_to_is_null, 316 "LOCATE": locate_to_strposition, 317 "MAKETIME": exp.TimeFromParts.from_arg_list, 318 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 319 "MONTHNAME": lambda args: exp.TimeToStr( 320 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 321 format=exp.Literal.string("%B"), 322 ), 323 "STR_TO_DATE": _str_to_date, 324 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 325 "TO_DAYS": lambda args: exp.paren( 326 exp.DateDiff( 327 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 328 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 329 unit=exp.var("DAY"), 330 ) 331 + 1 332 ), 333 "WEEK": lambda args: exp.Week( 334 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 335 ), 336 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 337 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 338 } 339 340 FUNCTION_PARSERS = { 341 **parser.Parser.FUNCTION_PARSERS, 342 "CHAR": lambda self: self._parse_chr(), 343 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 344 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 345 "VALUES": lambda self: self.expression( 346 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 347 ), 348 } 349 350 STATEMENT_PARSERS = { 351 **parser.Parser.STATEMENT_PARSERS, 352 TokenType.SHOW: lambda self: self._parse_show(), 353 } 354 355 SHOW_PARSERS = { 356 "BINARY LOGS": _show_parser("BINARY LOGS"), 357 "MASTER LOGS": _show_parser("BINARY LOGS"), 358 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 359 "CHARACTER SET": _show_parser("CHARACTER SET"), 360 "CHARSET": _show_parser("CHARACTER SET"), 361 "COLLATION": _show_parser("COLLATION"), 362 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 363 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 364 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 365 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 366 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 367 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 368 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 369 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 370 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 371 "DATABASES": _show_parser("DATABASES"), 372 "SCHEMAS": _show_parser("DATABASES"), 373 "ENGINE": _show_parser("ENGINE", target=True), 374 "STORAGE ENGINES": _show_parser("ENGINES"), 375 "ENGINES": _show_parser("ENGINES"), 376 "ERRORS": _show_parser("ERRORS"), 377 "EVENTS": _show_parser("EVENTS"), 378 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 379 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 380 "GRANTS": _show_parser("GRANTS", target="FOR"), 381 "INDEX": _show_parser("INDEX", target="FROM"), 382 "MASTER STATUS": _show_parser("MASTER STATUS"), 383 "OPEN TABLES": _show_parser("OPEN TABLES"), 384 "PLUGINS": _show_parser("PLUGINS"), 385 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 386 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 387 "PRIVILEGES": _show_parser("PRIVILEGES"), 388 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 389 "PROCESSLIST": _show_parser("PROCESSLIST"), 390 "PROFILE": _show_parser("PROFILE"), 391 "PROFILES": _show_parser("PROFILES"), 392 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 393 "REPLICAS": _show_parser("REPLICAS"), 394 "SLAVE HOSTS": _show_parser("REPLICAS"), 395 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 396 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 397 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 398 "SESSION STATUS": _show_parser("STATUS"), 399 "STATUS": _show_parser("STATUS"), 400 "TABLE STATUS": _show_parser("TABLE STATUS"), 401 "FULL TABLES": _show_parser("TABLES", full=True), 402 "TABLES": _show_parser("TABLES"), 403 "TRIGGERS": _show_parser("TRIGGERS"), 404 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 405 "SESSION VARIABLES": _show_parser("VARIABLES"), 406 "VARIABLES": _show_parser("VARIABLES"), 407 "WARNINGS": _show_parser("WARNINGS"), 408 } 409 410 PROPERTY_PARSERS = { 411 **parser.Parser.PROPERTY_PARSERS, 412 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 413 } 414 415 SET_PARSERS = { 416 **parser.Parser.SET_PARSERS, 417 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 418 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 419 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 420 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 421 "NAMES": lambda self: self._parse_set_item_names(), 422 } 423 424 CONSTRAINT_PARSERS = { 425 **parser.Parser.CONSTRAINT_PARSERS, 426 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 427 "INDEX": lambda self: self._parse_index_constraint(), 428 "KEY": lambda self: self._parse_index_constraint(), 429 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 430 } 431 432 ALTER_PARSERS = { 433 **parser.Parser.ALTER_PARSERS, 434 "MODIFY": lambda self: self._parse_alter_table_alter(), 435 } 436 437 SCHEMA_UNNAMED_CONSTRAINTS = { 438 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 439 "FULLTEXT", 440 "INDEX", 441 "KEY", 442 "SPATIAL", 443 } 444 445 PROFILE_TYPES: parser.OPTIONS_TYPE = { 446 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 447 "BLOCK": ("IO",), 448 "CONTEXT": ("SWITCHES",), 449 "PAGE": ("FAULTS",), 450 } 451 452 TYPE_TOKENS = { 453 *parser.Parser.TYPE_TOKENS, 454 TokenType.SET, 455 } 456 457 ENUM_TYPE_TOKENS = { 458 *parser.Parser.ENUM_TYPE_TOKENS, 459 TokenType.SET, 460 } 461 462 LOG_DEFAULTS_TO_LN = True 463 STRING_ALIASES = True 464 VALUES_FOLLOWED_BY_PAREN = False 465 SUPPORTS_PARTITION_SELECTION = True 466 467 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 468 this = self._parse_id_var() 469 if not self._match(TokenType.L_PAREN): 470 return this 471 472 expression = self._parse_number() 473 self._match_r_paren() 474 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 475 476 def _parse_index_constraint( 477 self, kind: t.Optional[str] = None 478 ) -> exp.IndexColumnConstraint: 479 if kind: 480 self._match_texts(("INDEX", "KEY")) 481 482 this = self._parse_id_var(any_token=False) 483 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 484 expressions = self._parse_wrapped_csv(self._parse_ordered) 485 486 options = [] 487 while True: 488 if self._match_text_seq("KEY_BLOCK_SIZE"): 489 self._match(TokenType.EQ) 490 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 491 elif self._match(TokenType.USING): 492 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 493 elif self._match_text_seq("WITH", "PARSER"): 494 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 495 elif self._match(TokenType.COMMENT): 496 opt = exp.IndexConstraintOption(comment=self._parse_string()) 497 elif self._match_text_seq("VISIBLE"): 498 opt = exp.IndexConstraintOption(visible=True) 499 elif self._match_text_seq("INVISIBLE"): 500 opt = exp.IndexConstraintOption(visible=False) 501 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 502 self._match(TokenType.EQ) 503 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 504 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 505 self._match(TokenType.EQ) 506 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 507 else: 508 opt = None 509 510 if not opt: 511 break 512 513 options.append(opt) 514 515 return self.expression( 516 exp.IndexColumnConstraint, 517 this=this, 518 expressions=expressions, 519 kind=kind, 520 index_type=index_type, 521 options=options, 522 ) 523 524 def _parse_show_mysql( 525 self, 526 this: str, 527 target: bool | str = False, 528 full: t.Optional[bool] = None, 529 global_: t.Optional[bool] = None, 530 ) -> exp.Show: 531 if target: 532 if isinstance(target, str): 533 self._match_text_seq(target) 534 target_id = self._parse_id_var() 535 else: 536 target_id = None 537 538 log = self._parse_string() if self._match_text_seq("IN") else None 539 540 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 541 position = self._parse_number() if self._match_text_seq("FROM") else None 542 db = None 543 else: 544 position = None 545 db = None 546 547 if self._match(TokenType.FROM): 548 db = self._parse_id_var() 549 elif self._match(TokenType.DOT): 550 db = target_id 551 target_id = self._parse_id_var() 552 553 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 554 555 like = self._parse_string() if self._match_text_seq("LIKE") else None 556 where = self._parse_where() 557 558 if this == "PROFILE": 559 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 560 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 561 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 562 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 563 else: 564 types, query = None, None 565 offset, limit = self._parse_oldstyle_limit() 566 567 mutex = True if self._match_text_seq("MUTEX") else None 568 mutex = False if self._match_text_seq("STATUS") else mutex 569 570 return self.expression( 571 exp.Show, 572 this=this, 573 target=target_id, 574 full=full, 575 log=log, 576 position=position, 577 db=db, 578 channel=channel, 579 like=like, 580 where=where, 581 types=types, 582 query=query, 583 offset=offset, 584 limit=limit, 585 mutex=mutex, 586 **{"global": global_}, # type: ignore 587 ) 588 589 def _parse_oldstyle_limit( 590 self, 591 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 592 limit = None 593 offset = None 594 if self._match_text_seq("LIMIT"): 595 parts = self._parse_csv(self._parse_number) 596 if len(parts) == 1: 597 limit = parts[0] 598 elif len(parts) == 2: 599 limit = parts[1] 600 offset = parts[0] 601 602 return offset, limit 603 604 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 605 this = self._parse_string() or self._parse_unquoted_field() 606 return self.expression(exp.SetItem, this=this, kind=kind) 607 608 def _parse_set_item_names(self) -> exp.Expression: 609 charset = self._parse_string() or self._parse_unquoted_field() 610 if self._match_text_seq("COLLATE"): 611 collate = self._parse_string() or self._parse_unquoted_field() 612 else: 613 collate = None 614 615 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 616 617 def _parse_type( 618 self, parse_interval: bool = True, fallback_to_identifier: bool = False 619 ) -> t.Optional[exp.Expression]: 620 # mysql binary is special and can work anywhere, even in order by operations 621 # it operates like a no paren func 622 if self._match(TokenType.BINARY, advance=False): 623 data_type = self._parse_types(check_func=True, allow_identifiers=False) 624 625 if isinstance(data_type, exp.DataType): 626 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 627 628 return super()._parse_type( 629 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 630 ) 631 632 def _parse_chr(self) -> t.Optional[exp.Expression]: 633 expressions = self._parse_csv(self._parse_assignment) 634 kwargs: t.Dict[str, t.Any] = {"this": seq_get(expressions, 0)} 635 636 if len(expressions) > 1: 637 kwargs["expressions"] = expressions[1:] 638 639 if self._match(TokenType.USING): 640 kwargs["charset"] = self._parse_var() 641 642 return self.expression(exp.Chr, **kwargs) 643 644 def _parse_group_concat(self) -> t.Optional[exp.Expression]: 645 def concat_exprs( 646 node: t.Optional[exp.Expression], exprs: t.List[exp.Expression] 647 ) -> exp.Expression: 648 if isinstance(node, exp.Distinct) and len(node.expressions) > 1: 649 concat_exprs = [ 650 self.expression(exp.Concat, expressions=node.expressions, safe=True) 651 ] 652 node.set("expressions", concat_exprs) 653 return node 654 if len(exprs) == 1: 655 return exprs[0] 656 return self.expression(exp.Concat, expressions=args, safe=True) 657 658 args = self._parse_csv(self._parse_lambda) 659 660 if args: 661 order = args[-1] if isinstance(args[-1], exp.Order) else None 662 663 if order: 664 # Order By is the last (or only) expression in the list and has consumed the 'expr' before it, 665 # remove 'expr' from exp.Order and add it back to args 666 args[-1] = order.this 667 order.set("this", concat_exprs(order.this, args)) 668 669 this = order or concat_exprs(args[0], args) 670 else: 671 this = None 672 673 separator = self._parse_field() if self._match(TokenType.SEPARATOR) else None 674 675 return self.expression(exp.GroupConcat, this=this, separator=separator)
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.IMAGE: 'IMAGE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.CHAR: 'CHAR'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.SUPER: 'SUPER'>, <TokenType.MONEY: 'MONEY'>, <TokenType.IPV6: 'IPV6'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.INET: 'INET'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.TIME: 'TIME'>, <TokenType.MAP: 'MAP'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.SOME: 'SOME'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.BINARY: 'BINARY'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.UINT: 'UINT'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.ALL: 'ALL'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.ENUM: 'ENUM'>, <TokenType.FILTER: 'FILTER'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.INSERT: 'INSERT'>, <TokenType.DATE: 'DATE'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.INT256: 'INT256'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.UINT256: 'UINT256'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.VAR: 'VAR'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.FIRST: 'FIRST'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.INDEX: 'INDEX'>, <TokenType.LIKE: 'LIKE'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.YEAR: 'YEAR'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.NAME: 'NAME'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.ANY: 'ANY'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.GLOB: 'GLOB'>, <TokenType.PRIMARY_KEY: 'PRIMARY_KEY'>, <TokenType.JSONB: 'JSONB'>, <TokenType.TEXT: 'TEXT'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.VALUES: 'VALUES'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.LEFT: 'LEFT'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.RLIKE: 'RLIKE'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.DATE32: 'DATE32'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.JSON: 'JSON'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.BIT: 'BIT'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.UINT128: 'UINT128'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.ILIKE: 'ILIKE'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.XML: 'XML'>, <TokenType.UUID: 'UUID'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.IPV4: 'IPV4'>, <TokenType.MERGE: 'MERGE'>, <TokenType.TABLE: 'TABLE'>, <TokenType.XOR: 'XOR'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.NULL: 'NULL'>, <TokenType.INT: 'INT'>, <TokenType.RANGE: 'RANGE'>, <TokenType.ROW: 'ROW'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.INT128: 'INT128'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.FLOAT: 'FLOAT'>}
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.DEFAULT: 'DEFAULT'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.SHOW: 'SHOW'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.SEMI: 'SEMI'>, <TokenType.CHAR: 'CHAR'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.DIV: 'DIV'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.ANTI: 'ANTI'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.SUPER: 'SUPER'>, <TokenType.MONEY: 'MONEY'>, <TokenType.TRUE: 'TRUE'>, <TokenType.IPV6: 'IPV6'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.MODEL: 'MODEL'>, <TokenType.ASC: 'ASC'>, <TokenType.FALSE: 'FALSE'>, <TokenType.INET: 'INET'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.TIME: 'TIME'>, <TokenType.MAP: 'MAP'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.SOME: 'SOME'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.CASE: 'CASE'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.BINARY: 'BINARY'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.UINT: 'UINT'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.ALL: 'ALL'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.ENUM: 'ENUM'>, <TokenType.FILTER: 'FILTER'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.DATE: 'DATE'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.INT256: 'INT256'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.UINT256: 'UINT256'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.TOP: 'TOP'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.VAR: 'VAR'>, <TokenType.VIEW: 'VIEW'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.FIRST: 'FIRST'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.LOAD: 'LOAD'>, <TokenType.INDEX: 'INDEX'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.YEAR: 'YEAR'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.NAME: 'NAME'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.ANY: 'ANY'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.JSONB: 'JSONB'>, <TokenType.KEEP: 'KEEP'>, <TokenType.DESC: 'DESC'>, <TokenType.TEXT: 'TEXT'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.CACHE: 'CACHE'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.COPY: 'COPY'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.NEXT: 'NEXT'>, <TokenType.KILL: 'KILL'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.ROWS: 'ROWS'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.DATE32: 'DATE32'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.JSON: 'JSON'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.BIT: 'BIT'>, <TokenType.SET: 'SET'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.UINT128: 'UINT128'>, <TokenType.END: 'END'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.XML: 'XML'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.UUID: 'UUID'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.IPV4: 'IPV4'>, <TokenType.MERGE: 'MERGE'>, <TokenType.DELETE: 'DELETE'>, <TokenType.TABLE: 'TABLE'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.FINAL: 'FINAL'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.NULL: 'NULL'>, <TokenType.INT: 'INT'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.RANGE: 'RANGE'>, <TokenType.ROW: 'ROW'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.INT128: 'INT128'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.TAG: 'TAG'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.IS: 'IS'>, <TokenType.FLOAT: 'FLOAT'>}
RANGE_PARSERS =
{<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.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'>>, 'ADD_MONTHS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AddMonths'>>, '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'>>, '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_TOP_K': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxTopK'>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Array'>>, 'ARRAY_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayAgg'>>, '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_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_OVERLAPS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayOverlaps'>>, '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_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'>>, 'AVG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Avg'>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Chr'>>, 'CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Chr'>>, 'COALESCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Coalesce'>>, 'IFNULL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Coalesce'>>, 'NVL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Coalesce'>>, 'COLLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Collate'>>, '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'>>, 'CONVERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Convert'>>, 'CORR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Corr'>>, 'COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Count'>>, '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'>>, '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_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_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>, '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_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_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>>, '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'>>, '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'>>, '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'>>, 'EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Extract'>>, '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'>>, 'FLOOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Floor'>>, 'FROM_BASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase'>>, 'FROM_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase64'>>, 'GAP_FILL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GapFill'>>, 'GENERATE_DATE_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GenerateDateArray'>>, 'GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GenerateSeries'>>, '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'>>, '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'>>, '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_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayContains'>>, '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'>>, 'JSON_EXTRACT': <function build_extract_json_with_path.<locals>._builder>, '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_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'>>, 'J_S_O_N_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONTable'>>, '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'>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'LEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'LEVENSHTEIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Levenshtein'>>, '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'>>, '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'>>, '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'>>, 'NTH_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NthValue'>>, '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'>>, 'OPEN_J_S_O_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.OpenJSON'>>, 'PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParameterizedAgg'>>, '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'>>, '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_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RangeN'>>, '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_I_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpILike'>>, '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'>>, '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_DIVIDE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeDivide'>>, 'SIGN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SIGNUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SORT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SortArray'>>, 'SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Split'>>, 'SQRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sqrt'>>, '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'>>, '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_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'>>, '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'>>, 'SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sum'>>, '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_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_DAYS': <function MySQL.Parser.<lambda>>, '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'>>, '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_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'>>, 'UNHEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Unhex'>>, 'UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixDate'>>, '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'>>, 'UPPER': <function build_upper>, 'UCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Upper'>>, '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'>>, 'WEEK': <function MySQL.Parser.<lambda>>, 'WEEK_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.WeekOfYear'>>, 'WEEKOFYEAR': <function MySQL.Parser.<lambda>>, 'WHEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.When'>>, '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>>, '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>>, 'MOD': <function build_mod>, 'TO_HEX': <function build_hex>, 'DATE_FORMAT': <function build_formatted_time.<locals>._builder>, 'INSTR': <function MySQL.Parser.<lambda>>, 'FROM_UNIXTIME': <function build_formatted_time.<locals>._builder>, 'ISNULL': <function isnull_to_is_null>, 'LOCATE': <function locate_to_strposition>, 'MAKETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'MONTHNAME': <function MySQL.Parser.<lambda>>}
FUNCTION_PARSERS =
{'CAST': <function Parser.<lambda>>, 'CONVERT': <function Parser.<lambda>>, 'DECODE': <function Parser.<lambda>>, 'EXTRACT': <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>>, 'OPENJSON': <function Parser.<lambda>>, 'POSITION': <function Parser.<lambda>>, 'PREDICT': <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>>, 'CHAR': <function MySQL.Parser.<lambda>>, 'GROUP_CONCAT': <function MySQL.Parser.<lambda>>, 'VALUES': <function MySQL.Parser.<lambda>>}
STATEMENT_PARSERS =
{<TokenType.ALTER: 'ALTER'>: <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.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.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>>, 'DISTKEY': <function Parser.<lambda>>, 'DISTSTYLE': <function Parser.<lambda>>, 'ENGINE': <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>>, 'ROW': <function Parser.<lambda>>, 'ROW_FORMAT': <function Parser.<lambda>>, 'SAMPLE': <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>>, 'WITH': <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>>, '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>>, 'MODIFY': <function MySQL.Parser.<lambda>>}
SCHEMA_UNNAMED_CONSTRAINTS =
{'LIKE', 'INDEX', 'PERIOD', 'SPATIAL', 'CHECK', 'EXCLUDE', 'PRIMARY KEY', 'FULLTEXT', 'FOREIGN KEY', 'UNIQUE', 'KEY'}
PROFILE_TYPES: Dict[str, Sequence[Union[Sequence[str], str]]] =
{'ALL': (), 'CPU': (), 'IPC': (), 'MEMORY': (), 'SOURCE': (), 'SWAPS': (), 'BLOCK': ('IO',), 'CONTEXT': ('SWITCHES',), 'PAGE': ('FAULTS',)}
TYPE_TOKENS =
{<TokenType.IMAGE: 'IMAGE'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.NESTED: 'NESTED'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.YEAR: 'YEAR'>, <TokenType.CHAR: 'CHAR'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.NAME: 'NAME'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.SUPER: 'SUPER'>, <TokenType.MONEY: 'MONEY'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.JSONB: 'JSONB'>, <TokenType.TEXT: 'TEXT'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.IPV6: 'IPV6'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.INET: 'INET'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.TIME: 'TIME'>, <TokenType.MAP: 'MAP'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.BINARY: 'BINARY'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.UINT: 'UINT'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.DATE32: 'DATE32'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.ENUM: 'ENUM'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.JSON: 'JSON'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.BIT: 'BIT'>, <TokenType.SET: 'SET'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.UINT128: 'UINT128'>, <TokenType.DATE: 'DATE'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.XML: 'XML'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.UUID: 'UUID'>, <TokenType.IPV4: 'IPV4'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.INT256: 'INT256'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.NULL: 'NULL'>, <TokenType.INT: 'INT'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.UINT256: 'UINT256'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.INT128: 'INT128'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>}
ENUM_TYPE_TOKENS =
{<TokenType.ENUM16: 'ENUM16'>, <TokenType.SET: 'SET'>, <TokenType.ENUM: 'ENUM'>, <TokenType.ENUM8: 'ENUM8'>}
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
- ID_VAR_TOKENS
- INTERVAL_VARS
- ALIAS_TOKENS
- 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
- EXPRESSION_PARSERS
- UNARY_PARSERS
- STRING_PARSERS
- NUMERIC_PARSERS
- PRIMARY_PARSERS
- PLACEHOLDER_PARSERS
- ALTER_ALTER_PARSERS
- NO_PAREN_FUNCTION_PARSERS
- INVALID_FUNC_NAME_TOKENS
- FUNCTIONS_WITH_ALIASED_ARGS
- KEY_VALUE_DEFINITIONS
- QUERY_MODIFIER_PARSERS
- TYPE_LITERAL_PARSERS
- TYPE_CONVERTER
- DDL_SELECT_TOKENS
- PRE_VOLATILE_TOKENS
- TRANSACTION_KIND
- TRANSACTION_CHARACTERISTICS
- CONFLICT_ACTIONS
- CREATE_SEQUENCE
- ISOLATED_LOADING_OPTIONS
- USABLES
- CAST_ACTIONS
- INSERT_ALTERNATIVES
- CLONE_KEYWORDS
- 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
- STRICT_CAST
- PREFIXED_PIVOT_COLUMNS
- IDENTIFY_PIVOT_STRINGS
- ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMN
- TABLESAMPLE_CSV
- DEFAULT_SAMPLING_METHOD
- SET_REQUIRES_ASSIGNMENT_DELIMITER
- TRIM_PATTERN_FIRST
- MODIFIERS_ATTACHED_TO_UNION
- UNION_MODIFIERS
- NO_PAREN_IF_COMMANDS
- JSON_ARROWS_REQUIRE_JSON_TYPE
- COLON_IS_JSON_EXTRACT
- SUPPORTS_IMPLICIT_UNNEST
- INTERVAL_SPANS
- error_level
- error_message_context
- max_errors
- dialect
- reset
- parse
- parse_into
- check_errors
- raise_error
- expression
- validate_expression
- errors
- sql
677 class Generator(generator.Generator): 678 INTERVAL_ALLOWS_PLURAL_FORM = False 679 LOCKING_READS_SUPPORTED = True 680 NULL_ORDERING_SUPPORTED = None 681 JOIN_HINTS = False 682 TABLE_HINTS = True 683 DUPLICATE_KEY_UPDATE_WITH_SET = False 684 QUERY_HINT_SEP = " " 685 VALUES_AS_TABLE = False 686 NVL2_SUPPORTED = False 687 LAST_DAY_SUPPORTS_DATE_PART = False 688 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 689 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 690 JSON_KEY_VALUE_PAIR_SEP = "," 691 SUPPORTS_TO_NUMBER = False 692 693 TRANSFORMS = { 694 **generator.Generator.TRANSFORMS, 695 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 696 exp.CurrentDate: no_paren_current_date_sql, 697 exp.DateDiff: _remove_ts_or_ds_to_date( 698 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 699 ), 700 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 701 exp.DateStrToDate: datestrtodate_sql, 702 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 703 exp.DateTrunc: _date_trunc_sql, 704 exp.Day: _remove_ts_or_ds_to_date(), 705 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 706 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 707 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 708 exp.GroupConcat: lambda self, 709 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 710 exp.ILike: no_ilike_sql, 711 exp.JSONExtractScalar: arrow_json_extract_sql, 712 exp.Max: max_or_greatest, 713 exp.Min: min_or_least, 714 exp.Month: _remove_ts_or_ds_to_date(), 715 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 716 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 717 exp.ParseJSON: lambda self, e: self.sql(e, "this"), 718 exp.Pivot: no_pivot_sql, 719 exp.Select: transforms.preprocess( 720 [ 721 transforms.eliminate_distinct_on, 722 transforms.eliminate_semi_and_anti_joins, 723 transforms.eliminate_qualify, 724 transforms.eliminate_full_outer_join, 725 ] 726 ), 727 exp.StrPosition: strposition_to_locate_sql, 728 exp.StrToDate: _str_to_date_sql, 729 exp.StrToTime: _str_to_date_sql, 730 exp.Stuff: rename_func("INSERT"), 731 exp.TableSample: no_tablesample_sql, 732 exp.TimeFromParts: rename_func("MAKETIME"), 733 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 734 exp.TimestampDiff: lambda self, e: self.func( 735 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 736 ), 737 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 738 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 739 exp.TimeStrToTime: lambda self, e: self.sql( 740 exp.cast(e.this, exp.DataType.Type.DATETIME, copy=True) 741 ), 742 exp.TimeToStr: _remove_ts_or_ds_to_date( 743 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 744 ), 745 exp.Trim: _trim_sql, 746 exp.TryCast: no_trycast_sql, 747 exp.TsOrDsAdd: date_add_sql("ADD"), 748 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 749 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 750 exp.UnixToTime: _unix_to_time_sql, 751 exp.Week: _remove_ts_or_ds_to_date(), 752 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 753 exp.Year: _remove_ts_or_ds_to_date(), 754 } 755 756 UNSIGNED_TYPE_MAPPING = { 757 exp.DataType.Type.UBIGINT: "BIGINT", 758 exp.DataType.Type.UINT: "INT", 759 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 760 exp.DataType.Type.USMALLINT: "SMALLINT", 761 exp.DataType.Type.UTINYINT: "TINYINT", 762 exp.DataType.Type.UDECIMAL: "DECIMAL", 763 } 764 765 TIMESTAMP_TYPE_MAPPING = { 766 exp.DataType.Type.TIMESTAMP: "DATETIME", 767 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 768 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 769 } 770 771 TYPE_MAPPING = { 772 **generator.Generator.TYPE_MAPPING, 773 **UNSIGNED_TYPE_MAPPING, 774 **TIMESTAMP_TYPE_MAPPING, 775 } 776 777 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 778 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 779 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 780 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 781 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 782 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 783 784 PROPERTIES_LOCATION = { 785 **generator.Generator.PROPERTIES_LOCATION, 786 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 787 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 788 } 789 790 LIMIT_FETCH = "LIMIT" 791 792 LIMIT_ONLY_LITERALS = True 793 794 CHAR_CAST_MAPPING = dict.fromkeys( 795 ( 796 exp.DataType.Type.LONGTEXT, 797 exp.DataType.Type.LONGBLOB, 798 exp.DataType.Type.MEDIUMBLOB, 799 exp.DataType.Type.MEDIUMTEXT, 800 exp.DataType.Type.TEXT, 801 exp.DataType.Type.TINYBLOB, 802 exp.DataType.Type.TINYTEXT, 803 exp.DataType.Type.VARCHAR, 804 ), 805 "CHAR", 806 ) 807 SIGNED_CAST_MAPPING = dict.fromkeys( 808 ( 809 exp.DataType.Type.BIGINT, 810 exp.DataType.Type.BOOLEAN, 811 exp.DataType.Type.INT, 812 exp.DataType.Type.SMALLINT, 813 exp.DataType.Type.TINYINT, 814 exp.DataType.Type.MEDIUMINT, 815 ), 816 "SIGNED", 817 ) 818 819 # MySQL doesn't support many datatypes in cast. 820 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 821 CAST_MAPPING = { 822 **CHAR_CAST_MAPPING, 823 **SIGNED_CAST_MAPPING, 824 exp.DataType.Type.UBIGINT: "UNSIGNED", 825 } 826 827 TIMESTAMP_FUNC_TYPES = { 828 exp.DataType.Type.TIMESTAMPTZ, 829 exp.DataType.Type.TIMESTAMPLTZ, 830 } 831 832 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 833 RESERVED_KEYWORDS = { 834 "accessible", 835 "add", 836 "all", 837 "alter", 838 "analyze", 839 "and", 840 "as", 841 "asc", 842 "asensitive", 843 "before", 844 "between", 845 "bigint", 846 "binary", 847 "blob", 848 "both", 849 "by", 850 "call", 851 "cascade", 852 "case", 853 "change", 854 "char", 855 "character", 856 "check", 857 "collate", 858 "column", 859 "condition", 860 "constraint", 861 "continue", 862 "convert", 863 "create", 864 "cross", 865 "cube", 866 "cume_dist", 867 "current_date", 868 "current_time", 869 "current_timestamp", 870 "current_user", 871 "cursor", 872 "database", 873 "databases", 874 "day_hour", 875 "day_microsecond", 876 "day_minute", 877 "day_second", 878 "dec", 879 "decimal", 880 "declare", 881 "default", 882 "delayed", 883 "delete", 884 "dense_rank", 885 "desc", 886 "describe", 887 "deterministic", 888 "distinct", 889 "distinctrow", 890 "div", 891 "double", 892 "drop", 893 "dual", 894 "each", 895 "else", 896 "elseif", 897 "empty", 898 "enclosed", 899 "escaped", 900 "except", 901 "exists", 902 "exit", 903 "explain", 904 "false", 905 "fetch", 906 "first_value", 907 "float", 908 "float4", 909 "float8", 910 "for", 911 "force", 912 "foreign", 913 "from", 914 "fulltext", 915 "function", 916 "generated", 917 "get", 918 "grant", 919 "group", 920 "grouping", 921 "groups", 922 "having", 923 "high_priority", 924 "hour_microsecond", 925 "hour_minute", 926 "hour_second", 927 "if", 928 "ignore", 929 "in", 930 "index", 931 "infile", 932 "inner", 933 "inout", 934 "insensitive", 935 "insert", 936 "int", 937 "int1", 938 "int2", 939 "int3", 940 "int4", 941 "int8", 942 "integer", 943 "intersect", 944 "interval", 945 "into", 946 "io_after_gtids", 947 "io_before_gtids", 948 "is", 949 "iterate", 950 "join", 951 "json_table", 952 "key", 953 "keys", 954 "kill", 955 "lag", 956 "last_value", 957 "lateral", 958 "lead", 959 "leading", 960 "leave", 961 "left", 962 "like", 963 "limit", 964 "linear", 965 "lines", 966 "load", 967 "localtime", 968 "localtimestamp", 969 "lock", 970 "long", 971 "longblob", 972 "longtext", 973 "loop", 974 "low_priority", 975 "master_bind", 976 "master_ssl_verify_server_cert", 977 "match", 978 "maxvalue", 979 "mediumblob", 980 "mediumint", 981 "mediumtext", 982 "middleint", 983 "minute_microsecond", 984 "minute_second", 985 "mod", 986 "modifies", 987 "natural", 988 "not", 989 "no_write_to_binlog", 990 "nth_value", 991 "ntile", 992 "null", 993 "numeric", 994 "of", 995 "on", 996 "optimize", 997 "optimizer_costs", 998 "option", 999 "optionally", 1000 "or", 1001 "order", 1002 "out", 1003 "outer", 1004 "outfile", 1005 "over", 1006 "partition", 1007 "percent_rank", 1008 "precision", 1009 "primary", 1010 "procedure", 1011 "purge", 1012 "range", 1013 "rank", 1014 "read", 1015 "reads", 1016 "read_write", 1017 "real", 1018 "recursive", 1019 "references", 1020 "regexp", 1021 "release", 1022 "rename", 1023 "repeat", 1024 "replace", 1025 "require", 1026 "resignal", 1027 "restrict", 1028 "return", 1029 "revoke", 1030 "right", 1031 "rlike", 1032 "row", 1033 "rows", 1034 "row_number", 1035 "schema", 1036 "schemas", 1037 "second_microsecond", 1038 "select", 1039 "sensitive", 1040 "separator", 1041 "set", 1042 "show", 1043 "signal", 1044 "smallint", 1045 "spatial", 1046 "specific", 1047 "sql", 1048 "sqlexception", 1049 "sqlstate", 1050 "sqlwarning", 1051 "sql_big_result", 1052 "sql_calc_found_rows", 1053 "sql_small_result", 1054 "ssl", 1055 "starting", 1056 "stored", 1057 "straight_join", 1058 "system", 1059 "table", 1060 "terminated", 1061 "then", 1062 "tinyblob", 1063 "tinyint", 1064 "tinytext", 1065 "to", 1066 "trailing", 1067 "trigger", 1068 "true", 1069 "undo", 1070 "union", 1071 "unique", 1072 "unlock", 1073 "unsigned", 1074 "update", 1075 "usage", 1076 "use", 1077 "using", 1078 "utc_date", 1079 "utc_time", 1080 "utc_timestamp", 1081 "values", 1082 "varbinary", 1083 "varchar", 1084 "varcharacter", 1085 "varying", 1086 "virtual", 1087 "when", 1088 "where", 1089 "while", 1090 "window", 1091 "with", 1092 "write", 1093 "xor", 1094 "year_month", 1095 "zerofill", 1096 "cume_dist", 1097 "dense_rank", 1098 "empty", 1099 "except", 1100 "first_value", 1101 "grouping", 1102 "groups", 1103 "intersect", 1104 "json_table", 1105 "lag", 1106 "last_value", 1107 "lateral", 1108 "lead", 1109 "nth_value", 1110 "ntile", 1111 "of", 1112 "over", 1113 "percent_rank", 1114 "rank", 1115 "recursive", 1116 "row_number", 1117 "system", 1118 "window", 1119 } 1120 1121 def array_sql(self, expression: exp.Array) -> str: 1122 self.unsupported("Arrays are not supported by MySQL") 1123 return self.function_fallback_sql(expression) 1124 1125 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1126 self.unsupported("Array operations are not supported by MySQL") 1127 return self.function_fallback_sql(expression) 1128 1129 def dpipe_sql(self, expression: exp.DPipe) -> str: 1130 return self.func("CONCAT", *expression.flatten()) 1131 1132 def extract_sql(self, expression: exp.Extract) -> str: 1133 unit = expression.name 1134 if unit and unit.lower() == "epoch": 1135 return self.func("UNIX_TIMESTAMP", expression.expression) 1136 1137 return super().extract_sql(expression) 1138 1139 def datatype_sql(self, expression: exp.DataType) -> str: 1140 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1141 result = super().datatype_sql(expression) 1142 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1143 result = f"{result} UNSIGNED" 1144 return result 1145 1146 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1147 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1148 1149 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1150 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1151 return self.func("TIMESTAMP", expression.this) 1152 1153 to = self.CAST_MAPPING.get(expression.to.this) 1154 1155 if to: 1156 expression.to.set("this", to) 1157 return super().cast_sql(expression) 1158 1159 def show_sql(self, expression: exp.Show) -> str: 1160 this = f" {expression.name}" 1161 full = " FULL" if expression.args.get("full") else "" 1162 global_ = " GLOBAL" if expression.args.get("global") else "" 1163 1164 target = self.sql(expression, "target") 1165 target = f" {target}" if target else "" 1166 if expression.name in ("COLUMNS", "INDEX"): 1167 target = f" FROM{target}" 1168 elif expression.name == "GRANTS": 1169 target = f" FOR{target}" 1170 1171 db = self._prefixed_sql("FROM", expression, "db") 1172 1173 like = self._prefixed_sql("LIKE", expression, "like") 1174 where = self.sql(expression, "where") 1175 1176 types = self.expressions(expression, key="types") 1177 types = f" {types}" if types else types 1178 query = self._prefixed_sql("FOR QUERY", expression, "query") 1179 1180 if expression.name == "PROFILE": 1181 offset = self._prefixed_sql("OFFSET", expression, "offset") 1182 limit = self._prefixed_sql("LIMIT", expression, "limit") 1183 else: 1184 offset = "" 1185 limit = self._oldstyle_limit_sql(expression) 1186 1187 log = self._prefixed_sql("IN", expression, "log") 1188 position = self._prefixed_sql("FROM", expression, "position") 1189 1190 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1191 1192 if expression.name == "ENGINE": 1193 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1194 else: 1195 mutex_or_status = "" 1196 1197 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1198 1199 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1200 dtype = self.sql(expression, "dtype") 1201 if not dtype: 1202 return super().altercolumn_sql(expression) 1203 1204 this = self.sql(expression, "this") 1205 return f"MODIFY COLUMN {this} {dtype}" 1206 1207 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1208 sql = self.sql(expression, arg) 1209 return f" {prefix} {sql}" if sql else "" 1210 1211 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1212 limit = self.sql(expression, "limit") 1213 offset = self.sql(expression, "offset") 1214 if limit: 1215 limit_offset = f"{offset}, {limit}" if offset else limit 1216 return f" LIMIT {limit_offset}" 1217 return "" 1218 1219 def chr_sql(self, expression: exp.Chr) -> str: 1220 this = self.expressions(sqls=[expression.this] + expression.expressions) 1221 charset = expression.args.get("charset") 1222 using = f" USING {self.sql(charset)}" if charset else "" 1223 return f"CHAR({this}{using})" 1224 1225 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1226 unit = expression.args.get("unit") 1227 1228 # Pick an old-enough date to avoid negative timestamp diffs 1229 start_ts = "'0000-01-01 00:00:00'" 1230 1231 # Source: https://stackoverflow.com/a/32955740 1232 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1233 interval = exp.Interval(this=timestamp_diff, unit=unit) 1234 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1235 1236 return self.sql(dateadd)
Generator converts a given syntax tree to the corresponding SQL string.
Arguments:
- pretty: Whether to format the produced SQL string. Default: False.
- identify: Determines when an identifier should be quoted. Possible values are: False (default): Never quote, except in cases where it's mandatory by the dialect. True or 'always': Always quote. 'safe': Only quote identifiers that are case insensitive.
- normalize: Whether to normalize identifiers to lowercase. Default: False.
- pad: The pad size in a formatted string. For example, this affects the indentation of a projection in a query, relative to its nesting level. Default: 2.
- indent: The indentation size in a formatted string. For example, this affects the
indentation of subqueries and filters under a
WHERE
clause. Default: 2. - normalize_functions: How to normalize function names. Possible values are: "upper" or True (default): Convert names to uppercase. "lower": Convert names to lowercase. False: Disables function name normalization.
- unsupported_level: Determines the generator's behavior when it encounters unsupported expressions. Default ErrorLevel.WARN.
- max_unsupported: Maximum number of unsupported messages to include in a raised UnsupportedError. This is only relevant if unsupported_level is ErrorLevel.RAISE. Default: 3
- leading_comma: Whether the comma is leading or trailing in select expressions. This is only relevant when generating in pretty mode. Default: False
- max_text_width: The max number of characters in a segment before creating new lines in pretty mode. The default is on the smaller end because the length only represents a segment and not the true line length. Default: 80
- comments: Whether to preserve comments in the output SQL code. Default: True
TRANSFORMS =
{<class 'sqlglot.expressions.JSONPathFilter'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathKey'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathRecursive'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathRoot'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathScript'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathSelector'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathSlice'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathSubscript'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathUnion'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathWildcard'>: <function <lambda>>, <class 'sqlglot.expressions.AllowedValuesProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.AutoRefreshProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.BackupProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CaseSpecificColumnConstraint'>: <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.CopyGrantsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.DateFormatColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.DefaultColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EncodeColumnConstraint'>: <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.ExternalProperty'>: <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.IntervalSpan'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.JSONExtract'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.JSONExtractScalar'>: <function arrow_json_extract_sql>, <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.OutputModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PathColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ProjectionPolicyColumnConstraint'>: <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.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.StrictProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TemporaryProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TagColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TitleColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Timestamp'>: <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.UppercaseColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UnloggedProperty'>: <function Generator.<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.WithJournalTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithOperator'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ArrayAgg'>: <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.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.ParseJSON'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.Pivot'>: <function no_pivot_sql>, <class 'sqlglot.expressions.Select'>: <function preprocess.<locals>._to_sql>, <class 'sqlglot.expressions.StrPosition'>: <function strposition_to_locate_sql>, <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.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'}
TIMESTAMP_TYPE_MAPPING =
{<Type.TIMESTAMP: 'TIMESTAMP'>: 'DATETIME', <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>: 'TIMESTAMP', <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>: 'TIMESTAMP'}
TYPE_MAPPING =
{<Type.NCHAR: 'NCHAR'>: 'CHAR', <Type.NVARCHAR: 'NVARCHAR'>: 'VARCHAR', <Type.INET: 'INET'>: 'INET', <Type.ROWVERSION: 'ROWVERSION'>: 'VARBINARY', <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.TIMESTAMP: 'TIMESTAMP'>: '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.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.DistKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DistStyleProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EngineProperty'>: <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.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.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.StrictProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <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.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.WithSystemVersioningProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>}
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 =
{'over', 'spatial', 'character', 'if', 'day_hour', 'inout', 'is', 'hour_microsecond', 'sql_big_result', 'to', 'get', 'from', 'sql_calc_found_rows', 'with', 'window', 'fulltext', 'asensitive', 'index', 'dec', 'constraint', 'cume_dist', 'of', 'grouping', 'json_table', 'add', 'hour_minute', 'accessible', 'last_value', 'join', 'long', 'write', 'optimizer_costs', 'lag', 'longtext', 'row', 'bigint', 'resignal', 'iterate', 'mod', 'schema', 'insert', 'keys', 'cursor', 'both', 'call', 'high_priority', 'varcharacter', 'int', 'lines', 'loop', 'precision', 'numeric', 'convert', 'force', 'asc', 'rank', 'outfile', 'sql', 'null', 'signal', 'row_number', 'regexp', 'io_before_gtids', 'groups', 'show', 'then', 'purge', 'natural', 'int8', 'desc', 'float4', 'select', 'first_value', 'tinytext', 'varbinary', 'starting', 'leave', 'percent_rank', 'using', 'procedure', 'varchar', 'div', 'while', 'foreign', 'databases', 'drop', 'sqlstate', 'generated', 'describe', 'double', 'second_microsecond', 'values', 'elseif', 'grant', 'dual', 'no_write_to_binlog', 'current_timestamp', 'decimal', 'nth_value', 'update', 'day_second', 'separator', 'replace', 'low_priority', 'not', 'tinyint', 'out', 'set', 'schemas', 'virtual', 'and', 'day_minute', 'database', 'kill', 'restrict', 'sqlexception', 'lateral', 'minute_second', 'change', 'current_time', 'declare', 'utc_date', 'enclosed', 'io_after_gtids', 'right', 'having', 'int1', 'optimize', 'except', 'revoke', 'unlock', 'localtime', 'left', 'real', 'empty', 'mediumblob', 'rows', 'sqlwarning', 'case', 'cube', 'distinct', 'outer', 'escaped', 'rlike', 'when', 'use', 'interval', 'modifies', 'continue', 'table', 'mediumint', 'create', 'utc_time', 'middleint', 'zerofill', 'cross', 'trailing', 'ssl', 'distinctrow', 'ntile', 'on', 'like', 'localtimestamp', 'terminated', 'analyze', 'require', 'rename', 'undo', 'unique', 'order', 'else', 'inner', 'usage', 'int3', 'before', 'as', 'blob', 'return', 'specific', 'union', 'smallint', 'float8', 'sensitive', 'intersect', 'unsigned', 'condition', 'or', 'for', 'int4', 'deterministic', 'range', 'alter', 'int2', 'straight_join', 'check', 'current_user', 'read', 'integer', 'fetch', 'load', 'cascade', 'recursive', 'char', 'repeat', 'system', 'lead', 'hour_second', 'trigger', 'into', 'tinyblob', 'primary', 'all', 'day_microsecond', 'float', 'reads', 'delete', 'collate', 'release', 'explain', 'dense_rank', 'read_write', 'leading', 'by', 'mediumtext', 'stored', 'default', 'column', 'utc_timestamp', 'infile', 'group', 'minute_microsecond', 'insensitive', 'master_bind', 'binary', 'exists', 'in', 'ignore', 'references', 'xor', 'true', 'linear', 'function', 'exit', 'current_date', 'maxvalue', 'where', 'lock', 'each', 'limit', 'delayed', 'longblob', 'optionally', 'between', 'varying', 'key', 'false', 'match', 'master_ssl_verify_server_cert', 'option', 'partition', 'year_month', 'sql_small_result'}
def
cast_sql( self, expression: sqlglot.expressions.Cast, safe_prefix: Optional[str] = None) -> str:
1149 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1150 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1151 return self.func("TIMESTAMP", expression.this) 1152 1153 to = self.CAST_MAPPING.get(expression.to.this) 1154 1155 if to: 1156 expression.to.set("this", to) 1157 return super().cast_sql(expression)
1159 def show_sql(self, expression: exp.Show) -> str: 1160 this = f" {expression.name}" 1161 full = " FULL" if expression.args.get("full") else "" 1162 global_ = " GLOBAL" if expression.args.get("global") else "" 1163 1164 target = self.sql(expression, "target") 1165 target = f" {target}" if target else "" 1166 if expression.name in ("COLUMNS", "INDEX"): 1167 target = f" FROM{target}" 1168 elif expression.name == "GRANTS": 1169 target = f" FOR{target}" 1170 1171 db = self._prefixed_sql("FROM", expression, "db") 1172 1173 like = self._prefixed_sql("LIKE", expression, "like") 1174 where = self.sql(expression, "where") 1175 1176 types = self.expressions(expression, key="types") 1177 types = f" {types}" if types else types 1178 query = self._prefixed_sql("FOR QUERY", expression, "query") 1179 1180 if expression.name == "PROFILE": 1181 offset = self._prefixed_sql("OFFSET", expression, "offset") 1182 limit = self._prefixed_sql("LIMIT", expression, "limit") 1183 else: 1184 offset = "" 1185 limit = self._oldstyle_limit_sql(expression) 1186 1187 log = self._prefixed_sql("IN", expression, "log") 1188 position = self._prefixed_sql("FROM", expression, "position") 1189 1190 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1191 1192 if expression.name == "ENGINE": 1193 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1194 else: 1195 mutex_or_status = "" 1196 1197 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}"
1225 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1226 unit = expression.args.get("unit") 1227 1228 # Pick an old-enough date to avoid negative timestamp diffs 1229 start_ts = "'0000-01-01 00:00:00'" 1230 1231 # Source: https://stackoverflow.com/a/32955740 1232 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1233 interval = exp.Interval(this=timestamp_diff, unit=unit) 1234 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1235 1236 return self.sql(dateadd)
AFTER_HAVING_MODIFIER_TRANSFORMS =
{'qualify': <function Generator.<lambda>>, 'windows': <function Generator.<lambda>>}
Inherited Members
- sqlglot.generator.Generator
- Generator
- IGNORE_NULLS_IN_FUNC
- EXPLICIT_UNION
- WRAP_DERIVED_VALUES
- 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
- COLUMN_JOIN_MARKS_SUPPORTED
- 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
- OUTER_UNION_MODIFIERS
- COPY_PARAMS_ARE_WRAPPED
- COPY_PARAMS_EQ_REQUIRED
- COPY_HAS_INTO_KEYWORD
- STAR_EXCEPT
- HEX_FUNC
- WITH_PROPERTIES_PREFIX
- TIME_PART_SINGULARS
- TOKEN_MAPPING
- STRUCT_DELIMITER
- PARAMETER_TOKEN
- NAMED_PLACEHOLDER_TOKEN
- WITH_SEPARATED_COMMENTS
- EXCLUDE_COMMENTS
- UNWRAPPED_INTERVAL_VALUES
- PARAMETERIZABLE_TEXT_TYPES
- EXPRESSIONS_WITHOUT_NESTED_CTES
- 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
- pad_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
- computedcolumnconstraint_sql
- autoincrementcolumnconstraint_sql
- compresscolumnconstraint_sql
- generatedasidentitycolumnconstraint_sql
- generatedasrowcolumnconstraint_sql
- periodforsystemtimeconstraint_sql
- notnullcolumnconstraint_sql
- transformcolumnconstraint_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
- except_sql
- except_op
- fetch_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
- intersect_sql
- intersect_op
- introducer_sql
- kill_sql
- pseudotype_sql
- objectidentifier_sql
- onconflict_sql
- returning_sql
- rowformatdelimitedproperty_sql
- withtablehint_sql
- indextablehint_sql
- historicaldata_sql
- table_parts
- table_sql
- tablesample_sql
- pivot_sql
- version_sql
- tuple_sql
- update_sql
- values_sql
- var_sql
- into_sql
- from_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
- 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
- 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
- set_operations
- union_sql
- union_op
- 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
- 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
- attimezone_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
- currenttimestamp_sql
- collate_sql
- command_sql
- comment_sql
- mergetreettlaction_sql
- mergetreettl_sql
- transaction_sql
- commit_sql
- rollback_sql
- alterdiststyle_sql
- altersortkey_sql
- renametable_sql
- renamecolumn_sql
- alterset_sql
- altertable_sql
- add_column_sql
- droppartition_sql
- addconstraint_sql
- distinct_sql
- ignorenulls_sql
- respectnulls_sql
- havingmax_sql
- intdiv_sql
- div_sql
- overlaps_sql
- distance_sql
- dot_sql
- eq_sql
- propertyeq_sql
- escape_sql
- glob_sql
- gt_sql
- gte_sql
- ilike_sql
- ilikeany_sql
- is_sql
- like_sql
- likeany_sql
- similarto_sql
- lt_sql
- lte_sql
- mod_sql
- mul_sql
- neq_sql
- nullsafeeq_sql
- nullsafeneq_sql
- slice_sql
- sub_sql
- trycast_sql
- try_sql
- log_sql
- use_sql
- binary
- 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
- merge_sql
- tochar_sql
- tonumber_sql
- dictproperty_sql
- dictrange_sql
- dictsubproperty_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
- forin_sql
- refresh_sql
- operator_sql
- toarray_sql
- tsordstotime_sql
- tsordstotimestamp_sql
- tsordstodate_sql
- unixdate_sql
- lastday_sql
- dateadd_sql
- arrayany_sql
- generateseries_sql
- struct_sql
- partitionrange_sql
- truncatetable_sql
- convert_sql
- copyparameter_sql
- credentials_sql
- copy_sql
- semicolon_sql
- datadeletionproperty_sql
- maskingpolicycolumnconstraint_sql
- gapfill_sql