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 "KEY": TokenType.KEY, 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 "CONVERT_TZ": lambda args: exp.ConvertTimezone( 306 source_tz=seq_get(args, 1), target_tz=seq_get(args, 2), timestamp=seq_get(args, 0) 307 ), 308 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 309 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 310 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 311 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 312 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 313 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 314 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 315 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 316 "INSTR": lambda args: exp.StrPosition(substr=seq_get(args, 1), this=seq_get(args, 0)), 317 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 318 "ISNULL": isnull_to_is_null, 319 "LOCATE": locate_to_strposition, 320 "MAKETIME": exp.TimeFromParts.from_arg_list, 321 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 322 "MONTHNAME": lambda args: exp.TimeToStr( 323 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 324 format=exp.Literal.string("%B"), 325 ), 326 "STR_TO_DATE": _str_to_date, 327 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 328 "TO_DAYS": lambda args: exp.paren( 329 exp.DateDiff( 330 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 331 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 332 unit=exp.var("DAY"), 333 ) 334 + 1 335 ), 336 "WEEK": lambda args: exp.Week( 337 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 338 ), 339 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 340 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 341 } 342 343 FUNCTION_PARSERS = { 344 **parser.Parser.FUNCTION_PARSERS, 345 "CHAR": lambda self: self._parse_chr(), 346 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 347 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 348 "VALUES": lambda self: self.expression( 349 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 350 ), 351 } 352 353 STATEMENT_PARSERS = { 354 **parser.Parser.STATEMENT_PARSERS, 355 TokenType.SHOW: lambda self: self._parse_show(), 356 } 357 358 SHOW_PARSERS = { 359 "BINARY LOGS": _show_parser("BINARY LOGS"), 360 "MASTER LOGS": _show_parser("BINARY LOGS"), 361 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 362 "CHARACTER SET": _show_parser("CHARACTER SET"), 363 "CHARSET": _show_parser("CHARACTER SET"), 364 "COLLATION": _show_parser("COLLATION"), 365 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 366 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 367 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 368 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 369 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 370 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 371 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 372 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 373 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 374 "DATABASES": _show_parser("DATABASES"), 375 "SCHEMAS": _show_parser("DATABASES"), 376 "ENGINE": _show_parser("ENGINE", target=True), 377 "STORAGE ENGINES": _show_parser("ENGINES"), 378 "ENGINES": _show_parser("ENGINES"), 379 "ERRORS": _show_parser("ERRORS"), 380 "EVENTS": _show_parser("EVENTS"), 381 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 382 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 383 "GRANTS": _show_parser("GRANTS", target="FOR"), 384 "INDEX": _show_parser("INDEX", target="FROM"), 385 "MASTER STATUS": _show_parser("MASTER STATUS"), 386 "OPEN TABLES": _show_parser("OPEN TABLES"), 387 "PLUGINS": _show_parser("PLUGINS"), 388 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 389 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 390 "PRIVILEGES": _show_parser("PRIVILEGES"), 391 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 392 "PROCESSLIST": _show_parser("PROCESSLIST"), 393 "PROFILE": _show_parser("PROFILE"), 394 "PROFILES": _show_parser("PROFILES"), 395 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 396 "REPLICAS": _show_parser("REPLICAS"), 397 "SLAVE HOSTS": _show_parser("REPLICAS"), 398 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 399 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 400 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 401 "SESSION STATUS": _show_parser("STATUS"), 402 "STATUS": _show_parser("STATUS"), 403 "TABLE STATUS": _show_parser("TABLE STATUS"), 404 "FULL TABLES": _show_parser("TABLES", full=True), 405 "TABLES": _show_parser("TABLES"), 406 "TRIGGERS": _show_parser("TRIGGERS"), 407 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 408 "SESSION VARIABLES": _show_parser("VARIABLES"), 409 "VARIABLES": _show_parser("VARIABLES"), 410 "WARNINGS": _show_parser("WARNINGS"), 411 } 412 413 PROPERTY_PARSERS = { 414 **parser.Parser.PROPERTY_PARSERS, 415 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 416 } 417 418 SET_PARSERS = { 419 **parser.Parser.SET_PARSERS, 420 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 421 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 422 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 423 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 424 "NAMES": lambda self: self._parse_set_item_names(), 425 } 426 427 CONSTRAINT_PARSERS = { 428 **parser.Parser.CONSTRAINT_PARSERS, 429 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 430 "INDEX": lambda self: self._parse_index_constraint(), 431 "KEY": lambda self: self._parse_index_constraint(), 432 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 433 } 434 435 ALTER_PARSERS = { 436 **parser.Parser.ALTER_PARSERS, 437 "MODIFY": lambda self: self._parse_alter_table_alter(), 438 } 439 440 SCHEMA_UNNAMED_CONSTRAINTS = { 441 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 442 "FULLTEXT", 443 "INDEX", 444 "KEY", 445 "SPATIAL", 446 } 447 448 PROFILE_TYPES: parser.OPTIONS_TYPE = { 449 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 450 "BLOCK": ("IO",), 451 "CONTEXT": ("SWITCHES",), 452 "PAGE": ("FAULTS",), 453 } 454 455 TYPE_TOKENS = { 456 *parser.Parser.TYPE_TOKENS, 457 TokenType.SET, 458 } 459 460 ENUM_TYPE_TOKENS = { 461 *parser.Parser.ENUM_TYPE_TOKENS, 462 TokenType.SET, 463 } 464 465 LOG_DEFAULTS_TO_LN = True 466 STRING_ALIASES = True 467 VALUES_FOLLOWED_BY_PAREN = False 468 SUPPORTS_PARTITION_SELECTION = True 469 470 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 471 this = self._parse_id_var() 472 if not self._match(TokenType.L_PAREN): 473 return this 474 475 expression = self._parse_number() 476 self._match_r_paren() 477 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 478 479 def _parse_index_constraint( 480 self, kind: t.Optional[str] = None 481 ) -> exp.IndexColumnConstraint: 482 if kind: 483 self._match_texts(("INDEX", "KEY")) 484 485 this = self._parse_id_var(any_token=False) 486 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 487 expressions = self._parse_wrapped_csv(self._parse_ordered) 488 489 options = [] 490 while True: 491 if self._match_text_seq("KEY_BLOCK_SIZE"): 492 self._match(TokenType.EQ) 493 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 494 elif self._match(TokenType.USING): 495 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 496 elif self._match_text_seq("WITH", "PARSER"): 497 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 498 elif self._match(TokenType.COMMENT): 499 opt = exp.IndexConstraintOption(comment=self._parse_string()) 500 elif self._match_text_seq("VISIBLE"): 501 opt = exp.IndexConstraintOption(visible=True) 502 elif self._match_text_seq("INVISIBLE"): 503 opt = exp.IndexConstraintOption(visible=False) 504 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 505 self._match(TokenType.EQ) 506 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 507 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 508 self._match(TokenType.EQ) 509 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 510 else: 511 opt = None 512 513 if not opt: 514 break 515 516 options.append(opt) 517 518 return self.expression( 519 exp.IndexColumnConstraint, 520 this=this, 521 expressions=expressions, 522 kind=kind, 523 index_type=index_type, 524 options=options, 525 ) 526 527 def _parse_show_mysql( 528 self, 529 this: str, 530 target: bool | str = False, 531 full: t.Optional[bool] = None, 532 global_: t.Optional[bool] = None, 533 ) -> exp.Show: 534 if target: 535 if isinstance(target, str): 536 self._match_text_seq(target) 537 target_id = self._parse_id_var() 538 else: 539 target_id = None 540 541 log = self._parse_string() if self._match_text_seq("IN") else None 542 543 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 544 position = self._parse_number() if self._match_text_seq("FROM") else None 545 db = None 546 else: 547 position = None 548 db = None 549 550 if self._match(TokenType.FROM): 551 db = self._parse_id_var() 552 elif self._match(TokenType.DOT): 553 db = target_id 554 target_id = self._parse_id_var() 555 556 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 557 558 like = self._parse_string() if self._match_text_seq("LIKE") else None 559 where = self._parse_where() 560 561 if this == "PROFILE": 562 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 563 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 564 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 565 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 566 else: 567 types, query = None, None 568 offset, limit = self._parse_oldstyle_limit() 569 570 mutex = True if self._match_text_seq("MUTEX") else None 571 mutex = False if self._match_text_seq("STATUS") else mutex 572 573 return self.expression( 574 exp.Show, 575 this=this, 576 target=target_id, 577 full=full, 578 log=log, 579 position=position, 580 db=db, 581 channel=channel, 582 like=like, 583 where=where, 584 types=types, 585 query=query, 586 offset=offset, 587 limit=limit, 588 mutex=mutex, 589 **{"global": global_}, # type: ignore 590 ) 591 592 def _parse_oldstyle_limit( 593 self, 594 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 595 limit = None 596 offset = None 597 if self._match_text_seq("LIMIT"): 598 parts = self._parse_csv(self._parse_number) 599 if len(parts) == 1: 600 limit = parts[0] 601 elif len(parts) == 2: 602 limit = parts[1] 603 offset = parts[0] 604 605 return offset, limit 606 607 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 608 this = self._parse_string() or self._parse_unquoted_field() 609 return self.expression(exp.SetItem, this=this, kind=kind) 610 611 def _parse_set_item_names(self) -> exp.Expression: 612 charset = self._parse_string() or self._parse_unquoted_field() 613 if self._match_text_seq("COLLATE"): 614 collate = self._parse_string() or self._parse_unquoted_field() 615 else: 616 collate = None 617 618 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 619 620 def _parse_type( 621 self, parse_interval: bool = True, fallback_to_identifier: bool = False 622 ) -> t.Optional[exp.Expression]: 623 # mysql binary is special and can work anywhere, even in order by operations 624 # it operates like a no paren func 625 if self._match(TokenType.BINARY, advance=False): 626 data_type = self._parse_types(check_func=True, allow_identifiers=False) 627 628 if isinstance(data_type, exp.DataType): 629 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 630 631 return super()._parse_type( 632 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 633 ) 634 635 def _parse_chr(self) -> t.Optional[exp.Expression]: 636 expressions = self._parse_csv(self._parse_assignment) 637 kwargs: t.Dict[str, t.Any] = {"this": seq_get(expressions, 0)} 638 639 if len(expressions) > 1: 640 kwargs["expressions"] = expressions[1:] 641 642 if self._match(TokenType.USING): 643 kwargs["charset"] = self._parse_var() 644 645 return self.expression(exp.Chr, **kwargs) 646 647 def _parse_group_concat(self) -> t.Optional[exp.Expression]: 648 def concat_exprs( 649 node: t.Optional[exp.Expression], exprs: t.List[exp.Expression] 650 ) -> exp.Expression: 651 if isinstance(node, exp.Distinct) and len(node.expressions) > 1: 652 concat_exprs = [ 653 self.expression(exp.Concat, expressions=node.expressions, safe=True) 654 ] 655 node.set("expressions", concat_exprs) 656 return node 657 if len(exprs) == 1: 658 return exprs[0] 659 return self.expression(exp.Concat, expressions=args, safe=True) 660 661 args = self._parse_csv(self._parse_lambda) 662 663 if args: 664 order = args[-1] if isinstance(args[-1], exp.Order) else None 665 666 if order: 667 # Order By is the last (or only) expression in the list and has consumed the 'expr' before it, 668 # remove 'expr' from exp.Order and add it back to args 669 args[-1] = order.this 670 order.set("this", concat_exprs(order.this, args)) 671 672 this = order or concat_exprs(args[0], args) 673 else: 674 this = None 675 676 separator = self._parse_field() if self._match(TokenType.SEPARATOR) else None 677 678 return self.expression(exp.GroupConcat, this=this, separator=separator) 679 680 class Generator(generator.Generator): 681 INTERVAL_ALLOWS_PLURAL_FORM = False 682 LOCKING_READS_SUPPORTED = True 683 NULL_ORDERING_SUPPORTED = None 684 JOIN_HINTS = False 685 TABLE_HINTS = True 686 DUPLICATE_KEY_UPDATE_WITH_SET = False 687 QUERY_HINT_SEP = " " 688 VALUES_AS_TABLE = False 689 NVL2_SUPPORTED = False 690 LAST_DAY_SUPPORTS_DATE_PART = False 691 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 692 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 693 JSON_KEY_VALUE_PAIR_SEP = "," 694 SUPPORTS_TO_NUMBER = False 695 PARSE_JSON_NAME = None 696 PAD_FILL_PATTERN_IS_REQUIRED = True 697 WRAP_DERIVED_VALUES = False 698 699 TRANSFORMS = { 700 **generator.Generator.TRANSFORMS, 701 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 702 exp.CurrentDate: no_paren_current_date_sql, 703 exp.DateDiff: _remove_ts_or_ds_to_date( 704 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 705 ), 706 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 707 exp.DateStrToDate: datestrtodate_sql, 708 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 709 exp.DateTrunc: _date_trunc_sql, 710 exp.Day: _remove_ts_or_ds_to_date(), 711 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 712 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 713 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 714 exp.GroupConcat: lambda self, 715 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 716 exp.ILike: no_ilike_sql, 717 exp.JSONExtractScalar: arrow_json_extract_sql, 718 exp.Max: max_or_greatest, 719 exp.Min: min_or_least, 720 exp.Month: _remove_ts_or_ds_to_date(), 721 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 722 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 723 exp.Pivot: no_pivot_sql, 724 exp.Select: transforms.preprocess( 725 [ 726 transforms.eliminate_distinct_on, 727 transforms.eliminate_semi_and_anti_joins, 728 transforms.eliminate_qualify, 729 transforms.eliminate_full_outer_join, 730 ] 731 ), 732 exp.StrPosition: strposition_to_locate_sql, 733 exp.StrToDate: _str_to_date_sql, 734 exp.StrToTime: _str_to_date_sql, 735 exp.Stuff: rename_func("INSERT"), 736 exp.TableSample: no_tablesample_sql, 737 exp.TimeFromParts: rename_func("MAKETIME"), 738 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 739 exp.TimestampDiff: lambda self, e: self.func( 740 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 741 ), 742 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 743 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 744 exp.TimeStrToTime: lambda self, e: self.sql( 745 exp.cast(e.this, exp.DataType.Type.DATETIME, copy=True) 746 ), 747 exp.TimeToStr: _remove_ts_or_ds_to_date( 748 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 749 ), 750 exp.Trim: _trim_sql, 751 exp.TryCast: no_trycast_sql, 752 exp.TsOrDsAdd: date_add_sql("ADD"), 753 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 754 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 755 exp.UnixToTime: _unix_to_time_sql, 756 exp.Unnest: transforms.preprocess( 757 [transforms.unnest_generate_date_array_using_recursive_cte()] 758 ), 759 exp.Week: _remove_ts_or_ds_to_date(), 760 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 761 exp.Year: _remove_ts_or_ds_to_date(), 762 } 763 764 UNSIGNED_TYPE_MAPPING = { 765 exp.DataType.Type.UBIGINT: "BIGINT", 766 exp.DataType.Type.UINT: "INT", 767 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 768 exp.DataType.Type.USMALLINT: "SMALLINT", 769 exp.DataType.Type.UTINYINT: "TINYINT", 770 exp.DataType.Type.UDECIMAL: "DECIMAL", 771 } 772 773 TIMESTAMP_TYPE_MAPPING = { 774 exp.DataType.Type.TIMESTAMP: "DATETIME", 775 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 776 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 777 } 778 779 TYPE_MAPPING = { 780 **generator.Generator.TYPE_MAPPING, 781 **UNSIGNED_TYPE_MAPPING, 782 **TIMESTAMP_TYPE_MAPPING, 783 } 784 785 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 786 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 787 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 788 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 789 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 790 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 791 792 PROPERTIES_LOCATION = { 793 **generator.Generator.PROPERTIES_LOCATION, 794 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 795 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 796 } 797 798 LIMIT_FETCH = "LIMIT" 799 800 LIMIT_ONLY_LITERALS = True 801 802 CHAR_CAST_MAPPING = dict.fromkeys( 803 ( 804 exp.DataType.Type.LONGTEXT, 805 exp.DataType.Type.LONGBLOB, 806 exp.DataType.Type.MEDIUMBLOB, 807 exp.DataType.Type.MEDIUMTEXT, 808 exp.DataType.Type.TEXT, 809 exp.DataType.Type.TINYBLOB, 810 exp.DataType.Type.TINYTEXT, 811 exp.DataType.Type.VARCHAR, 812 ), 813 "CHAR", 814 ) 815 SIGNED_CAST_MAPPING = dict.fromkeys( 816 ( 817 exp.DataType.Type.BIGINT, 818 exp.DataType.Type.BOOLEAN, 819 exp.DataType.Type.INT, 820 exp.DataType.Type.SMALLINT, 821 exp.DataType.Type.TINYINT, 822 exp.DataType.Type.MEDIUMINT, 823 ), 824 "SIGNED", 825 ) 826 827 # MySQL doesn't support many datatypes in cast. 828 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 829 CAST_MAPPING = { 830 **CHAR_CAST_MAPPING, 831 **SIGNED_CAST_MAPPING, 832 exp.DataType.Type.UBIGINT: "UNSIGNED", 833 } 834 835 TIMESTAMP_FUNC_TYPES = { 836 exp.DataType.Type.TIMESTAMPTZ, 837 exp.DataType.Type.TIMESTAMPLTZ, 838 } 839 840 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 841 RESERVED_KEYWORDS = { 842 "accessible", 843 "add", 844 "all", 845 "alter", 846 "analyze", 847 "and", 848 "as", 849 "asc", 850 "asensitive", 851 "before", 852 "between", 853 "bigint", 854 "binary", 855 "blob", 856 "both", 857 "by", 858 "call", 859 "cascade", 860 "case", 861 "change", 862 "char", 863 "character", 864 "check", 865 "collate", 866 "column", 867 "condition", 868 "constraint", 869 "continue", 870 "convert", 871 "create", 872 "cross", 873 "cube", 874 "cume_dist", 875 "current_date", 876 "current_time", 877 "current_timestamp", 878 "current_user", 879 "cursor", 880 "database", 881 "databases", 882 "day_hour", 883 "day_microsecond", 884 "day_minute", 885 "day_second", 886 "dec", 887 "decimal", 888 "declare", 889 "default", 890 "delayed", 891 "delete", 892 "dense_rank", 893 "desc", 894 "describe", 895 "deterministic", 896 "distinct", 897 "distinctrow", 898 "div", 899 "double", 900 "drop", 901 "dual", 902 "each", 903 "else", 904 "elseif", 905 "empty", 906 "enclosed", 907 "escaped", 908 "except", 909 "exists", 910 "exit", 911 "explain", 912 "false", 913 "fetch", 914 "first_value", 915 "float", 916 "float4", 917 "float8", 918 "for", 919 "force", 920 "foreign", 921 "from", 922 "fulltext", 923 "function", 924 "generated", 925 "get", 926 "grant", 927 "group", 928 "grouping", 929 "groups", 930 "having", 931 "high_priority", 932 "hour_microsecond", 933 "hour_minute", 934 "hour_second", 935 "if", 936 "ignore", 937 "in", 938 "index", 939 "infile", 940 "inner", 941 "inout", 942 "insensitive", 943 "insert", 944 "int", 945 "int1", 946 "int2", 947 "int3", 948 "int4", 949 "int8", 950 "integer", 951 "intersect", 952 "interval", 953 "into", 954 "io_after_gtids", 955 "io_before_gtids", 956 "is", 957 "iterate", 958 "join", 959 "json_table", 960 "key", 961 "keys", 962 "kill", 963 "lag", 964 "last_value", 965 "lateral", 966 "lead", 967 "leading", 968 "leave", 969 "left", 970 "like", 971 "limit", 972 "linear", 973 "lines", 974 "load", 975 "localtime", 976 "localtimestamp", 977 "lock", 978 "long", 979 "longblob", 980 "longtext", 981 "loop", 982 "low_priority", 983 "master_bind", 984 "master_ssl_verify_server_cert", 985 "match", 986 "maxvalue", 987 "mediumblob", 988 "mediumint", 989 "mediumtext", 990 "middleint", 991 "minute_microsecond", 992 "minute_second", 993 "mod", 994 "modifies", 995 "natural", 996 "not", 997 "no_write_to_binlog", 998 "nth_value", 999 "ntile", 1000 "null", 1001 "numeric", 1002 "of", 1003 "on", 1004 "optimize", 1005 "optimizer_costs", 1006 "option", 1007 "optionally", 1008 "or", 1009 "order", 1010 "out", 1011 "outer", 1012 "outfile", 1013 "over", 1014 "partition", 1015 "percent_rank", 1016 "precision", 1017 "primary", 1018 "procedure", 1019 "purge", 1020 "range", 1021 "rank", 1022 "read", 1023 "reads", 1024 "read_write", 1025 "real", 1026 "recursive", 1027 "references", 1028 "regexp", 1029 "release", 1030 "rename", 1031 "repeat", 1032 "replace", 1033 "require", 1034 "resignal", 1035 "restrict", 1036 "return", 1037 "revoke", 1038 "right", 1039 "rlike", 1040 "row", 1041 "rows", 1042 "row_number", 1043 "schema", 1044 "schemas", 1045 "second_microsecond", 1046 "select", 1047 "sensitive", 1048 "separator", 1049 "set", 1050 "show", 1051 "signal", 1052 "smallint", 1053 "spatial", 1054 "specific", 1055 "sql", 1056 "sqlexception", 1057 "sqlstate", 1058 "sqlwarning", 1059 "sql_big_result", 1060 "sql_calc_found_rows", 1061 "sql_small_result", 1062 "ssl", 1063 "starting", 1064 "stored", 1065 "straight_join", 1066 "system", 1067 "table", 1068 "terminated", 1069 "then", 1070 "tinyblob", 1071 "tinyint", 1072 "tinytext", 1073 "to", 1074 "trailing", 1075 "trigger", 1076 "true", 1077 "undo", 1078 "union", 1079 "unique", 1080 "unlock", 1081 "unsigned", 1082 "update", 1083 "usage", 1084 "use", 1085 "using", 1086 "utc_date", 1087 "utc_time", 1088 "utc_timestamp", 1089 "values", 1090 "varbinary", 1091 "varchar", 1092 "varcharacter", 1093 "varying", 1094 "virtual", 1095 "when", 1096 "where", 1097 "while", 1098 "window", 1099 "with", 1100 "write", 1101 "xor", 1102 "year_month", 1103 "zerofill", 1104 } 1105 1106 def array_sql(self, expression: exp.Array) -> str: 1107 self.unsupported("Arrays are not supported by MySQL") 1108 return self.function_fallback_sql(expression) 1109 1110 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1111 self.unsupported("Array operations are not supported by MySQL") 1112 return self.function_fallback_sql(expression) 1113 1114 def dpipe_sql(self, expression: exp.DPipe) -> str: 1115 return self.func("CONCAT", *expression.flatten()) 1116 1117 def extract_sql(self, expression: exp.Extract) -> str: 1118 unit = expression.name 1119 if unit and unit.lower() == "epoch": 1120 return self.func("UNIX_TIMESTAMP", expression.expression) 1121 1122 return super().extract_sql(expression) 1123 1124 def datatype_sql(self, expression: exp.DataType) -> str: 1125 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1126 result = super().datatype_sql(expression) 1127 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1128 result = f"{result} UNSIGNED" 1129 return result 1130 1131 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1132 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1133 1134 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1135 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1136 return self.func("TIMESTAMP", expression.this) 1137 1138 to = self.CAST_MAPPING.get(expression.to.this) 1139 1140 if to: 1141 expression.to.set("this", to) 1142 return super().cast_sql(expression) 1143 1144 def show_sql(self, expression: exp.Show) -> str: 1145 this = f" {expression.name}" 1146 full = " FULL" if expression.args.get("full") else "" 1147 global_ = " GLOBAL" if expression.args.get("global") else "" 1148 1149 target = self.sql(expression, "target") 1150 target = f" {target}" if target else "" 1151 if expression.name in ("COLUMNS", "INDEX"): 1152 target = f" FROM{target}" 1153 elif expression.name == "GRANTS": 1154 target = f" FOR{target}" 1155 1156 db = self._prefixed_sql("FROM", expression, "db") 1157 1158 like = self._prefixed_sql("LIKE", expression, "like") 1159 where = self.sql(expression, "where") 1160 1161 types = self.expressions(expression, key="types") 1162 types = f" {types}" if types else types 1163 query = self._prefixed_sql("FOR QUERY", expression, "query") 1164 1165 if expression.name == "PROFILE": 1166 offset = self._prefixed_sql("OFFSET", expression, "offset") 1167 limit = self._prefixed_sql("LIMIT", expression, "limit") 1168 else: 1169 offset = "" 1170 limit = self._oldstyle_limit_sql(expression) 1171 1172 log = self._prefixed_sql("IN", expression, "log") 1173 position = self._prefixed_sql("FROM", expression, "position") 1174 1175 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1176 1177 if expression.name == "ENGINE": 1178 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1179 else: 1180 mutex_or_status = "" 1181 1182 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1183 1184 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1185 dtype = self.sql(expression, "dtype") 1186 if not dtype: 1187 return super().altercolumn_sql(expression) 1188 1189 this = self.sql(expression, "this") 1190 return f"MODIFY COLUMN {this} {dtype}" 1191 1192 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1193 sql = self.sql(expression, arg) 1194 return f" {prefix} {sql}" if sql else "" 1195 1196 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1197 limit = self.sql(expression, "limit") 1198 offset = self.sql(expression, "offset") 1199 if limit: 1200 limit_offset = f"{offset}, {limit}" if offset else limit 1201 return f" LIMIT {limit_offset}" 1202 return "" 1203 1204 def chr_sql(self, expression: exp.Chr) -> str: 1205 this = self.expressions(sqls=[expression.this] + expression.expressions) 1206 charset = expression.args.get("charset") 1207 using = f" USING {self.sql(charset)}" if charset else "" 1208 return f"CHAR({this}{using})" 1209 1210 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1211 unit = expression.args.get("unit") 1212 1213 # Pick an old-enough date to avoid negative timestamp diffs 1214 start_ts = "'0000-01-01 00:00:00'" 1215 1216 # Source: https://stackoverflow.com/a/32955740 1217 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1218 interval = exp.Interval(this=timestamp_diff, unit=unit) 1219 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1220 1221 return self.sql(dateadd) 1222 1223 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1224 from_tz = expression.args.get("source_tz") 1225 to_tz = expression.args.get("target_tz") 1226 dt = expression.args.get("timestamp") 1227 1228 return self.func("CONVERT_TZ", dt, from_tz, to_tz)
TIME_SPECIFIERS =
{'l', 'p', 'i', 'T', 'S', 'H', 'h', 'f', 'k', 'r', 's', 'I'}
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 "KEY": TokenType.KEY, 207 "LOCK TABLES": TokenType.COMMAND, 208 "LONGBLOB": TokenType.LONGBLOB, 209 "LONGTEXT": TokenType.LONGTEXT, 210 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 211 "TINYBLOB": TokenType.TINYBLOB, 212 "TINYTEXT": TokenType.TINYTEXT, 213 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 214 "MEDIUMINT": TokenType.MEDIUMINT, 215 "MEMBER OF": TokenType.MEMBER_OF, 216 "SEPARATOR": TokenType.SEPARATOR, 217 "START": TokenType.BEGIN, 218 "SIGNED": TokenType.BIGINT, 219 "SIGNED INTEGER": TokenType.BIGINT, 220 "UNLOCK TABLES": TokenType.COMMAND, 221 "UNSIGNED": TokenType.UBIGINT, 222 "UNSIGNED INTEGER": TokenType.UBIGINT, 223 "YEAR": TokenType.YEAR, 224 "_ARMSCII8": TokenType.INTRODUCER, 225 "_ASCII": TokenType.INTRODUCER, 226 "_BIG5": TokenType.INTRODUCER, 227 "_BINARY": TokenType.INTRODUCER, 228 "_CP1250": TokenType.INTRODUCER, 229 "_CP1251": TokenType.INTRODUCER, 230 "_CP1256": TokenType.INTRODUCER, 231 "_CP1257": TokenType.INTRODUCER, 232 "_CP850": TokenType.INTRODUCER, 233 "_CP852": TokenType.INTRODUCER, 234 "_CP866": TokenType.INTRODUCER, 235 "_CP932": TokenType.INTRODUCER, 236 "_DEC8": TokenType.INTRODUCER, 237 "_EUCJPMS": TokenType.INTRODUCER, 238 "_EUCKR": TokenType.INTRODUCER, 239 "_GB18030": TokenType.INTRODUCER, 240 "_GB2312": TokenType.INTRODUCER, 241 "_GBK": TokenType.INTRODUCER, 242 "_GEOSTD8": TokenType.INTRODUCER, 243 "_GREEK": TokenType.INTRODUCER, 244 "_HEBREW": TokenType.INTRODUCER, 245 "_HP8": TokenType.INTRODUCER, 246 "_KEYBCS2": TokenType.INTRODUCER, 247 "_KOI8R": TokenType.INTRODUCER, 248 "_KOI8U": TokenType.INTRODUCER, 249 "_LATIN1": TokenType.INTRODUCER, 250 "_LATIN2": TokenType.INTRODUCER, 251 "_LATIN5": TokenType.INTRODUCER, 252 "_LATIN7": TokenType.INTRODUCER, 253 "_MACCE": TokenType.INTRODUCER, 254 "_MACROMAN": TokenType.INTRODUCER, 255 "_SJIS": TokenType.INTRODUCER, 256 "_SWE7": TokenType.INTRODUCER, 257 "_TIS620": TokenType.INTRODUCER, 258 "_UCS2": TokenType.INTRODUCER, 259 "_UJIS": TokenType.INTRODUCER, 260 # https://dev.mysql.com/doc/refman/8.0/en/string-literals.html 261 "_UTF8": TokenType.INTRODUCER, 262 "_UTF16": TokenType.INTRODUCER, 263 "_UTF16LE": TokenType.INTRODUCER, 264 "_UTF32": TokenType.INTRODUCER, 265 "_UTF8MB3": TokenType.INTRODUCER, 266 "_UTF8MB4": TokenType.INTRODUCER, 267 "@@": TokenType.SESSION_PARAMETER, 268 } 269 270 COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.REPLACE} - {TokenType.SHOW} 271 272 class Parser(parser.Parser): 273 FUNC_TOKENS = { 274 *parser.Parser.FUNC_TOKENS, 275 TokenType.DATABASE, 276 TokenType.SCHEMA, 277 TokenType.VALUES, 278 } 279 280 CONJUNCTION = { 281 **parser.Parser.CONJUNCTION, 282 TokenType.DAMP: exp.And, 283 TokenType.XOR: exp.Xor, 284 } 285 286 DISJUNCTION = { 287 **parser.Parser.DISJUNCTION, 288 TokenType.DPIPE: exp.Or, 289 } 290 291 TABLE_ALIAS_TOKENS = ( 292 parser.Parser.TABLE_ALIAS_TOKENS - parser.Parser.TABLE_INDEX_HINT_TOKENS 293 ) 294 295 RANGE_PARSERS = { 296 **parser.Parser.RANGE_PARSERS, 297 TokenType.MEMBER_OF: lambda self, this: self.expression( 298 exp.JSONArrayContains, 299 this=this, 300 expression=self._parse_wrapped(self._parse_expression), 301 ), 302 } 303 304 FUNCTIONS = { 305 **parser.Parser.FUNCTIONS, 306 "CONVERT_TZ": lambda args: exp.ConvertTimezone( 307 source_tz=seq_get(args, 1), target_tz=seq_get(args, 2), timestamp=seq_get(args, 0) 308 ), 309 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 310 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 311 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 312 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 313 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 314 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 315 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 316 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 317 "INSTR": lambda args: exp.StrPosition(substr=seq_get(args, 1), this=seq_get(args, 0)), 318 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 319 "ISNULL": isnull_to_is_null, 320 "LOCATE": locate_to_strposition, 321 "MAKETIME": exp.TimeFromParts.from_arg_list, 322 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 323 "MONTHNAME": lambda args: exp.TimeToStr( 324 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 325 format=exp.Literal.string("%B"), 326 ), 327 "STR_TO_DATE": _str_to_date, 328 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 329 "TO_DAYS": lambda args: exp.paren( 330 exp.DateDiff( 331 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 332 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 333 unit=exp.var("DAY"), 334 ) 335 + 1 336 ), 337 "WEEK": lambda args: exp.Week( 338 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 339 ), 340 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 341 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 342 } 343 344 FUNCTION_PARSERS = { 345 **parser.Parser.FUNCTION_PARSERS, 346 "CHAR": lambda self: self._parse_chr(), 347 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 348 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 349 "VALUES": lambda self: self.expression( 350 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 351 ), 352 } 353 354 STATEMENT_PARSERS = { 355 **parser.Parser.STATEMENT_PARSERS, 356 TokenType.SHOW: lambda self: self._parse_show(), 357 } 358 359 SHOW_PARSERS = { 360 "BINARY LOGS": _show_parser("BINARY LOGS"), 361 "MASTER LOGS": _show_parser("BINARY LOGS"), 362 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 363 "CHARACTER SET": _show_parser("CHARACTER SET"), 364 "CHARSET": _show_parser("CHARACTER SET"), 365 "COLLATION": _show_parser("COLLATION"), 366 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 367 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 368 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 369 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 370 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 371 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 372 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 373 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 374 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 375 "DATABASES": _show_parser("DATABASES"), 376 "SCHEMAS": _show_parser("DATABASES"), 377 "ENGINE": _show_parser("ENGINE", target=True), 378 "STORAGE ENGINES": _show_parser("ENGINES"), 379 "ENGINES": _show_parser("ENGINES"), 380 "ERRORS": _show_parser("ERRORS"), 381 "EVENTS": _show_parser("EVENTS"), 382 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 383 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 384 "GRANTS": _show_parser("GRANTS", target="FOR"), 385 "INDEX": _show_parser("INDEX", target="FROM"), 386 "MASTER STATUS": _show_parser("MASTER STATUS"), 387 "OPEN TABLES": _show_parser("OPEN TABLES"), 388 "PLUGINS": _show_parser("PLUGINS"), 389 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 390 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 391 "PRIVILEGES": _show_parser("PRIVILEGES"), 392 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 393 "PROCESSLIST": _show_parser("PROCESSLIST"), 394 "PROFILE": _show_parser("PROFILE"), 395 "PROFILES": _show_parser("PROFILES"), 396 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 397 "REPLICAS": _show_parser("REPLICAS"), 398 "SLAVE HOSTS": _show_parser("REPLICAS"), 399 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 400 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 401 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 402 "SESSION STATUS": _show_parser("STATUS"), 403 "STATUS": _show_parser("STATUS"), 404 "TABLE STATUS": _show_parser("TABLE STATUS"), 405 "FULL TABLES": _show_parser("TABLES", full=True), 406 "TABLES": _show_parser("TABLES"), 407 "TRIGGERS": _show_parser("TRIGGERS"), 408 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 409 "SESSION VARIABLES": _show_parser("VARIABLES"), 410 "VARIABLES": _show_parser("VARIABLES"), 411 "WARNINGS": _show_parser("WARNINGS"), 412 } 413 414 PROPERTY_PARSERS = { 415 **parser.Parser.PROPERTY_PARSERS, 416 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 417 } 418 419 SET_PARSERS = { 420 **parser.Parser.SET_PARSERS, 421 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 422 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 423 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 424 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 425 "NAMES": lambda self: self._parse_set_item_names(), 426 } 427 428 CONSTRAINT_PARSERS = { 429 **parser.Parser.CONSTRAINT_PARSERS, 430 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 431 "INDEX": lambda self: self._parse_index_constraint(), 432 "KEY": lambda self: self._parse_index_constraint(), 433 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 434 } 435 436 ALTER_PARSERS = { 437 **parser.Parser.ALTER_PARSERS, 438 "MODIFY": lambda self: self._parse_alter_table_alter(), 439 } 440 441 SCHEMA_UNNAMED_CONSTRAINTS = { 442 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 443 "FULLTEXT", 444 "INDEX", 445 "KEY", 446 "SPATIAL", 447 } 448 449 PROFILE_TYPES: parser.OPTIONS_TYPE = { 450 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 451 "BLOCK": ("IO",), 452 "CONTEXT": ("SWITCHES",), 453 "PAGE": ("FAULTS",), 454 } 455 456 TYPE_TOKENS = { 457 *parser.Parser.TYPE_TOKENS, 458 TokenType.SET, 459 } 460 461 ENUM_TYPE_TOKENS = { 462 *parser.Parser.ENUM_TYPE_TOKENS, 463 TokenType.SET, 464 } 465 466 LOG_DEFAULTS_TO_LN = True 467 STRING_ALIASES = True 468 VALUES_FOLLOWED_BY_PAREN = False 469 SUPPORTS_PARTITION_SELECTION = True 470 471 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 472 this = self._parse_id_var() 473 if not self._match(TokenType.L_PAREN): 474 return this 475 476 expression = self._parse_number() 477 self._match_r_paren() 478 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 479 480 def _parse_index_constraint( 481 self, kind: t.Optional[str] = None 482 ) -> exp.IndexColumnConstraint: 483 if kind: 484 self._match_texts(("INDEX", "KEY")) 485 486 this = self._parse_id_var(any_token=False) 487 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 488 expressions = self._parse_wrapped_csv(self._parse_ordered) 489 490 options = [] 491 while True: 492 if self._match_text_seq("KEY_BLOCK_SIZE"): 493 self._match(TokenType.EQ) 494 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 495 elif self._match(TokenType.USING): 496 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 497 elif self._match_text_seq("WITH", "PARSER"): 498 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 499 elif self._match(TokenType.COMMENT): 500 opt = exp.IndexConstraintOption(comment=self._parse_string()) 501 elif self._match_text_seq("VISIBLE"): 502 opt = exp.IndexConstraintOption(visible=True) 503 elif self._match_text_seq("INVISIBLE"): 504 opt = exp.IndexConstraintOption(visible=False) 505 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 506 self._match(TokenType.EQ) 507 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 508 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 509 self._match(TokenType.EQ) 510 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 511 else: 512 opt = None 513 514 if not opt: 515 break 516 517 options.append(opt) 518 519 return self.expression( 520 exp.IndexColumnConstraint, 521 this=this, 522 expressions=expressions, 523 kind=kind, 524 index_type=index_type, 525 options=options, 526 ) 527 528 def _parse_show_mysql( 529 self, 530 this: str, 531 target: bool | str = False, 532 full: t.Optional[bool] = None, 533 global_: t.Optional[bool] = None, 534 ) -> exp.Show: 535 if target: 536 if isinstance(target, str): 537 self._match_text_seq(target) 538 target_id = self._parse_id_var() 539 else: 540 target_id = None 541 542 log = self._parse_string() if self._match_text_seq("IN") else None 543 544 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 545 position = self._parse_number() if self._match_text_seq("FROM") else None 546 db = None 547 else: 548 position = None 549 db = None 550 551 if self._match(TokenType.FROM): 552 db = self._parse_id_var() 553 elif self._match(TokenType.DOT): 554 db = target_id 555 target_id = self._parse_id_var() 556 557 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 558 559 like = self._parse_string() if self._match_text_seq("LIKE") else None 560 where = self._parse_where() 561 562 if this == "PROFILE": 563 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 564 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 565 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 566 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 567 else: 568 types, query = None, None 569 offset, limit = self._parse_oldstyle_limit() 570 571 mutex = True if self._match_text_seq("MUTEX") else None 572 mutex = False if self._match_text_seq("STATUS") else mutex 573 574 return self.expression( 575 exp.Show, 576 this=this, 577 target=target_id, 578 full=full, 579 log=log, 580 position=position, 581 db=db, 582 channel=channel, 583 like=like, 584 where=where, 585 types=types, 586 query=query, 587 offset=offset, 588 limit=limit, 589 mutex=mutex, 590 **{"global": global_}, # type: ignore 591 ) 592 593 def _parse_oldstyle_limit( 594 self, 595 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 596 limit = None 597 offset = None 598 if self._match_text_seq("LIMIT"): 599 parts = self._parse_csv(self._parse_number) 600 if len(parts) == 1: 601 limit = parts[0] 602 elif len(parts) == 2: 603 limit = parts[1] 604 offset = parts[0] 605 606 return offset, limit 607 608 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 609 this = self._parse_string() or self._parse_unquoted_field() 610 return self.expression(exp.SetItem, this=this, kind=kind) 611 612 def _parse_set_item_names(self) -> exp.Expression: 613 charset = self._parse_string() or self._parse_unquoted_field() 614 if self._match_text_seq("COLLATE"): 615 collate = self._parse_string() or self._parse_unquoted_field() 616 else: 617 collate = None 618 619 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 620 621 def _parse_type( 622 self, parse_interval: bool = True, fallback_to_identifier: bool = False 623 ) -> t.Optional[exp.Expression]: 624 # mysql binary is special and can work anywhere, even in order by operations 625 # it operates like a no paren func 626 if self._match(TokenType.BINARY, advance=False): 627 data_type = self._parse_types(check_func=True, allow_identifiers=False) 628 629 if isinstance(data_type, exp.DataType): 630 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 631 632 return super()._parse_type( 633 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 634 ) 635 636 def _parse_chr(self) -> t.Optional[exp.Expression]: 637 expressions = self._parse_csv(self._parse_assignment) 638 kwargs: t.Dict[str, t.Any] = {"this": seq_get(expressions, 0)} 639 640 if len(expressions) > 1: 641 kwargs["expressions"] = expressions[1:] 642 643 if self._match(TokenType.USING): 644 kwargs["charset"] = self._parse_var() 645 646 return self.expression(exp.Chr, **kwargs) 647 648 def _parse_group_concat(self) -> t.Optional[exp.Expression]: 649 def concat_exprs( 650 node: t.Optional[exp.Expression], exprs: t.List[exp.Expression] 651 ) -> exp.Expression: 652 if isinstance(node, exp.Distinct) and len(node.expressions) > 1: 653 concat_exprs = [ 654 self.expression(exp.Concat, expressions=node.expressions, safe=True) 655 ] 656 node.set("expressions", concat_exprs) 657 return node 658 if len(exprs) == 1: 659 return exprs[0] 660 return self.expression(exp.Concat, expressions=args, safe=True) 661 662 args = self._parse_csv(self._parse_lambda) 663 664 if args: 665 order = args[-1] if isinstance(args[-1], exp.Order) else None 666 667 if order: 668 # Order By is the last (or only) expression in the list and has consumed the 'expr' before it, 669 # remove 'expr' from exp.Order and add it back to args 670 args[-1] = order.this 671 order.set("this", concat_exprs(order.this, args)) 672 673 this = order or concat_exprs(args[0], args) 674 else: 675 this = None 676 677 separator = self._parse_field() if self._match(TokenType.SEPARATOR) else None 678 679 return self.expression(exp.GroupConcat, this=this, separator=separator) 680 681 class Generator(generator.Generator): 682 INTERVAL_ALLOWS_PLURAL_FORM = False 683 LOCKING_READS_SUPPORTED = True 684 NULL_ORDERING_SUPPORTED = None 685 JOIN_HINTS = False 686 TABLE_HINTS = True 687 DUPLICATE_KEY_UPDATE_WITH_SET = False 688 QUERY_HINT_SEP = " " 689 VALUES_AS_TABLE = False 690 NVL2_SUPPORTED = False 691 LAST_DAY_SUPPORTS_DATE_PART = False 692 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 693 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 694 JSON_KEY_VALUE_PAIR_SEP = "," 695 SUPPORTS_TO_NUMBER = False 696 PARSE_JSON_NAME = None 697 PAD_FILL_PATTERN_IS_REQUIRED = True 698 WRAP_DERIVED_VALUES = False 699 700 TRANSFORMS = { 701 **generator.Generator.TRANSFORMS, 702 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 703 exp.CurrentDate: no_paren_current_date_sql, 704 exp.DateDiff: _remove_ts_or_ds_to_date( 705 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 706 ), 707 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 708 exp.DateStrToDate: datestrtodate_sql, 709 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 710 exp.DateTrunc: _date_trunc_sql, 711 exp.Day: _remove_ts_or_ds_to_date(), 712 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 713 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 714 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 715 exp.GroupConcat: lambda self, 716 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 717 exp.ILike: no_ilike_sql, 718 exp.JSONExtractScalar: arrow_json_extract_sql, 719 exp.Max: max_or_greatest, 720 exp.Min: min_or_least, 721 exp.Month: _remove_ts_or_ds_to_date(), 722 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 723 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 724 exp.Pivot: no_pivot_sql, 725 exp.Select: transforms.preprocess( 726 [ 727 transforms.eliminate_distinct_on, 728 transforms.eliminate_semi_and_anti_joins, 729 transforms.eliminate_qualify, 730 transforms.eliminate_full_outer_join, 731 ] 732 ), 733 exp.StrPosition: strposition_to_locate_sql, 734 exp.StrToDate: _str_to_date_sql, 735 exp.StrToTime: _str_to_date_sql, 736 exp.Stuff: rename_func("INSERT"), 737 exp.TableSample: no_tablesample_sql, 738 exp.TimeFromParts: rename_func("MAKETIME"), 739 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 740 exp.TimestampDiff: lambda self, e: self.func( 741 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 742 ), 743 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 744 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 745 exp.TimeStrToTime: lambda self, e: self.sql( 746 exp.cast(e.this, exp.DataType.Type.DATETIME, copy=True) 747 ), 748 exp.TimeToStr: _remove_ts_or_ds_to_date( 749 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 750 ), 751 exp.Trim: _trim_sql, 752 exp.TryCast: no_trycast_sql, 753 exp.TsOrDsAdd: date_add_sql("ADD"), 754 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 755 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 756 exp.UnixToTime: _unix_to_time_sql, 757 exp.Unnest: transforms.preprocess( 758 [transforms.unnest_generate_date_array_using_recursive_cte()] 759 ), 760 exp.Week: _remove_ts_or_ds_to_date(), 761 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 762 exp.Year: _remove_ts_or_ds_to_date(), 763 } 764 765 UNSIGNED_TYPE_MAPPING = { 766 exp.DataType.Type.UBIGINT: "BIGINT", 767 exp.DataType.Type.UINT: "INT", 768 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 769 exp.DataType.Type.USMALLINT: "SMALLINT", 770 exp.DataType.Type.UTINYINT: "TINYINT", 771 exp.DataType.Type.UDECIMAL: "DECIMAL", 772 } 773 774 TIMESTAMP_TYPE_MAPPING = { 775 exp.DataType.Type.TIMESTAMP: "DATETIME", 776 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 777 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 778 } 779 780 TYPE_MAPPING = { 781 **generator.Generator.TYPE_MAPPING, 782 **UNSIGNED_TYPE_MAPPING, 783 **TIMESTAMP_TYPE_MAPPING, 784 } 785 786 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 787 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 788 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 789 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 790 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 791 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 792 793 PROPERTIES_LOCATION = { 794 **generator.Generator.PROPERTIES_LOCATION, 795 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 796 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 797 } 798 799 LIMIT_FETCH = "LIMIT" 800 801 LIMIT_ONLY_LITERALS = True 802 803 CHAR_CAST_MAPPING = dict.fromkeys( 804 ( 805 exp.DataType.Type.LONGTEXT, 806 exp.DataType.Type.LONGBLOB, 807 exp.DataType.Type.MEDIUMBLOB, 808 exp.DataType.Type.MEDIUMTEXT, 809 exp.DataType.Type.TEXT, 810 exp.DataType.Type.TINYBLOB, 811 exp.DataType.Type.TINYTEXT, 812 exp.DataType.Type.VARCHAR, 813 ), 814 "CHAR", 815 ) 816 SIGNED_CAST_MAPPING = dict.fromkeys( 817 ( 818 exp.DataType.Type.BIGINT, 819 exp.DataType.Type.BOOLEAN, 820 exp.DataType.Type.INT, 821 exp.DataType.Type.SMALLINT, 822 exp.DataType.Type.TINYINT, 823 exp.DataType.Type.MEDIUMINT, 824 ), 825 "SIGNED", 826 ) 827 828 # MySQL doesn't support many datatypes in cast. 829 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 830 CAST_MAPPING = { 831 **CHAR_CAST_MAPPING, 832 **SIGNED_CAST_MAPPING, 833 exp.DataType.Type.UBIGINT: "UNSIGNED", 834 } 835 836 TIMESTAMP_FUNC_TYPES = { 837 exp.DataType.Type.TIMESTAMPTZ, 838 exp.DataType.Type.TIMESTAMPLTZ, 839 } 840 841 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 842 RESERVED_KEYWORDS = { 843 "accessible", 844 "add", 845 "all", 846 "alter", 847 "analyze", 848 "and", 849 "as", 850 "asc", 851 "asensitive", 852 "before", 853 "between", 854 "bigint", 855 "binary", 856 "blob", 857 "both", 858 "by", 859 "call", 860 "cascade", 861 "case", 862 "change", 863 "char", 864 "character", 865 "check", 866 "collate", 867 "column", 868 "condition", 869 "constraint", 870 "continue", 871 "convert", 872 "create", 873 "cross", 874 "cube", 875 "cume_dist", 876 "current_date", 877 "current_time", 878 "current_timestamp", 879 "current_user", 880 "cursor", 881 "database", 882 "databases", 883 "day_hour", 884 "day_microsecond", 885 "day_minute", 886 "day_second", 887 "dec", 888 "decimal", 889 "declare", 890 "default", 891 "delayed", 892 "delete", 893 "dense_rank", 894 "desc", 895 "describe", 896 "deterministic", 897 "distinct", 898 "distinctrow", 899 "div", 900 "double", 901 "drop", 902 "dual", 903 "each", 904 "else", 905 "elseif", 906 "empty", 907 "enclosed", 908 "escaped", 909 "except", 910 "exists", 911 "exit", 912 "explain", 913 "false", 914 "fetch", 915 "first_value", 916 "float", 917 "float4", 918 "float8", 919 "for", 920 "force", 921 "foreign", 922 "from", 923 "fulltext", 924 "function", 925 "generated", 926 "get", 927 "grant", 928 "group", 929 "grouping", 930 "groups", 931 "having", 932 "high_priority", 933 "hour_microsecond", 934 "hour_minute", 935 "hour_second", 936 "if", 937 "ignore", 938 "in", 939 "index", 940 "infile", 941 "inner", 942 "inout", 943 "insensitive", 944 "insert", 945 "int", 946 "int1", 947 "int2", 948 "int3", 949 "int4", 950 "int8", 951 "integer", 952 "intersect", 953 "interval", 954 "into", 955 "io_after_gtids", 956 "io_before_gtids", 957 "is", 958 "iterate", 959 "join", 960 "json_table", 961 "key", 962 "keys", 963 "kill", 964 "lag", 965 "last_value", 966 "lateral", 967 "lead", 968 "leading", 969 "leave", 970 "left", 971 "like", 972 "limit", 973 "linear", 974 "lines", 975 "load", 976 "localtime", 977 "localtimestamp", 978 "lock", 979 "long", 980 "longblob", 981 "longtext", 982 "loop", 983 "low_priority", 984 "master_bind", 985 "master_ssl_verify_server_cert", 986 "match", 987 "maxvalue", 988 "mediumblob", 989 "mediumint", 990 "mediumtext", 991 "middleint", 992 "minute_microsecond", 993 "minute_second", 994 "mod", 995 "modifies", 996 "natural", 997 "not", 998 "no_write_to_binlog", 999 "nth_value", 1000 "ntile", 1001 "null", 1002 "numeric", 1003 "of", 1004 "on", 1005 "optimize", 1006 "optimizer_costs", 1007 "option", 1008 "optionally", 1009 "or", 1010 "order", 1011 "out", 1012 "outer", 1013 "outfile", 1014 "over", 1015 "partition", 1016 "percent_rank", 1017 "precision", 1018 "primary", 1019 "procedure", 1020 "purge", 1021 "range", 1022 "rank", 1023 "read", 1024 "reads", 1025 "read_write", 1026 "real", 1027 "recursive", 1028 "references", 1029 "regexp", 1030 "release", 1031 "rename", 1032 "repeat", 1033 "replace", 1034 "require", 1035 "resignal", 1036 "restrict", 1037 "return", 1038 "revoke", 1039 "right", 1040 "rlike", 1041 "row", 1042 "rows", 1043 "row_number", 1044 "schema", 1045 "schemas", 1046 "second_microsecond", 1047 "select", 1048 "sensitive", 1049 "separator", 1050 "set", 1051 "show", 1052 "signal", 1053 "smallint", 1054 "spatial", 1055 "specific", 1056 "sql", 1057 "sqlexception", 1058 "sqlstate", 1059 "sqlwarning", 1060 "sql_big_result", 1061 "sql_calc_found_rows", 1062 "sql_small_result", 1063 "ssl", 1064 "starting", 1065 "stored", 1066 "straight_join", 1067 "system", 1068 "table", 1069 "terminated", 1070 "then", 1071 "tinyblob", 1072 "tinyint", 1073 "tinytext", 1074 "to", 1075 "trailing", 1076 "trigger", 1077 "true", 1078 "undo", 1079 "union", 1080 "unique", 1081 "unlock", 1082 "unsigned", 1083 "update", 1084 "usage", 1085 "use", 1086 "using", 1087 "utc_date", 1088 "utc_time", 1089 "utc_timestamp", 1090 "values", 1091 "varbinary", 1092 "varchar", 1093 "varcharacter", 1094 "varying", 1095 "virtual", 1096 "when", 1097 "where", 1098 "while", 1099 "window", 1100 "with", 1101 "write", 1102 "xor", 1103 "year_month", 1104 "zerofill", 1105 } 1106 1107 def array_sql(self, expression: exp.Array) -> str: 1108 self.unsupported("Arrays are not supported by MySQL") 1109 return self.function_fallback_sql(expression) 1110 1111 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1112 self.unsupported("Array operations are not supported by MySQL") 1113 return self.function_fallback_sql(expression) 1114 1115 def dpipe_sql(self, expression: exp.DPipe) -> str: 1116 return self.func("CONCAT", *expression.flatten()) 1117 1118 def extract_sql(self, expression: exp.Extract) -> str: 1119 unit = expression.name 1120 if unit and unit.lower() == "epoch": 1121 return self.func("UNIX_TIMESTAMP", expression.expression) 1122 1123 return super().extract_sql(expression) 1124 1125 def datatype_sql(self, expression: exp.DataType) -> str: 1126 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1127 result = super().datatype_sql(expression) 1128 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1129 result = f"{result} UNSIGNED" 1130 return result 1131 1132 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1133 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1134 1135 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1136 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1137 return self.func("TIMESTAMP", expression.this) 1138 1139 to = self.CAST_MAPPING.get(expression.to.this) 1140 1141 if to: 1142 expression.to.set("this", to) 1143 return super().cast_sql(expression) 1144 1145 def show_sql(self, expression: exp.Show) -> str: 1146 this = f" {expression.name}" 1147 full = " FULL" if expression.args.get("full") else "" 1148 global_ = " GLOBAL" if expression.args.get("global") else "" 1149 1150 target = self.sql(expression, "target") 1151 target = f" {target}" if target else "" 1152 if expression.name in ("COLUMNS", "INDEX"): 1153 target = f" FROM{target}" 1154 elif expression.name == "GRANTS": 1155 target = f" FOR{target}" 1156 1157 db = self._prefixed_sql("FROM", expression, "db") 1158 1159 like = self._prefixed_sql("LIKE", expression, "like") 1160 where = self.sql(expression, "where") 1161 1162 types = self.expressions(expression, key="types") 1163 types = f" {types}" if types else types 1164 query = self._prefixed_sql("FOR QUERY", expression, "query") 1165 1166 if expression.name == "PROFILE": 1167 offset = self._prefixed_sql("OFFSET", expression, "offset") 1168 limit = self._prefixed_sql("LIMIT", expression, "limit") 1169 else: 1170 offset = "" 1171 limit = self._oldstyle_limit_sql(expression) 1172 1173 log = self._prefixed_sql("IN", expression, "log") 1174 position = self._prefixed_sql("FROM", expression, "position") 1175 1176 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1177 1178 if expression.name == "ENGINE": 1179 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1180 else: 1181 mutex_or_status = "" 1182 1183 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1184 1185 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1186 dtype = self.sql(expression, "dtype") 1187 if not dtype: 1188 return super().altercolumn_sql(expression) 1189 1190 this = self.sql(expression, "this") 1191 return f"MODIFY COLUMN {this} {dtype}" 1192 1193 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1194 sql = self.sql(expression, arg) 1195 return f" {prefix} {sql}" if sql else "" 1196 1197 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1198 limit = self.sql(expression, "limit") 1199 offset = self.sql(expression, "offset") 1200 if limit: 1201 limit_offset = f"{offset}, {limit}" if offset else limit 1202 return f" LIMIT {limit_offset}" 1203 return "" 1204 1205 def chr_sql(self, expression: exp.Chr) -> str: 1206 this = self.expressions(sqls=[expression.this] + expression.expressions) 1207 charset = expression.args.get("charset") 1208 using = f" USING {self.sql(charset)}" if charset else "" 1209 return f"CHAR({this}{using})" 1210 1211 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1212 unit = expression.args.get("unit") 1213 1214 # Pick an old-enough date to avoid negative timestamp diffs 1215 start_ts = "'0000-01-01 00:00:00'" 1216 1217 # Source: https://stackoverflow.com/a/32955740 1218 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1219 interval = exp.Interval(this=timestamp_diff, unit=unit) 1220 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1221 1222 return self.sql(dateadd) 1223 1224 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1225 from_tz = expression.args.get("source_tz") 1226 to_tz = expression.args.get("target_tz") 1227 dt = expression.args.get("timestamp") 1228 1229 return self.func("CONVERT_TZ", dt, from_tz, to_tz)
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
- COPY_PARAMS_ARE_CSV
- NORMALIZE_FUNCTIONS
- LOG_BASE_FIRST
- NULL_ORDERING
- TYPED_DIVISION
- CONCAT_COALESCE
- HEX_LOWERCASE
- DATE_FORMAT
- DATEINT_FORMAT
- FORMAT_MAPPING
- PSEUDOCOLUMNS
- PREFER_CTE_ALIAS_COLUMN
- FORCE_EARLY_ALIAS_REF_EXPANSION
- EXPAND_ALIAS_REFS_EARLY_ONLY_IN_GROUP_BY
- SUPPORTS_ORDER_BY_ALL
- HAS_DISTINCT_ARRAY_CONSTRUCTORS
- SUPPORTS_FIXED_SIZE_ARRAYS
- DATE_PART_MAPPING
- TYPE_TO_EXPRESSIONS
- ANNOTATORS
- get_or_raise
- format_time
- settings
- normalize_identifier
- case_sensitive
- can_identify
- quote_identifier
- to_json_path
- parse
- parse_into
- generate
- transpile
- tokenize
- tokenizer
- jsonpath_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 "KEY": TokenType.KEY, 207 "LOCK TABLES": TokenType.COMMAND, 208 "LONGBLOB": TokenType.LONGBLOB, 209 "LONGTEXT": TokenType.LONGTEXT, 210 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 211 "TINYBLOB": TokenType.TINYBLOB, 212 "TINYTEXT": TokenType.TINYTEXT, 213 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 214 "MEDIUMINT": TokenType.MEDIUMINT, 215 "MEMBER OF": TokenType.MEMBER_OF, 216 "SEPARATOR": TokenType.SEPARATOR, 217 "START": TokenType.BEGIN, 218 "SIGNED": TokenType.BIGINT, 219 "SIGNED INTEGER": TokenType.BIGINT, 220 "UNLOCK TABLES": TokenType.COMMAND, 221 "UNSIGNED": TokenType.UBIGINT, 222 "UNSIGNED INTEGER": TokenType.UBIGINT, 223 "YEAR": TokenType.YEAR, 224 "_ARMSCII8": TokenType.INTRODUCER, 225 "_ASCII": TokenType.INTRODUCER, 226 "_BIG5": TokenType.INTRODUCER, 227 "_BINARY": TokenType.INTRODUCER, 228 "_CP1250": TokenType.INTRODUCER, 229 "_CP1251": TokenType.INTRODUCER, 230 "_CP1256": TokenType.INTRODUCER, 231 "_CP1257": TokenType.INTRODUCER, 232 "_CP850": TokenType.INTRODUCER, 233 "_CP852": TokenType.INTRODUCER, 234 "_CP866": TokenType.INTRODUCER, 235 "_CP932": TokenType.INTRODUCER, 236 "_DEC8": TokenType.INTRODUCER, 237 "_EUCJPMS": TokenType.INTRODUCER, 238 "_EUCKR": TokenType.INTRODUCER, 239 "_GB18030": TokenType.INTRODUCER, 240 "_GB2312": TokenType.INTRODUCER, 241 "_GBK": TokenType.INTRODUCER, 242 "_GEOSTD8": TokenType.INTRODUCER, 243 "_GREEK": TokenType.INTRODUCER, 244 "_HEBREW": TokenType.INTRODUCER, 245 "_HP8": TokenType.INTRODUCER, 246 "_KEYBCS2": TokenType.INTRODUCER, 247 "_KOI8R": TokenType.INTRODUCER, 248 "_KOI8U": TokenType.INTRODUCER, 249 "_LATIN1": TokenType.INTRODUCER, 250 "_LATIN2": TokenType.INTRODUCER, 251 "_LATIN5": TokenType.INTRODUCER, 252 "_LATIN7": TokenType.INTRODUCER, 253 "_MACCE": TokenType.INTRODUCER, 254 "_MACROMAN": TokenType.INTRODUCER, 255 "_SJIS": TokenType.INTRODUCER, 256 "_SWE7": TokenType.INTRODUCER, 257 "_TIS620": TokenType.INTRODUCER, 258 "_UCS2": TokenType.INTRODUCER, 259 "_UJIS": TokenType.INTRODUCER, 260 # https://dev.mysql.com/doc/refman/8.0/en/string-literals.html 261 "_UTF8": TokenType.INTRODUCER, 262 "_UTF16": TokenType.INTRODUCER, 263 "_UTF16LE": TokenType.INTRODUCER, 264 "_UTF32": TokenType.INTRODUCER, 265 "_UTF8MB3": TokenType.INTRODUCER, 266 "_UTF8MB4": TokenType.INTRODUCER, 267 "@@": TokenType.SESSION_PARAMETER, 268 } 269 270 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'>, 'RENAME': <TokenType.RENAME: 'RENAME'>, 'REPLACE': <TokenType.REPLACE: 'REPLACE'>, 'RETURNING': <TokenType.RETURNING: 'RETURNING'>, 'REFERENCES': <TokenType.REFERENCES: 'REFERENCES'>, 'RIGHT': <TokenType.RIGHT: 'RIGHT'>, 'RLIKE': <TokenType.RLIKE: 'RLIKE'>, 'ROLLBACK': <TokenType.ROLLBACK: 'ROLLBACK'>, 'ROLLUP': <TokenType.ROLLUP: 'ROLLUP'>, 'ROW': <TokenType.ROW: 'ROW'>, 'ROWS': <TokenType.ROWS: 'ROWS'>, 'SCHEMA': <TokenType.SCHEMA: 'SCHEMA'>, 'SELECT': <TokenType.SELECT: 'SELECT'>, 'SEMI': <TokenType.SEMI: 'SEMI'>, 'SET': <TokenType.SET: 'SET'>, 'SETTINGS': <TokenType.SETTINGS: 'SETTINGS'>, 'SHOW': <TokenType.SHOW: 'SHOW'>, 'SIMILAR TO': <TokenType.SIMILAR_TO: 'SIMILAR_TO'>, 'SOME': <TokenType.SOME: 'SOME'>, 'SORT BY': <TokenType.SORT_BY: 'SORT_BY'>, 'START WITH': <TokenType.START_WITH: 'START_WITH'>, 'STRAIGHT_JOIN': <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, 'TABLE': <TokenType.TABLE: 'TABLE'>, 'TABLESAMPLE': <TokenType.TABLE_SAMPLE: 'TABLE_SAMPLE'>, 'TEMP': <TokenType.TEMPORARY: 'TEMPORARY'>, 'TEMPORARY': <TokenType.TEMPORARY: 'TEMPORARY'>, 'THEN': <TokenType.THEN: 'THEN'>, 'TRUE': <TokenType.TRUE: 'TRUE'>, 'TRUNCATE': <TokenType.TRUNCATE: 'TRUNCATE'>, 'UNION': <TokenType.UNION: 'UNION'>, 'UNKNOWN': <TokenType.UNKNOWN: 'UNKNOWN'>, 'UNNEST': <TokenType.UNNEST: 'UNNEST'>, 'UNPIVOT': <TokenType.UNPIVOT: 'UNPIVOT'>, 'UPDATE': <TokenType.UPDATE: 'UPDATE'>, 'USE': <TokenType.USE: 'USE'>, 'USING': <TokenType.USING: 'USING'>, 'UUID': <TokenType.UUID: 'UUID'>, 'VALUES': <TokenType.VALUES: 'VALUES'>, 'VIEW': <TokenType.VIEW: 'VIEW'>, 'VOLATILE': <TokenType.VOLATILE: 'VOLATILE'>, 'WHEN': <TokenType.WHEN: 'WHEN'>, 'WHERE': <TokenType.WHERE: 'WHERE'>, 'WINDOW': <TokenType.WINDOW: 'WINDOW'>, 'WITH': <TokenType.WITH: 'WITH'>, 'APPLY': <TokenType.APPLY: 'APPLY'>, 'ARRAY': <TokenType.ARRAY: 'ARRAY'>, 'BIT': <TokenType.BIT: 'BIT'>, 'BOOL': <TokenType.BOOLEAN: 'BOOLEAN'>, 'BOOLEAN': <TokenType.BOOLEAN: 'BOOLEAN'>, 'BYTE': <TokenType.TINYINT: 'TINYINT'>, 'MEDIUMINT': <TokenType.MEDIUMINT: 'MEDIUMINT'>, 'INT1': <TokenType.TINYINT: 'TINYINT'>, 'TINYINT': <TokenType.TINYINT: 'TINYINT'>, 'INT16': <TokenType.SMALLINT: 'SMALLINT'>, 'SHORT': <TokenType.SMALLINT: 'SMALLINT'>, 'SMALLINT': <TokenType.SMALLINT: 'SMALLINT'>, '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'>, 'LIST': <TokenType.LIST: 'LIST'>, 'MAP': <TokenType.MAP: 'MAP'>, 'NULLABLE': <TokenType.NULLABLE: 'NULLABLE'>, 'NUMBER': <TokenType.DECIMAL: 'DECIMAL'>, 'NUMERIC': <TokenType.DECIMAL: 'DECIMAL'>, 'FIXED': <TokenType.DECIMAL: 'DECIMAL'>, 'REAL': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT4': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT8': <TokenType.DOUBLE: 'DOUBLE'>, 'DOUBLE': <TokenType.DOUBLE: 'DOUBLE'>, 'DOUBLE PRECISION': <TokenType.DOUBLE: 'DOUBLE'>, 'JSON': <TokenType.JSON: 'JSON'>, 'JSONB': <TokenType.JSONB: 'JSONB'>, 'CHAR': <TokenType.CHAR: 'CHAR'>, 'CHARACTER': <TokenType.CHAR: 'CHAR'>, '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'>, 'VECTOR': <TokenType.VECTOR: 'VECTOR'>, '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'>, 'KEY': <TokenType.KEY: 'KEY'>, '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.RENAME: 'RENAME'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.FETCH: 'FETCH'>, <TokenType.REPLACE: 'REPLACE'>}
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- SINGLE_TOKENS
- BYTE_STRINGS
- RAW_STRINGS
- HEREDOC_STRINGS
- UNICODE_STRINGS
- IDENTIFIER_ESCAPES
- VAR_SINGLE_TOKENS
- HEREDOC_TAG_IS_IDENTIFIER
- HEREDOC_STRING_ALTERNATIVE
- STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS
- WHITE_SPACE
- COMMAND_PREFIX_TOKENS
- NUMERIC_LITERALS
- dialect
- reset
- tokenize
- tokenize_rs
- size
- sql
- tokens
272 class Parser(parser.Parser): 273 FUNC_TOKENS = { 274 *parser.Parser.FUNC_TOKENS, 275 TokenType.DATABASE, 276 TokenType.SCHEMA, 277 TokenType.VALUES, 278 } 279 280 CONJUNCTION = { 281 **parser.Parser.CONJUNCTION, 282 TokenType.DAMP: exp.And, 283 TokenType.XOR: exp.Xor, 284 } 285 286 DISJUNCTION = { 287 **parser.Parser.DISJUNCTION, 288 TokenType.DPIPE: exp.Or, 289 } 290 291 TABLE_ALIAS_TOKENS = ( 292 parser.Parser.TABLE_ALIAS_TOKENS - parser.Parser.TABLE_INDEX_HINT_TOKENS 293 ) 294 295 RANGE_PARSERS = { 296 **parser.Parser.RANGE_PARSERS, 297 TokenType.MEMBER_OF: lambda self, this: self.expression( 298 exp.JSONArrayContains, 299 this=this, 300 expression=self._parse_wrapped(self._parse_expression), 301 ), 302 } 303 304 FUNCTIONS = { 305 **parser.Parser.FUNCTIONS, 306 "CONVERT_TZ": lambda args: exp.ConvertTimezone( 307 source_tz=seq_get(args, 1), target_tz=seq_get(args, 2), timestamp=seq_get(args, 0) 308 ), 309 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 310 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 311 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 312 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 313 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 314 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 315 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 316 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 317 "INSTR": lambda args: exp.StrPosition(substr=seq_get(args, 1), this=seq_get(args, 0)), 318 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 319 "ISNULL": isnull_to_is_null, 320 "LOCATE": locate_to_strposition, 321 "MAKETIME": exp.TimeFromParts.from_arg_list, 322 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 323 "MONTHNAME": lambda args: exp.TimeToStr( 324 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 325 format=exp.Literal.string("%B"), 326 ), 327 "STR_TO_DATE": _str_to_date, 328 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 329 "TO_DAYS": lambda args: exp.paren( 330 exp.DateDiff( 331 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 332 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 333 unit=exp.var("DAY"), 334 ) 335 + 1 336 ), 337 "WEEK": lambda args: exp.Week( 338 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 339 ), 340 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 341 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 342 } 343 344 FUNCTION_PARSERS = { 345 **parser.Parser.FUNCTION_PARSERS, 346 "CHAR": lambda self: self._parse_chr(), 347 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 348 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 349 "VALUES": lambda self: self.expression( 350 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 351 ), 352 } 353 354 STATEMENT_PARSERS = { 355 **parser.Parser.STATEMENT_PARSERS, 356 TokenType.SHOW: lambda self: self._parse_show(), 357 } 358 359 SHOW_PARSERS = { 360 "BINARY LOGS": _show_parser("BINARY LOGS"), 361 "MASTER LOGS": _show_parser("BINARY LOGS"), 362 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 363 "CHARACTER SET": _show_parser("CHARACTER SET"), 364 "CHARSET": _show_parser("CHARACTER SET"), 365 "COLLATION": _show_parser("COLLATION"), 366 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 367 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 368 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 369 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 370 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 371 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 372 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 373 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 374 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 375 "DATABASES": _show_parser("DATABASES"), 376 "SCHEMAS": _show_parser("DATABASES"), 377 "ENGINE": _show_parser("ENGINE", target=True), 378 "STORAGE ENGINES": _show_parser("ENGINES"), 379 "ENGINES": _show_parser("ENGINES"), 380 "ERRORS": _show_parser("ERRORS"), 381 "EVENTS": _show_parser("EVENTS"), 382 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 383 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 384 "GRANTS": _show_parser("GRANTS", target="FOR"), 385 "INDEX": _show_parser("INDEX", target="FROM"), 386 "MASTER STATUS": _show_parser("MASTER STATUS"), 387 "OPEN TABLES": _show_parser("OPEN TABLES"), 388 "PLUGINS": _show_parser("PLUGINS"), 389 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 390 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 391 "PRIVILEGES": _show_parser("PRIVILEGES"), 392 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 393 "PROCESSLIST": _show_parser("PROCESSLIST"), 394 "PROFILE": _show_parser("PROFILE"), 395 "PROFILES": _show_parser("PROFILES"), 396 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 397 "REPLICAS": _show_parser("REPLICAS"), 398 "SLAVE HOSTS": _show_parser("REPLICAS"), 399 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 400 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 401 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 402 "SESSION STATUS": _show_parser("STATUS"), 403 "STATUS": _show_parser("STATUS"), 404 "TABLE STATUS": _show_parser("TABLE STATUS"), 405 "FULL TABLES": _show_parser("TABLES", full=True), 406 "TABLES": _show_parser("TABLES"), 407 "TRIGGERS": _show_parser("TRIGGERS"), 408 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 409 "SESSION VARIABLES": _show_parser("VARIABLES"), 410 "VARIABLES": _show_parser("VARIABLES"), 411 "WARNINGS": _show_parser("WARNINGS"), 412 } 413 414 PROPERTY_PARSERS = { 415 **parser.Parser.PROPERTY_PARSERS, 416 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 417 } 418 419 SET_PARSERS = { 420 **parser.Parser.SET_PARSERS, 421 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 422 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 423 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 424 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 425 "NAMES": lambda self: self._parse_set_item_names(), 426 } 427 428 CONSTRAINT_PARSERS = { 429 **parser.Parser.CONSTRAINT_PARSERS, 430 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 431 "INDEX": lambda self: self._parse_index_constraint(), 432 "KEY": lambda self: self._parse_index_constraint(), 433 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 434 } 435 436 ALTER_PARSERS = { 437 **parser.Parser.ALTER_PARSERS, 438 "MODIFY": lambda self: self._parse_alter_table_alter(), 439 } 440 441 SCHEMA_UNNAMED_CONSTRAINTS = { 442 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 443 "FULLTEXT", 444 "INDEX", 445 "KEY", 446 "SPATIAL", 447 } 448 449 PROFILE_TYPES: parser.OPTIONS_TYPE = { 450 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 451 "BLOCK": ("IO",), 452 "CONTEXT": ("SWITCHES",), 453 "PAGE": ("FAULTS",), 454 } 455 456 TYPE_TOKENS = { 457 *parser.Parser.TYPE_TOKENS, 458 TokenType.SET, 459 } 460 461 ENUM_TYPE_TOKENS = { 462 *parser.Parser.ENUM_TYPE_TOKENS, 463 TokenType.SET, 464 } 465 466 LOG_DEFAULTS_TO_LN = True 467 STRING_ALIASES = True 468 VALUES_FOLLOWED_BY_PAREN = False 469 SUPPORTS_PARTITION_SELECTION = True 470 471 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 472 this = self._parse_id_var() 473 if not self._match(TokenType.L_PAREN): 474 return this 475 476 expression = self._parse_number() 477 self._match_r_paren() 478 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 479 480 def _parse_index_constraint( 481 self, kind: t.Optional[str] = None 482 ) -> exp.IndexColumnConstraint: 483 if kind: 484 self._match_texts(("INDEX", "KEY")) 485 486 this = self._parse_id_var(any_token=False) 487 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 488 expressions = self._parse_wrapped_csv(self._parse_ordered) 489 490 options = [] 491 while True: 492 if self._match_text_seq("KEY_BLOCK_SIZE"): 493 self._match(TokenType.EQ) 494 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 495 elif self._match(TokenType.USING): 496 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 497 elif self._match_text_seq("WITH", "PARSER"): 498 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 499 elif self._match(TokenType.COMMENT): 500 opt = exp.IndexConstraintOption(comment=self._parse_string()) 501 elif self._match_text_seq("VISIBLE"): 502 opt = exp.IndexConstraintOption(visible=True) 503 elif self._match_text_seq("INVISIBLE"): 504 opt = exp.IndexConstraintOption(visible=False) 505 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 506 self._match(TokenType.EQ) 507 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 508 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 509 self._match(TokenType.EQ) 510 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 511 else: 512 opt = None 513 514 if not opt: 515 break 516 517 options.append(opt) 518 519 return self.expression( 520 exp.IndexColumnConstraint, 521 this=this, 522 expressions=expressions, 523 kind=kind, 524 index_type=index_type, 525 options=options, 526 ) 527 528 def _parse_show_mysql( 529 self, 530 this: str, 531 target: bool | str = False, 532 full: t.Optional[bool] = None, 533 global_: t.Optional[bool] = None, 534 ) -> exp.Show: 535 if target: 536 if isinstance(target, str): 537 self._match_text_seq(target) 538 target_id = self._parse_id_var() 539 else: 540 target_id = None 541 542 log = self._parse_string() if self._match_text_seq("IN") else None 543 544 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 545 position = self._parse_number() if self._match_text_seq("FROM") else None 546 db = None 547 else: 548 position = None 549 db = None 550 551 if self._match(TokenType.FROM): 552 db = self._parse_id_var() 553 elif self._match(TokenType.DOT): 554 db = target_id 555 target_id = self._parse_id_var() 556 557 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 558 559 like = self._parse_string() if self._match_text_seq("LIKE") else None 560 where = self._parse_where() 561 562 if this == "PROFILE": 563 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 564 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 565 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 566 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 567 else: 568 types, query = None, None 569 offset, limit = self._parse_oldstyle_limit() 570 571 mutex = True if self._match_text_seq("MUTEX") else None 572 mutex = False if self._match_text_seq("STATUS") else mutex 573 574 return self.expression( 575 exp.Show, 576 this=this, 577 target=target_id, 578 full=full, 579 log=log, 580 position=position, 581 db=db, 582 channel=channel, 583 like=like, 584 where=where, 585 types=types, 586 query=query, 587 offset=offset, 588 limit=limit, 589 mutex=mutex, 590 **{"global": global_}, # type: ignore 591 ) 592 593 def _parse_oldstyle_limit( 594 self, 595 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 596 limit = None 597 offset = None 598 if self._match_text_seq("LIMIT"): 599 parts = self._parse_csv(self._parse_number) 600 if len(parts) == 1: 601 limit = parts[0] 602 elif len(parts) == 2: 603 limit = parts[1] 604 offset = parts[0] 605 606 return offset, limit 607 608 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 609 this = self._parse_string() or self._parse_unquoted_field() 610 return self.expression(exp.SetItem, this=this, kind=kind) 611 612 def _parse_set_item_names(self) -> exp.Expression: 613 charset = self._parse_string() or self._parse_unquoted_field() 614 if self._match_text_seq("COLLATE"): 615 collate = self._parse_string() or self._parse_unquoted_field() 616 else: 617 collate = None 618 619 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 620 621 def _parse_type( 622 self, parse_interval: bool = True, fallback_to_identifier: bool = False 623 ) -> t.Optional[exp.Expression]: 624 # mysql binary is special and can work anywhere, even in order by operations 625 # it operates like a no paren func 626 if self._match(TokenType.BINARY, advance=False): 627 data_type = self._parse_types(check_func=True, allow_identifiers=False) 628 629 if isinstance(data_type, exp.DataType): 630 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 631 632 return super()._parse_type( 633 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 634 ) 635 636 def _parse_chr(self) -> t.Optional[exp.Expression]: 637 expressions = self._parse_csv(self._parse_assignment) 638 kwargs: t.Dict[str, t.Any] = {"this": seq_get(expressions, 0)} 639 640 if len(expressions) > 1: 641 kwargs["expressions"] = expressions[1:] 642 643 if self._match(TokenType.USING): 644 kwargs["charset"] = self._parse_var() 645 646 return self.expression(exp.Chr, **kwargs) 647 648 def _parse_group_concat(self) -> t.Optional[exp.Expression]: 649 def concat_exprs( 650 node: t.Optional[exp.Expression], exprs: t.List[exp.Expression] 651 ) -> exp.Expression: 652 if isinstance(node, exp.Distinct) and len(node.expressions) > 1: 653 concat_exprs = [ 654 self.expression(exp.Concat, expressions=node.expressions, safe=True) 655 ] 656 node.set("expressions", concat_exprs) 657 return node 658 if len(exprs) == 1: 659 return exprs[0] 660 return self.expression(exp.Concat, expressions=args, safe=True) 661 662 args = self._parse_csv(self._parse_lambda) 663 664 if args: 665 order = args[-1] if isinstance(args[-1], exp.Order) else None 666 667 if order: 668 # Order By is the last (or only) expression in the list and has consumed the 'expr' before it, 669 # remove 'expr' from exp.Order and add it back to args 670 args[-1] = order.this 671 order.set("this", concat_exprs(order.this, args)) 672 673 this = order or concat_exprs(args[0], args) 674 else: 675 this = None 676 677 separator = self._parse_field() if self._match(TokenType.SEPARATOR) else None 678 679 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.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.INT: 'INT'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ENUM: 'ENUM'>, <TokenType.UINT256: 'UINT256'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.INT128: 'INT128'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.UINT: 'UINT'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.INDEX: 'INDEX'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.DATE32: 'DATE32'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.XOR: 'XOR'>, <TokenType.UINT128: 'UINT128'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.LEFT: 'LEFT'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.YEAR: 'YEAR'>, <TokenType.ALL: 'ALL'>, <TokenType.MONEY: 'MONEY'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.TABLE: 'TABLE'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.IPV4: 'IPV4'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.LIKE: 'LIKE'>, <TokenType.FIRST: 'FIRST'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.JSON: 'JSON'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.VAR: 'VAR'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.INSERT: 'INSERT'>, <TokenType.VALUES: 'VALUES'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.CHAR: 'CHAR'>, <TokenType.TIME: 'TIME'>, <TokenType.ROW: 'ROW'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.XML: 'XML'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.MERGE: 'MERGE'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.ILIKE: 'ILIKE'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.RANGE: 'RANGE'>, <TokenType.JSONB: 'JSONB'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.NULL: 'NULL'>, <TokenType.NAME: 'NAME'>, <TokenType.LIST: 'LIST'>, <TokenType.ANY: 'ANY'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.MAP: 'MAP'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.IPV6: 'IPV6'>, <TokenType.UUID: 'UUID'>, <TokenType.RLIKE: 'RLIKE'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.INET: 'INET'>, <TokenType.PRIMARY_KEY: 'PRIMARY_KEY'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.DATE: 'DATE'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.GLOB: 'GLOB'>, <TokenType.BINARY: 'BINARY'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.INT256: 'INT256'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.SUPER: 'SUPER'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.BIT: 'BIT'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.SOME: 'SOME'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.TEXT: 'TEXT'>, <TokenType.FILTER: 'FILTER'>}
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.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.INT: 'INT'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.FALSE: 'FALSE'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ENUM: 'ENUM'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.ROWS: 'ROWS'>, <TokenType.UINT256: 'UINT256'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.VIEW: 'VIEW'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.COPY: 'COPY'>, <TokenType.INT128: 'INT128'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.UINT: 'UINT'>, <TokenType.IS: 'IS'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.INDEX: 'INDEX'>, <TokenType.FINAL: 'FINAL'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.TRUE: 'TRUE'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.DATE32: 'DATE32'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.DELETE: 'DELETE'>, <TokenType.RENAME: 'RENAME'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.TEXT: 'TEXT'>, <TokenType.UINT128: 'UINT128'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.SHOW: 'SHOW'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.ALL: 'ALL'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.YEAR: 'YEAR'>, <TokenType.MONEY: 'MONEY'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.TABLE: 'TABLE'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.IPV4: 'IPV4'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.FIRST: 'FIRST'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.JSON: 'JSON'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.CUBE: 'CUBE'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.CACHE: 'CACHE'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.VAR: 'VAR'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.CHAR: 'CHAR'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.TIME: 'TIME'>, <TokenType.ROW: 'ROW'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.XML: 'XML'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.MERGE: 'MERGE'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.DIV: 'DIV'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.KEEP: 'KEEP'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.DESC: 'DESC'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.SEMI: 'SEMI'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.RANGE: 'RANGE'>, <TokenType.JSONB: 'JSONB'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.ANTI: 'ANTI'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.TAG: 'TAG'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.KILL: 'KILL'>, <TokenType.NULL: 'NULL'>, <TokenType.NAME: 'NAME'>, <TokenType.LIST: 'LIST'>, <TokenType.NEXT: 'NEXT'>, <TokenType.ANY: 'ANY'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.SET: 'SET'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.MAP: 'MAP'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.IPV6: 'IPV6'>, <TokenType.END: 'END'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.UUID: 'UUID'>, <TokenType.CASE: 'CASE'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.MODEL: 'MODEL'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.INET: 'INET'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.ASC: 'ASC'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.DATE: 'DATE'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.BINARY: 'BINARY'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.INT256: 'INT256'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.SUPER: 'SUPER'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.LOAD: 'LOAD'>, <TokenType.BIT: 'BIT'>, <TokenType.SOME: 'SOME'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.TOP: 'TOP'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.FILTER: 'FILTER'>}
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': <function Parser.<lambda>>, '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'>>, 'CONVERT_TIMEZONE': <function build_convert_timezone>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Datetime'>>, 'DATETIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeAdd'>>, 'DATETIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeDiff'>>, 'DATETIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeSub'>>, 'DATETIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeTrunc'>>, 'DAY': <function MySQL.Parser.<lambda>>, 'DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfMonth'>>, 'DAYOFMONTH': <function MySQL.Parser.<lambda>>, 'DAY_OF_WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfWeek'>>, 'DAYOFWEEK': <function MySQL.Parser.<lambda>>, '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'>>, 'EXPLODING_GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ExplodingGenerateSeries'>>, 'EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Extract'>>, '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': <function Parser.<lambda>>, 'GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GenerateSeries'>>, 'GENERATE_TIMESTAMP_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GenerateTimestampArray'>>, '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_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBContains'>>, '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'>>, 'LIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.List'>>, 'LN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ln'>>, 'LOG': <function build_logarithm>, 'LOGICAL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'BOOL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'BOOLAND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'LOGICAL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'BOOL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'BOOLOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'LOWER': <function build_lower>, 'LCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lower'>>, 'LOWER_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LowerHex'>>, 'MD5': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5'>>, 'MD5_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5Digest'>>, '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'>>, 'OBJECT_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ObjectInsert'>>, 'OPEN_J_S_O_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.OpenJSON'>>, 'PAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pad'>>, 'PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParameterizedAgg'>>, 'PARSE_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'>>, 'STDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDDEV_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevPop'>>, 'STDDEV_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevSamp'>>, 'STR_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrPosition'>>, 'STR_TO_DATE': <function _str_to_date>, 'STR_TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToMap'>>, 'STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToTime'>>, 'STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToUnix'>>, 'STRING_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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Time'>>, 'TIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeAdd'>>, 'TIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeDiff'>>, 'TIME_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'TIMEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'TIME_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToDate'>>, 'TIME_STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToTime'>>, 'TIME_STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToUnix'>>, 'TIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeSub'>>, 'TIME_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeToStr'>>, 'TIME_TO_TIME_STR': <function Parser.<lambda>>, 'TIME_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeToUnix'>>, 'TIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeTrunc'>>, 'TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Timestamp'>>, 'TIMESTAMP_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampAdd'>>, 'TIMESTAMPDIFF': <function build_date_delta.<locals>._builder>, 'TIMESTAMP_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampDiff'>>, 'TIMESTAMP_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampFromParts'>>, 'TIMESTAMPFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampFromParts'>>, 'TIMESTAMP_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampSub'>>, 'TIMESTAMP_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampTrunc'>>, 'TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToArray'>>, 'TO_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'>>, 'UNNEST': <function Parser.<lambda>>, '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>>, 'LPAD': <function Parser.<lambda>>, 'LEFTPAD': <function Parser.<lambda>>, 'MOD': <function build_mod>, 'RPAD': <function Parser.<lambda>>, 'RIGHTPAD': <function Parser.<lambda>>, 'SCOPE_RESOLUTION': <function Parser.<lambda>>, 'TO_HEX': <function build_hex>, 'CONVERT_TZ': <function MySQL.Parser.<lambda>>, '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>>, 'DYNAMIC': <function Parser.<lambda>>, 'DISTKEY': <function Parser.<lambda>>, 'DISTSTYLE': <function Parser.<lambda>>, 'EMPTY': <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>>, 'STREAMING': <function Parser.<lambda>>, 'ROW': <function Parser.<lambda>>, 'ROW_FORMAT': <function Parser.<lambda>>, 'SAMPLE': <function Parser.<lambda>>, 'SECURE': <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>>, 'AS': <function Parser.<lambda>>, 'MODIFY': <function MySQL.Parser.<lambda>>}
SCHEMA_UNNAMED_CONSTRAINTS =
{'FULLTEXT', 'KEY', 'PERIOD', 'EXCLUDE', 'INDEX', 'UNIQUE', 'PRIMARY KEY', 'FOREIGN KEY', 'CHECK', 'LIKE', 'SPATIAL'}
PROFILE_TYPES: Dict[str, Sequence[Union[Sequence[str], str]]] =
{'ALL': (), 'CPU': (), 'IPC': (), 'MEMORY': (), 'SOURCE': (), 'SWAPS': (), 'BLOCK': ('IO',), 'CONTEXT': ('SWITCHES',), 'PAGE': ('FAULTS',)}
TYPE_TOKENS =
{<TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.INT: 'INT'>, <TokenType.TIME: 'TIME'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ENUM: 'ENUM'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.XML: 'XML'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.UINT256: 'UINT256'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.INT128: 'INT128'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.UINT: 'UINT'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.JSONB: 'JSONB'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.DATE32: 'DATE32'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.NULL: 'NULL'>, <TokenType.UINT128: 'UINT128'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.NAME: 'NAME'>, <TokenType.LIST: 'LIST'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.YEAR: 'YEAR'>, <TokenType.MONEY: 'MONEY'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.SET: 'SET'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.IPV6: 'IPV6'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.UUID: 'UUID'>, <TokenType.IPV4: 'IPV4'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.INET: 'INET'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.DATE: 'DATE'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.BINARY: 'BINARY'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.JSON: 'JSON'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.INT256: 'INT256'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.SUPER: 'SUPER'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.BIT: 'BIT'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.CHAR: 'CHAR'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.TEXT: 'TEXT'>, <TokenType.MAP: 'MAP'>}
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
- ALTERABLES
- ID_VAR_TOKENS
- INTERVAL_VARS
- ALIAS_TOKENS
- ARRAY_CONSTRUCTORS
- COMMENT_TABLE_ALIAS_TOKENS
- UPDATE_ALIAS_TOKENS
- TRIM_TYPES
- ASSIGNMENT
- EQUALITY
- COMPARISON
- BITWISE
- TERM
- FACTOR
- EXPONENT
- TIMES
- TIMESTAMPS
- SET_OPERATIONS
- JOIN_METHODS
- JOIN_SIDES
- JOIN_KINDS
- JOIN_HINTS
- LAMBDAS
- COLUMN_OPERATORS
- 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_CONVERTERS
- DDL_SELECT_TOKENS
- PRE_VOLATILE_TOKENS
- TRANSACTION_KIND
- TRANSACTION_CHARACTERISTICS
- CONFLICT_ACTIONS
- CREATE_SEQUENCE
- ISOLATED_LOADING_OPTIONS
- USABLES
- CAST_ACTIONS
- SCHEMA_BINDING_OPTIONS
- KEY_CONSTRAINT_OPTIONS
- INSERT_ALTERNATIVES
- CLONE_KEYWORDS
- HISTORICAL_DATA_PREFIX
- HISTORICAL_DATA_KIND
- OPCLASS_FOLLOW_KEYWORDS
- OPTYPE_FOLLOW_TOKENS
- TABLE_INDEX_HINT_TOKENS
- VIEW_ATTRIBUTES
- WINDOW_ALIAS_TOKENS
- WINDOW_BEFORE_PAREN_TOKENS
- WINDOW_SIDES
- JSON_KEY_VALUE_SEPARATOR_TOKENS
- FETCH_TOKENS
- ADD_CONSTRAINT_TOKENS
- DISTINCT_TOKENS
- NULL_TOKENS
- UNNEST_OFFSET_ALIAS_TOKENS
- SELECT_START_TOKENS
- COPY_INTO_VARLEN_OPTIONS
- 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_SET_OP
- SET_OP_MODIFIERS
- NO_PAREN_IF_COMMANDS
- JSON_ARROWS_REQUIRE_JSON_TYPE
- COLON_IS_VARIANT_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
681 class Generator(generator.Generator): 682 INTERVAL_ALLOWS_PLURAL_FORM = False 683 LOCKING_READS_SUPPORTED = True 684 NULL_ORDERING_SUPPORTED = None 685 JOIN_HINTS = False 686 TABLE_HINTS = True 687 DUPLICATE_KEY_UPDATE_WITH_SET = False 688 QUERY_HINT_SEP = " " 689 VALUES_AS_TABLE = False 690 NVL2_SUPPORTED = False 691 LAST_DAY_SUPPORTS_DATE_PART = False 692 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 693 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 694 JSON_KEY_VALUE_PAIR_SEP = "," 695 SUPPORTS_TO_NUMBER = False 696 PARSE_JSON_NAME = None 697 PAD_FILL_PATTERN_IS_REQUIRED = True 698 WRAP_DERIVED_VALUES = False 699 700 TRANSFORMS = { 701 **generator.Generator.TRANSFORMS, 702 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 703 exp.CurrentDate: no_paren_current_date_sql, 704 exp.DateDiff: _remove_ts_or_ds_to_date( 705 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 706 ), 707 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 708 exp.DateStrToDate: datestrtodate_sql, 709 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 710 exp.DateTrunc: _date_trunc_sql, 711 exp.Day: _remove_ts_or_ds_to_date(), 712 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 713 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 714 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 715 exp.GroupConcat: lambda self, 716 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 717 exp.ILike: no_ilike_sql, 718 exp.JSONExtractScalar: arrow_json_extract_sql, 719 exp.Max: max_or_greatest, 720 exp.Min: min_or_least, 721 exp.Month: _remove_ts_or_ds_to_date(), 722 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 723 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 724 exp.Pivot: no_pivot_sql, 725 exp.Select: transforms.preprocess( 726 [ 727 transforms.eliminate_distinct_on, 728 transforms.eliminate_semi_and_anti_joins, 729 transforms.eliminate_qualify, 730 transforms.eliminate_full_outer_join, 731 ] 732 ), 733 exp.StrPosition: strposition_to_locate_sql, 734 exp.StrToDate: _str_to_date_sql, 735 exp.StrToTime: _str_to_date_sql, 736 exp.Stuff: rename_func("INSERT"), 737 exp.TableSample: no_tablesample_sql, 738 exp.TimeFromParts: rename_func("MAKETIME"), 739 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 740 exp.TimestampDiff: lambda self, e: self.func( 741 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 742 ), 743 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 744 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 745 exp.TimeStrToTime: lambda self, e: self.sql( 746 exp.cast(e.this, exp.DataType.Type.DATETIME, copy=True) 747 ), 748 exp.TimeToStr: _remove_ts_or_ds_to_date( 749 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 750 ), 751 exp.Trim: _trim_sql, 752 exp.TryCast: no_trycast_sql, 753 exp.TsOrDsAdd: date_add_sql("ADD"), 754 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 755 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 756 exp.UnixToTime: _unix_to_time_sql, 757 exp.Unnest: transforms.preprocess( 758 [transforms.unnest_generate_date_array_using_recursive_cte()] 759 ), 760 exp.Week: _remove_ts_or_ds_to_date(), 761 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 762 exp.Year: _remove_ts_or_ds_to_date(), 763 } 764 765 UNSIGNED_TYPE_MAPPING = { 766 exp.DataType.Type.UBIGINT: "BIGINT", 767 exp.DataType.Type.UINT: "INT", 768 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 769 exp.DataType.Type.USMALLINT: "SMALLINT", 770 exp.DataType.Type.UTINYINT: "TINYINT", 771 exp.DataType.Type.UDECIMAL: "DECIMAL", 772 } 773 774 TIMESTAMP_TYPE_MAPPING = { 775 exp.DataType.Type.TIMESTAMP: "DATETIME", 776 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 777 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 778 } 779 780 TYPE_MAPPING = { 781 **generator.Generator.TYPE_MAPPING, 782 **UNSIGNED_TYPE_MAPPING, 783 **TIMESTAMP_TYPE_MAPPING, 784 } 785 786 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 787 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 788 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 789 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 790 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 791 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 792 793 PROPERTIES_LOCATION = { 794 **generator.Generator.PROPERTIES_LOCATION, 795 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 796 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 797 } 798 799 LIMIT_FETCH = "LIMIT" 800 801 LIMIT_ONLY_LITERALS = True 802 803 CHAR_CAST_MAPPING = dict.fromkeys( 804 ( 805 exp.DataType.Type.LONGTEXT, 806 exp.DataType.Type.LONGBLOB, 807 exp.DataType.Type.MEDIUMBLOB, 808 exp.DataType.Type.MEDIUMTEXT, 809 exp.DataType.Type.TEXT, 810 exp.DataType.Type.TINYBLOB, 811 exp.DataType.Type.TINYTEXT, 812 exp.DataType.Type.VARCHAR, 813 ), 814 "CHAR", 815 ) 816 SIGNED_CAST_MAPPING = dict.fromkeys( 817 ( 818 exp.DataType.Type.BIGINT, 819 exp.DataType.Type.BOOLEAN, 820 exp.DataType.Type.INT, 821 exp.DataType.Type.SMALLINT, 822 exp.DataType.Type.TINYINT, 823 exp.DataType.Type.MEDIUMINT, 824 ), 825 "SIGNED", 826 ) 827 828 # MySQL doesn't support many datatypes in cast. 829 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 830 CAST_MAPPING = { 831 **CHAR_CAST_MAPPING, 832 **SIGNED_CAST_MAPPING, 833 exp.DataType.Type.UBIGINT: "UNSIGNED", 834 } 835 836 TIMESTAMP_FUNC_TYPES = { 837 exp.DataType.Type.TIMESTAMPTZ, 838 exp.DataType.Type.TIMESTAMPLTZ, 839 } 840 841 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 842 RESERVED_KEYWORDS = { 843 "accessible", 844 "add", 845 "all", 846 "alter", 847 "analyze", 848 "and", 849 "as", 850 "asc", 851 "asensitive", 852 "before", 853 "between", 854 "bigint", 855 "binary", 856 "blob", 857 "both", 858 "by", 859 "call", 860 "cascade", 861 "case", 862 "change", 863 "char", 864 "character", 865 "check", 866 "collate", 867 "column", 868 "condition", 869 "constraint", 870 "continue", 871 "convert", 872 "create", 873 "cross", 874 "cube", 875 "cume_dist", 876 "current_date", 877 "current_time", 878 "current_timestamp", 879 "current_user", 880 "cursor", 881 "database", 882 "databases", 883 "day_hour", 884 "day_microsecond", 885 "day_minute", 886 "day_second", 887 "dec", 888 "decimal", 889 "declare", 890 "default", 891 "delayed", 892 "delete", 893 "dense_rank", 894 "desc", 895 "describe", 896 "deterministic", 897 "distinct", 898 "distinctrow", 899 "div", 900 "double", 901 "drop", 902 "dual", 903 "each", 904 "else", 905 "elseif", 906 "empty", 907 "enclosed", 908 "escaped", 909 "except", 910 "exists", 911 "exit", 912 "explain", 913 "false", 914 "fetch", 915 "first_value", 916 "float", 917 "float4", 918 "float8", 919 "for", 920 "force", 921 "foreign", 922 "from", 923 "fulltext", 924 "function", 925 "generated", 926 "get", 927 "grant", 928 "group", 929 "grouping", 930 "groups", 931 "having", 932 "high_priority", 933 "hour_microsecond", 934 "hour_minute", 935 "hour_second", 936 "if", 937 "ignore", 938 "in", 939 "index", 940 "infile", 941 "inner", 942 "inout", 943 "insensitive", 944 "insert", 945 "int", 946 "int1", 947 "int2", 948 "int3", 949 "int4", 950 "int8", 951 "integer", 952 "intersect", 953 "interval", 954 "into", 955 "io_after_gtids", 956 "io_before_gtids", 957 "is", 958 "iterate", 959 "join", 960 "json_table", 961 "key", 962 "keys", 963 "kill", 964 "lag", 965 "last_value", 966 "lateral", 967 "lead", 968 "leading", 969 "leave", 970 "left", 971 "like", 972 "limit", 973 "linear", 974 "lines", 975 "load", 976 "localtime", 977 "localtimestamp", 978 "lock", 979 "long", 980 "longblob", 981 "longtext", 982 "loop", 983 "low_priority", 984 "master_bind", 985 "master_ssl_verify_server_cert", 986 "match", 987 "maxvalue", 988 "mediumblob", 989 "mediumint", 990 "mediumtext", 991 "middleint", 992 "minute_microsecond", 993 "minute_second", 994 "mod", 995 "modifies", 996 "natural", 997 "not", 998 "no_write_to_binlog", 999 "nth_value", 1000 "ntile", 1001 "null", 1002 "numeric", 1003 "of", 1004 "on", 1005 "optimize", 1006 "optimizer_costs", 1007 "option", 1008 "optionally", 1009 "or", 1010 "order", 1011 "out", 1012 "outer", 1013 "outfile", 1014 "over", 1015 "partition", 1016 "percent_rank", 1017 "precision", 1018 "primary", 1019 "procedure", 1020 "purge", 1021 "range", 1022 "rank", 1023 "read", 1024 "reads", 1025 "read_write", 1026 "real", 1027 "recursive", 1028 "references", 1029 "regexp", 1030 "release", 1031 "rename", 1032 "repeat", 1033 "replace", 1034 "require", 1035 "resignal", 1036 "restrict", 1037 "return", 1038 "revoke", 1039 "right", 1040 "rlike", 1041 "row", 1042 "rows", 1043 "row_number", 1044 "schema", 1045 "schemas", 1046 "second_microsecond", 1047 "select", 1048 "sensitive", 1049 "separator", 1050 "set", 1051 "show", 1052 "signal", 1053 "smallint", 1054 "spatial", 1055 "specific", 1056 "sql", 1057 "sqlexception", 1058 "sqlstate", 1059 "sqlwarning", 1060 "sql_big_result", 1061 "sql_calc_found_rows", 1062 "sql_small_result", 1063 "ssl", 1064 "starting", 1065 "stored", 1066 "straight_join", 1067 "system", 1068 "table", 1069 "terminated", 1070 "then", 1071 "tinyblob", 1072 "tinyint", 1073 "tinytext", 1074 "to", 1075 "trailing", 1076 "trigger", 1077 "true", 1078 "undo", 1079 "union", 1080 "unique", 1081 "unlock", 1082 "unsigned", 1083 "update", 1084 "usage", 1085 "use", 1086 "using", 1087 "utc_date", 1088 "utc_time", 1089 "utc_timestamp", 1090 "values", 1091 "varbinary", 1092 "varchar", 1093 "varcharacter", 1094 "varying", 1095 "virtual", 1096 "when", 1097 "where", 1098 "while", 1099 "window", 1100 "with", 1101 "write", 1102 "xor", 1103 "year_month", 1104 "zerofill", 1105 } 1106 1107 def array_sql(self, expression: exp.Array) -> str: 1108 self.unsupported("Arrays are not supported by MySQL") 1109 return self.function_fallback_sql(expression) 1110 1111 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1112 self.unsupported("Array operations are not supported by MySQL") 1113 return self.function_fallback_sql(expression) 1114 1115 def dpipe_sql(self, expression: exp.DPipe) -> str: 1116 return self.func("CONCAT", *expression.flatten()) 1117 1118 def extract_sql(self, expression: exp.Extract) -> str: 1119 unit = expression.name 1120 if unit and unit.lower() == "epoch": 1121 return self.func("UNIX_TIMESTAMP", expression.expression) 1122 1123 return super().extract_sql(expression) 1124 1125 def datatype_sql(self, expression: exp.DataType) -> str: 1126 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1127 result = super().datatype_sql(expression) 1128 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1129 result = f"{result} UNSIGNED" 1130 return result 1131 1132 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1133 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1134 1135 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1136 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1137 return self.func("TIMESTAMP", expression.this) 1138 1139 to = self.CAST_MAPPING.get(expression.to.this) 1140 1141 if to: 1142 expression.to.set("this", to) 1143 return super().cast_sql(expression) 1144 1145 def show_sql(self, expression: exp.Show) -> str: 1146 this = f" {expression.name}" 1147 full = " FULL" if expression.args.get("full") else "" 1148 global_ = " GLOBAL" if expression.args.get("global") else "" 1149 1150 target = self.sql(expression, "target") 1151 target = f" {target}" if target else "" 1152 if expression.name in ("COLUMNS", "INDEX"): 1153 target = f" FROM{target}" 1154 elif expression.name == "GRANTS": 1155 target = f" FOR{target}" 1156 1157 db = self._prefixed_sql("FROM", expression, "db") 1158 1159 like = self._prefixed_sql("LIKE", expression, "like") 1160 where = self.sql(expression, "where") 1161 1162 types = self.expressions(expression, key="types") 1163 types = f" {types}" if types else types 1164 query = self._prefixed_sql("FOR QUERY", expression, "query") 1165 1166 if expression.name == "PROFILE": 1167 offset = self._prefixed_sql("OFFSET", expression, "offset") 1168 limit = self._prefixed_sql("LIMIT", expression, "limit") 1169 else: 1170 offset = "" 1171 limit = self._oldstyle_limit_sql(expression) 1172 1173 log = self._prefixed_sql("IN", expression, "log") 1174 position = self._prefixed_sql("FROM", expression, "position") 1175 1176 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1177 1178 if expression.name == "ENGINE": 1179 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1180 else: 1181 mutex_or_status = "" 1182 1183 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1184 1185 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1186 dtype = self.sql(expression, "dtype") 1187 if not dtype: 1188 return super().altercolumn_sql(expression) 1189 1190 this = self.sql(expression, "this") 1191 return f"MODIFY COLUMN {this} {dtype}" 1192 1193 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1194 sql = self.sql(expression, arg) 1195 return f" {prefix} {sql}" if sql else "" 1196 1197 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1198 limit = self.sql(expression, "limit") 1199 offset = self.sql(expression, "offset") 1200 if limit: 1201 limit_offset = f"{offset}, {limit}" if offset else limit 1202 return f" LIMIT {limit_offset}" 1203 return "" 1204 1205 def chr_sql(self, expression: exp.Chr) -> str: 1206 this = self.expressions(sqls=[expression.this] + expression.expressions) 1207 charset = expression.args.get("charset") 1208 using = f" USING {self.sql(charset)}" if charset else "" 1209 return f"CHAR({this}{using})" 1210 1211 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1212 unit = expression.args.get("unit") 1213 1214 # Pick an old-enough date to avoid negative timestamp diffs 1215 start_ts = "'0000-01-01 00:00:00'" 1216 1217 # Source: https://stackoverflow.com/a/32955740 1218 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1219 interval = exp.Interval(this=timestamp_diff, unit=unit) 1220 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1221 1222 return self.sql(dateadd) 1223 1224 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1225 from_tz = expression.args.get("source_tz") 1226 to_tz = expression.args.get("target_tz") 1227 dt = expression.args.get("timestamp") 1228 1229 return self.func("CONVERT_TZ", dt, from_tz, to_tz)
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.ConnectByRoot'>: <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.DynamicProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EmptyProperty'>: <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.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.PivotAny'>: <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.SecureProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SetConfigProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SetProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SettingsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SharingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SqlReadWriteProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SqlSecurityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StabilityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Stream'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StreamingTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StrictProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TemporaryProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TagColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TitleColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ToMap'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ToTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TransformModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TransientProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.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.WithSchemaBindingProperty'>: <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.JSONExtractScalar'>: <function arrow_json_extract_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.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.Unnest'>: <function preprocess.<locals>._to_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.DynamicProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.DistKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DistStyleProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EmptyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.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.SecureProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <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.StreamingTableProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <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.WithSchemaBindingProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <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 =
{'insert', 'mod', 'explain', 'lines', 'int4', 'by', 'float8', 'rename', 'sql_calc_found_rows', 'group', 'usage', 'outfile', 'false', 'current_user', 'double', 'else', 'day_microsecond', 'create', 'dual', 'schemas', 'int', 'year_month', 'resignal', 'key', 'signal', 'character', 'no_write_to_binlog', 'order', 'trailing', 'int1', 'natural', 'sensitive', 'elseif', 'day_minute', 'fulltext', 'rank', 'index', 'tinyint', 'json_table', 'hour_minute', 'with', 'on', 'loop', 'drop', 'int8', 'read', 'range', 'schema', 'then', 'from', 'check', 'tinyblob', 'binary', 'xor', 'char', 'rows', 'day_hour', 'while', 'varying', 'leave', 'primary', 'int2', 'as', 'not', 'lateral', 'spatial', 'integer', 'smallint', 'second_microsecond', 'union', 'reads', 'asensitive', 'generated', 'convert', 'replace', 'select', 'match', 'both', 'float4', 'force', 'procedure', 'show', 'intersect', 'continue', 'between', 'blob', 'fetch', 'use', 'sqlstate', 'change', 'current_date', 'optimize', 'exit', 'grant', 'lock', 'table', 'when', 'repeat', 'current_timestamp', 'hour_microsecond', 'default', 'left', 'mediumtext', 'terminated', 'collate', 'sql_big_result', 'unlock', 'interval', 'get', 'inner', 'set', 'cursor', 'longblob', 'specific', 'option', 'zerofill', 'having', 'minute_microsecond', 'references', 'unique', 'write', 'starting', 'row_number', 'function', 'localtime', 'partition', 'purge', 'dense_rank', 'maxvalue', 'like', 'varchar', 'cume_dist', 'hour_second', 'infile', 'alter', 'except', 'master_ssl_verify_server_cert', 'recursive', 'row', 'dec', 'each', 'out', 'high_priority', 'restrict', 'constraint', 'of', 'lag', 'kill', 'longtext', 'tinytext', 'keys', 'where', 'first_value', 'unsigned', 'or', 'minute_second', 'low_priority', 'right', 'modifies', 'using', 'ignore', 'to', 'varbinary', 'io_before_gtids', 'in', 'io_after_gtids', 'exists', 'iterate', 'cascade', 'grouping', 'numeric', 'revoke', 'for', 'nth_value', 'utc_time', 'window', 'database', 'limit', 'master_bind', 'update', 'long', 'all', 'true', 'databases', 'div', 'enclosed', 'before', 'trigger', 'case', 'null', 'sql_small_result', 'sqlwarning', 'lead', 'day_second', 'return', 'add', 'straight_join', 'desc', 'utc_date', 'linear', 'delayed', 'mediumblob', 'precision', 'over', 'escaped', 'varcharacter', 'ssl', 'groups', 'cross', 'localtimestamp', 'accessible', 'mediumint', 'asc', 'insensitive', 'join', 'inout', 'sql', 'column', 'if', 'cube', 'optimizer_costs', 'condition', 'last_value', 'middleint', 'into', 'ntile', 'utc_timestamp', 'current_time', 'percent_rank', 'undo', 'leading', 'int3', 'outer', 'release', 'system', 'rlike', 'bigint', 'require', 'empty', 'delete', 'decimal', 'analyze', 'read_write', 'declare', 'foreign', 'sqlexception', 'regexp', 'separator', 'and', 'real', 'float', 'describe', 'deterministic', 'is', 'load', 'distinctrow', 'values', 'optionally', 'virtual', 'call', 'distinct', 'stored'}
def
cast_sql( self, expression: sqlglot.expressions.Cast, safe_prefix: Optional[str] = None) -> str:
1135 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1136 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1137 return self.func("TIMESTAMP", expression.this) 1138 1139 to = self.CAST_MAPPING.get(expression.to.this) 1140 1141 if to: 1142 expression.to.set("this", to) 1143 return super().cast_sql(expression)
1145 def show_sql(self, expression: exp.Show) -> str: 1146 this = f" {expression.name}" 1147 full = " FULL" if expression.args.get("full") else "" 1148 global_ = " GLOBAL" if expression.args.get("global") else "" 1149 1150 target = self.sql(expression, "target") 1151 target = f" {target}" if target else "" 1152 if expression.name in ("COLUMNS", "INDEX"): 1153 target = f" FROM{target}" 1154 elif expression.name == "GRANTS": 1155 target = f" FOR{target}" 1156 1157 db = self._prefixed_sql("FROM", expression, "db") 1158 1159 like = self._prefixed_sql("LIKE", expression, "like") 1160 where = self.sql(expression, "where") 1161 1162 types = self.expressions(expression, key="types") 1163 types = f" {types}" if types else types 1164 query = self._prefixed_sql("FOR QUERY", expression, "query") 1165 1166 if expression.name == "PROFILE": 1167 offset = self._prefixed_sql("OFFSET", expression, "offset") 1168 limit = self._prefixed_sql("LIMIT", expression, "limit") 1169 else: 1170 offset = "" 1171 limit = self._oldstyle_limit_sql(expression) 1172 1173 log = self._prefixed_sql("IN", expression, "log") 1174 position = self._prefixed_sql("FROM", expression, "position") 1175 1176 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1177 1178 if expression.name == "ENGINE": 1179 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1180 else: 1181 mutex_or_status = "" 1182 1183 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}"
1211 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1212 unit = expression.args.get("unit") 1213 1214 # Pick an old-enough date to avoid negative timestamp diffs 1215 start_ts = "'0000-01-01 00:00:00'" 1216 1217 # Source: https://stackoverflow.com/a/32955740 1218 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1219 interval = exp.Interval(this=timestamp_diff, unit=unit) 1220 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1221 1222 return self.sql(dateadd)
AFTER_HAVING_MODIFIER_TRANSFORMS =
{'windows': <function Generator.<lambda>>, 'qualify': <function Generator.<lambda>>}
Inherited Members
- sqlglot.generator.Generator
- Generator
- IGNORE_NULLS_IN_FUNC
- EXPLICIT_SET_OP
- CREATE_FUNCTION_RETURN_AS
- MATCHED_BY_SOURCE
- SINGLE_STRING_INTERVAL
- RENAME_TABLE_WITH_DB
- GROUPINGS_SEP
- INDEX_ON
- QUERY_HINTS
- IS_BOOL_ALLOWED
- LIMIT_IS_TOP
- RETURNING_END
- EXTRACT_ALLOWS_QUOTES
- TZ_TO_WITH_TIME_ZONE
- ALTER_TABLE_INCLUDE_COLUMN_KEYWORD
- UNNEST_WITH_ORDINALITY
- AGGREGATE_FILTER_SUPPORTED
- SEMI_ANTI_JOIN_WITH_SIDE
- COMPUTED_COLUMN_WITH_TYPE
- SUPPORTS_TABLE_COPY
- TABLESAMPLE_REQUIRES_PARENS
- TABLESAMPLE_SIZE_IS_ROWS
- TABLESAMPLE_KEYWORDS
- TABLESAMPLE_WITH_METHOD
- TABLESAMPLE_SEED_KEYWORD
- COLLATE_IS_FUNC
- DATA_TYPE_SPECIFIERS_ALLOWED
- ENSURE_BOOLS
- CTE_RECURSIVE_KEYWORD_REQUIRED
- SUPPORTS_SINGLE_ARG_CONCAT
- SUPPORTS_TABLE_ALIAS_COLUMNS
- UNPIVOT_ALIASES_ARE_IDENTIFIERS
- INSERT_OVERWRITE
- SUPPORTS_SELECT_INTO
- SUPPORTS_UNLOGGED_TABLES
- SUPPORTS_CREATE_TABLE_LIKE
- LIKE_PROPERTY_INSIDE_SCHEMA
- MULTI_ARG_DISTINCT
- JSON_PATH_SINGLE_QUOTE_ESCAPE
- SUPPORTED_JSON_PATH_PARTS
- CAN_IMPLEMENT_ARRAY_ANY
- SET_OP_MODIFIERS
- COPY_PARAMS_ARE_WRAPPED
- COPY_PARAMS_EQ_REQUIRED
- COPY_HAS_INTO_KEYWORD
- STAR_EXCEPT
- HEX_FUNC
- WITH_PROPERTIES_PREFIX
- QUOTE_JSON_PATH
- SUPPORTS_EXPLODING_PROJECTIONS
- ARRAY_CONCAT_IS_VAR_LEN
- SUPPORTS_CONVERT_TIMEZONE
- 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
- options_modifier
- 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
- 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
- alter_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
- struct_sql
- partitionrange_sql
- truncatetable_sql
- convert_sql
- copyparameter_sql
- credentials_sql
- copy_sql
- semicolon_sql
- datadeletionproperty_sql
- maskingpolicycolumnconstraint_sql
- gapfill_sql
- scope_resolution
- scoperesolution_sql
- parsejson_sql
- rand_sql
- changes_sql
- pad_sql
- summarize_sql
- explodinggenerateseries_sql
- arrayconcat_sql