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