sqlglot.dialects.mysql
1from __future__ import annotations 2 3import typing as t 4 5from sqlglot import exp, generator, parser, tokens, transforms 6from sqlglot.dialects.dialect import ( 7 Dialect, 8 NormalizationStrategy, 9 arrow_json_extract_sql, 10 date_add_interval_sql, 11 datestrtodate_sql, 12 build_formatted_time, 13 isnull_to_is_null, 14 locate_to_strposition, 15 max_or_greatest, 16 min_or_least, 17 no_ilike_sql, 18 no_paren_current_date_sql, 19 no_pivot_sql, 20 no_tablesample_sql, 21 no_trycast_sql, 22 build_date_delta, 23 build_date_delta_with_interval, 24 rename_func, 25 strposition_to_locate_sql, 26 unit_to_var, 27 trim_sql, 28 timestrtotime_sql, 29) 30from sqlglot.helper import seq_get 31from sqlglot.tokens import TokenType 32 33 34def _show_parser(*args: t.Any, **kwargs: t.Any) -> t.Callable[[MySQL.Parser], exp.Show]: 35 def _parse(self: MySQL.Parser) -> exp.Show: 36 return self._parse_show_mysql(*args, **kwargs) 37 38 return _parse 39 40 41def _date_trunc_sql(self: MySQL.Generator, expression: exp.DateTrunc) -> str: 42 expr = self.sql(expression, "this") 43 unit = expression.text("unit").upper() 44 45 if unit == "WEEK": 46 concat = f"CONCAT(YEAR({expr}), ' ', WEEK({expr}, 1), ' 1')" 47 date_format = "%Y %u %w" 48 elif unit == "MONTH": 49 concat = f"CONCAT(YEAR({expr}), ' ', MONTH({expr}), ' 1')" 50 date_format = "%Y %c %e" 51 elif unit == "QUARTER": 52 concat = f"CONCAT(YEAR({expr}), ' ', QUARTER({expr}) * 3 - 2, ' 1')" 53 date_format = "%Y %c %e" 54 elif unit == "YEAR": 55 concat = f"CONCAT(YEAR({expr}), ' 1 1')" 56 date_format = "%Y %c %e" 57 else: 58 if unit != "DAY": 59 self.unsupported(f"Unexpected interval unit: {unit}") 60 return self.func("DATE", expr) 61 62 return self.func("STR_TO_DATE", concat, f"'{date_format}'") 63 64 65# All specifiers for time parts (as opposed to date parts) 66# https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format 67TIME_SPECIFIERS = {"f", "H", "h", "I", "i", "k", "l", "p", "r", "S", "s", "T"} 68 69 70def _has_time_specifier(date_format: str) -> bool: 71 i = 0 72 length = len(date_format) 73 74 while i < length: 75 if date_format[i] == "%": 76 i += 1 77 if i < length and date_format[i] in TIME_SPECIFIERS: 78 return True 79 i += 1 80 return False 81 82 83def _str_to_date(args: t.List) -> exp.StrToDate | exp.StrToTime: 84 mysql_date_format = seq_get(args, 1) 85 date_format = MySQL.format_time(mysql_date_format) 86 this = seq_get(args, 0) 87 88 if mysql_date_format and _has_time_specifier(mysql_date_format.name): 89 return exp.StrToTime(this=this, format=date_format) 90 91 return exp.StrToDate(this=this, format=date_format) 92 93 94def _str_to_date_sql( 95 self: MySQL.Generator, expression: exp.StrToDate | exp.StrToTime | exp.TsOrDsToDate 96) -> str: 97 return self.func("STR_TO_DATE", expression.this, self.format_time(expression)) 98 99 100def _unix_to_time_sql(self: MySQL.Generator, expression: exp.UnixToTime) -> str: 101 scale = expression.args.get("scale") 102 timestamp = expression.this 103 104 if scale in (None, exp.UnixToTime.SECONDS): 105 return self.func("FROM_UNIXTIME", timestamp, self.format_time(expression)) 106 107 return self.func( 108 "FROM_UNIXTIME", 109 exp.Div(this=timestamp, expression=exp.func("POW", 10, scale)), 110 self.format_time(expression), 111 ) 112 113 114def date_add_sql( 115 kind: str, 116) -> t.Callable[[generator.Generator, exp.Expression], str]: 117 def func(self: generator.Generator, expression: exp.Expression) -> str: 118 return self.func( 119 f"DATE_{kind}", 120 expression.this, 121 exp.Interval(this=expression.expression, unit=unit_to_var(expression)), 122 ) 123 124 return func 125 126 127def _ts_or_ds_to_date_sql(self: MySQL.Generator, expression: exp.TsOrDsToDate) -> str: 128 time_format = expression.args.get("format") 129 return _str_to_date_sql(self, expression) if time_format else self.func("DATE", expression.this) 130 131 132def _remove_ts_or_ds_to_date( 133 to_sql: t.Optional[t.Callable[[MySQL.Generator, exp.Expression], str]] = None, 134 args: t.Tuple[str, ...] = ("this",), 135) -> t.Callable[[MySQL.Generator, exp.Func], str]: 136 def func(self: MySQL.Generator, expression: exp.Func) -> str: 137 for arg_key in args: 138 arg = expression.args.get(arg_key) 139 if isinstance(arg, exp.TsOrDsToDate) and not arg.args.get("format"): 140 expression.set(arg_key, arg.this) 141 142 return to_sql(self, expression) if to_sql else self.function_fallback_sql(expression) 143 144 return func 145 146 147class MySQL(Dialect): 148 # https://dev.mysql.com/doc/refman/8.0/en/identifiers.html 149 IDENTIFIERS_CAN_START_WITH_DIGIT = True 150 151 # We default to treating all identifiers as case-sensitive, since it matches MySQL's 152 # behavior on Linux systems. For MacOS and Windows systems, one can override this 153 # setting by specifying `dialect="mysql, normalization_strategy = lowercase"`. 154 # 155 # See also https://dev.mysql.com/doc/refman/8.2/en/identifier-case-sensitivity.html 156 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_SENSITIVE 157 158 TIME_FORMAT = "'%Y-%m-%d %T'" 159 DPIPE_IS_STRING_CONCAT = False 160 SUPPORTS_USER_DEFINED_TYPES = False 161 SUPPORTS_SEMI_ANTI_JOIN = False 162 SAFE_DIVISION = True 163 164 # https://prestodb.io/docs/current/functions/datetime.html#mysql-date-functions 165 TIME_MAPPING = { 166 "%M": "%B", 167 "%c": "%-m", 168 "%e": "%-d", 169 "%h": "%I", 170 "%i": "%M", 171 "%s": "%S", 172 "%u": "%W", 173 "%k": "%-H", 174 "%l": "%-I", 175 "%T": "%H:%M:%S", 176 "%W": "%A", 177 } 178 179 class Tokenizer(tokens.Tokenizer): 180 QUOTES = ["'", '"'] 181 COMMENTS = ["--", "#", ("/*", "*/")] 182 IDENTIFIERS = ["`"] 183 STRING_ESCAPES = ["'", '"', "\\"] 184 BIT_STRINGS = [("b'", "'"), ("B'", "'"), ("0b", "")] 185 HEX_STRINGS = [("x'", "'"), ("X'", "'"), ("0x", "")] 186 187 KEYWORDS = { 188 **tokens.Tokenizer.KEYWORDS, 189 "CHARSET": TokenType.CHARACTER_SET, 190 "FORCE": TokenType.FORCE, 191 "IGNORE": TokenType.IGNORE, 192 "KEY": TokenType.KEY, 193 "LOCK TABLES": TokenType.COMMAND, 194 "LONGBLOB": TokenType.LONGBLOB, 195 "LONGTEXT": TokenType.LONGTEXT, 196 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 197 "TINYBLOB": TokenType.TINYBLOB, 198 "TINYTEXT": TokenType.TINYTEXT, 199 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 200 "MEDIUMINT": TokenType.MEDIUMINT, 201 "MEMBER OF": TokenType.MEMBER_OF, 202 "SEPARATOR": TokenType.SEPARATOR, 203 "START": TokenType.BEGIN, 204 "SIGNED": TokenType.BIGINT, 205 "SIGNED INTEGER": TokenType.BIGINT, 206 "UNLOCK TABLES": TokenType.COMMAND, 207 "UNSIGNED": TokenType.UBIGINT, 208 "UNSIGNED INTEGER": TokenType.UBIGINT, 209 "YEAR": TokenType.YEAR, 210 "_ARMSCII8": TokenType.INTRODUCER, 211 "_ASCII": TokenType.INTRODUCER, 212 "_BIG5": TokenType.INTRODUCER, 213 "_BINARY": TokenType.INTRODUCER, 214 "_CP1250": TokenType.INTRODUCER, 215 "_CP1251": TokenType.INTRODUCER, 216 "_CP1256": TokenType.INTRODUCER, 217 "_CP1257": TokenType.INTRODUCER, 218 "_CP850": TokenType.INTRODUCER, 219 "_CP852": TokenType.INTRODUCER, 220 "_CP866": TokenType.INTRODUCER, 221 "_CP932": TokenType.INTRODUCER, 222 "_DEC8": TokenType.INTRODUCER, 223 "_EUCJPMS": TokenType.INTRODUCER, 224 "_EUCKR": TokenType.INTRODUCER, 225 "_GB18030": TokenType.INTRODUCER, 226 "_GB2312": TokenType.INTRODUCER, 227 "_GBK": TokenType.INTRODUCER, 228 "_GEOSTD8": TokenType.INTRODUCER, 229 "_GREEK": TokenType.INTRODUCER, 230 "_HEBREW": TokenType.INTRODUCER, 231 "_HP8": TokenType.INTRODUCER, 232 "_KEYBCS2": TokenType.INTRODUCER, 233 "_KOI8R": TokenType.INTRODUCER, 234 "_KOI8U": TokenType.INTRODUCER, 235 "_LATIN1": TokenType.INTRODUCER, 236 "_LATIN2": TokenType.INTRODUCER, 237 "_LATIN5": TokenType.INTRODUCER, 238 "_LATIN7": TokenType.INTRODUCER, 239 "_MACCE": TokenType.INTRODUCER, 240 "_MACROMAN": TokenType.INTRODUCER, 241 "_SJIS": TokenType.INTRODUCER, 242 "_SWE7": TokenType.INTRODUCER, 243 "_TIS620": TokenType.INTRODUCER, 244 "_UCS2": TokenType.INTRODUCER, 245 "_UJIS": TokenType.INTRODUCER, 246 # https://dev.mysql.com/doc/refman/8.0/en/string-literals.html 247 "_UTF8": TokenType.INTRODUCER, 248 "_UTF16": TokenType.INTRODUCER, 249 "_UTF16LE": TokenType.INTRODUCER, 250 "_UTF32": TokenType.INTRODUCER, 251 "_UTF8MB3": TokenType.INTRODUCER, 252 "_UTF8MB4": TokenType.INTRODUCER, 253 "@@": TokenType.SESSION_PARAMETER, 254 } 255 256 COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.REPLACE} - {TokenType.SHOW} 257 258 class Parser(parser.Parser): 259 FUNC_TOKENS = { 260 *parser.Parser.FUNC_TOKENS, 261 TokenType.DATABASE, 262 TokenType.SCHEMA, 263 TokenType.VALUES, 264 } 265 266 CONJUNCTION = { 267 **parser.Parser.CONJUNCTION, 268 TokenType.DAMP: exp.And, 269 TokenType.XOR: exp.Xor, 270 } 271 272 DISJUNCTION = { 273 **parser.Parser.DISJUNCTION, 274 TokenType.DPIPE: exp.Or, 275 } 276 277 TABLE_ALIAS_TOKENS = ( 278 parser.Parser.TABLE_ALIAS_TOKENS - parser.Parser.TABLE_INDEX_HINT_TOKENS 279 ) 280 281 RANGE_PARSERS = { 282 **parser.Parser.RANGE_PARSERS, 283 TokenType.MEMBER_OF: lambda self, this: self.expression( 284 exp.JSONArrayContains, 285 this=this, 286 expression=self._parse_wrapped(self._parse_expression), 287 ), 288 } 289 290 FUNCTIONS = { 291 **parser.Parser.FUNCTIONS, 292 "CONVERT_TZ": lambda args: exp.ConvertTimezone( 293 source_tz=seq_get(args, 1), target_tz=seq_get(args, 2), timestamp=seq_get(args, 0) 294 ), 295 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 296 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 297 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 298 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 299 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 300 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 301 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 302 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 303 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 304 "ISNULL": isnull_to_is_null, 305 "LOCATE": locate_to_strposition, 306 "MAKETIME": exp.TimeFromParts.from_arg_list, 307 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 308 "MONTHNAME": lambda args: exp.TimeToStr( 309 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 310 format=exp.Literal.string("%B"), 311 ), 312 "STR_TO_DATE": _str_to_date, 313 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 314 "TO_DAYS": lambda args: exp.paren( 315 exp.DateDiff( 316 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 317 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 318 unit=exp.var("DAY"), 319 ) 320 + 1 321 ), 322 "WEEK": lambda args: exp.Week( 323 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 324 ), 325 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 326 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 327 } 328 329 FUNCTION_PARSERS = { 330 **parser.Parser.FUNCTION_PARSERS, 331 "CHAR": lambda self: self.expression( 332 exp.Chr, 333 expressions=self._parse_csv(self._parse_assignment), 334 charset=self._match(TokenType.USING) and self._parse_var(), 335 ), 336 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 337 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 338 "VALUES": lambda self: self.expression( 339 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 340 ), 341 "JSON_VALUE": lambda self: self._parse_json_value(), 342 } 343 344 STATEMENT_PARSERS = { 345 **parser.Parser.STATEMENT_PARSERS, 346 TokenType.SHOW: lambda self: self._parse_show(), 347 } 348 349 SHOW_PARSERS = { 350 "BINARY LOGS": _show_parser("BINARY LOGS"), 351 "MASTER LOGS": _show_parser("BINARY LOGS"), 352 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 353 "CHARACTER SET": _show_parser("CHARACTER SET"), 354 "CHARSET": _show_parser("CHARACTER SET"), 355 "COLLATION": _show_parser("COLLATION"), 356 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 357 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 358 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 359 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 360 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 361 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 362 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 363 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 364 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 365 "DATABASES": _show_parser("DATABASES"), 366 "SCHEMAS": _show_parser("DATABASES"), 367 "ENGINE": _show_parser("ENGINE", target=True), 368 "STORAGE ENGINES": _show_parser("ENGINES"), 369 "ENGINES": _show_parser("ENGINES"), 370 "ERRORS": _show_parser("ERRORS"), 371 "EVENTS": _show_parser("EVENTS"), 372 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 373 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 374 "GRANTS": _show_parser("GRANTS", target="FOR"), 375 "INDEX": _show_parser("INDEX", target="FROM"), 376 "MASTER STATUS": _show_parser("MASTER STATUS"), 377 "OPEN TABLES": _show_parser("OPEN TABLES"), 378 "PLUGINS": _show_parser("PLUGINS"), 379 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 380 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 381 "PRIVILEGES": _show_parser("PRIVILEGES"), 382 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 383 "PROCESSLIST": _show_parser("PROCESSLIST"), 384 "PROFILE": _show_parser("PROFILE"), 385 "PROFILES": _show_parser("PROFILES"), 386 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 387 "REPLICAS": _show_parser("REPLICAS"), 388 "SLAVE HOSTS": _show_parser("REPLICAS"), 389 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 390 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 391 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 392 "SESSION STATUS": _show_parser("STATUS"), 393 "STATUS": _show_parser("STATUS"), 394 "TABLE STATUS": _show_parser("TABLE STATUS"), 395 "FULL TABLES": _show_parser("TABLES", full=True), 396 "TABLES": _show_parser("TABLES"), 397 "TRIGGERS": _show_parser("TRIGGERS"), 398 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 399 "SESSION VARIABLES": _show_parser("VARIABLES"), 400 "VARIABLES": _show_parser("VARIABLES"), 401 "WARNINGS": _show_parser("WARNINGS"), 402 } 403 404 PROPERTY_PARSERS = { 405 **parser.Parser.PROPERTY_PARSERS, 406 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 407 } 408 409 SET_PARSERS = { 410 **parser.Parser.SET_PARSERS, 411 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 412 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 413 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 414 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 415 "NAMES": lambda self: self._parse_set_item_names(), 416 } 417 418 CONSTRAINT_PARSERS = { 419 **parser.Parser.CONSTRAINT_PARSERS, 420 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 421 "INDEX": lambda self: self._parse_index_constraint(), 422 "KEY": lambda self: self._parse_index_constraint(), 423 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 424 } 425 426 ALTER_PARSERS = { 427 **parser.Parser.ALTER_PARSERS, 428 "MODIFY": lambda self: self._parse_alter_table_alter(), 429 } 430 431 SCHEMA_UNNAMED_CONSTRAINTS = { 432 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 433 "FULLTEXT", 434 "INDEX", 435 "KEY", 436 "SPATIAL", 437 } 438 439 PROFILE_TYPES: parser.OPTIONS_TYPE = { 440 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 441 "BLOCK": ("IO",), 442 "CONTEXT": ("SWITCHES",), 443 "PAGE": ("FAULTS",), 444 } 445 446 TYPE_TOKENS = { 447 *parser.Parser.TYPE_TOKENS, 448 TokenType.SET, 449 } 450 451 ENUM_TYPE_TOKENS = { 452 *parser.Parser.ENUM_TYPE_TOKENS, 453 TokenType.SET, 454 } 455 456 LOG_DEFAULTS_TO_LN = True 457 STRING_ALIASES = True 458 VALUES_FOLLOWED_BY_PAREN = False 459 SUPPORTS_PARTITION_SELECTION = True 460 461 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 462 this = self._parse_id_var() 463 if not self._match(TokenType.L_PAREN): 464 return this 465 466 expression = self._parse_number() 467 self._match_r_paren() 468 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 469 470 def _parse_index_constraint( 471 self, kind: t.Optional[str] = None 472 ) -> exp.IndexColumnConstraint: 473 if kind: 474 self._match_texts(("INDEX", "KEY")) 475 476 this = self._parse_id_var(any_token=False) 477 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 478 expressions = self._parse_wrapped_csv(self._parse_ordered) 479 480 options = [] 481 while True: 482 if self._match_text_seq("KEY_BLOCK_SIZE"): 483 self._match(TokenType.EQ) 484 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 485 elif self._match(TokenType.USING): 486 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 487 elif self._match_text_seq("WITH", "PARSER"): 488 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 489 elif self._match(TokenType.COMMENT): 490 opt = exp.IndexConstraintOption(comment=self._parse_string()) 491 elif self._match_text_seq("VISIBLE"): 492 opt = exp.IndexConstraintOption(visible=True) 493 elif self._match_text_seq("INVISIBLE"): 494 opt = exp.IndexConstraintOption(visible=False) 495 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 496 self._match(TokenType.EQ) 497 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 498 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 499 self._match(TokenType.EQ) 500 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 501 else: 502 opt = None 503 504 if not opt: 505 break 506 507 options.append(opt) 508 509 return self.expression( 510 exp.IndexColumnConstraint, 511 this=this, 512 expressions=expressions, 513 kind=kind, 514 index_type=index_type, 515 options=options, 516 ) 517 518 def _parse_show_mysql( 519 self, 520 this: str, 521 target: bool | str = False, 522 full: t.Optional[bool] = None, 523 global_: t.Optional[bool] = None, 524 ) -> exp.Show: 525 if target: 526 if isinstance(target, str): 527 self._match_text_seq(target) 528 target_id = self._parse_id_var() 529 else: 530 target_id = None 531 532 log = self._parse_string() if self._match_text_seq("IN") else None 533 534 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 535 position = self._parse_number() if self._match_text_seq("FROM") else None 536 db = None 537 else: 538 position = None 539 db = None 540 541 if self._match(TokenType.FROM): 542 db = self._parse_id_var() 543 elif self._match(TokenType.DOT): 544 db = target_id 545 target_id = self._parse_id_var() 546 547 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 548 549 like = self._parse_string() if self._match_text_seq("LIKE") else None 550 where = self._parse_where() 551 552 if this == "PROFILE": 553 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 554 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 555 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 556 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 557 else: 558 types, query = None, None 559 offset, limit = self._parse_oldstyle_limit() 560 561 mutex = True if self._match_text_seq("MUTEX") else None 562 mutex = False if self._match_text_seq("STATUS") else mutex 563 564 return self.expression( 565 exp.Show, 566 this=this, 567 target=target_id, 568 full=full, 569 log=log, 570 position=position, 571 db=db, 572 channel=channel, 573 like=like, 574 where=where, 575 types=types, 576 query=query, 577 offset=offset, 578 limit=limit, 579 mutex=mutex, 580 **{"global": global_}, # type: ignore 581 ) 582 583 def _parse_oldstyle_limit( 584 self, 585 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 586 limit = None 587 offset = None 588 if self._match_text_seq("LIMIT"): 589 parts = self._parse_csv(self._parse_number) 590 if len(parts) == 1: 591 limit = parts[0] 592 elif len(parts) == 2: 593 limit = parts[1] 594 offset = parts[0] 595 596 return offset, limit 597 598 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 599 this = self._parse_string() or self._parse_unquoted_field() 600 return self.expression(exp.SetItem, this=this, kind=kind) 601 602 def _parse_set_item_names(self) -> exp.Expression: 603 charset = self._parse_string() or self._parse_unquoted_field() 604 if self._match_text_seq("COLLATE"): 605 collate = self._parse_string() or self._parse_unquoted_field() 606 else: 607 collate = None 608 609 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 610 611 def _parse_type( 612 self, parse_interval: bool = True, fallback_to_identifier: bool = False 613 ) -> t.Optional[exp.Expression]: 614 # mysql binary is special and can work anywhere, even in order by operations 615 # it operates like a no paren func 616 if self._match(TokenType.BINARY, advance=False): 617 data_type = self._parse_types(check_func=True, allow_identifiers=False) 618 619 if isinstance(data_type, exp.DataType): 620 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 621 622 return super()._parse_type( 623 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 624 ) 625 626 def _parse_group_concat(self) -> t.Optional[exp.Expression]: 627 def concat_exprs( 628 node: t.Optional[exp.Expression], exprs: t.List[exp.Expression] 629 ) -> exp.Expression: 630 if isinstance(node, exp.Distinct) and len(node.expressions) > 1: 631 concat_exprs = [ 632 self.expression(exp.Concat, expressions=node.expressions, safe=True) 633 ] 634 node.set("expressions", concat_exprs) 635 return node 636 if len(exprs) == 1: 637 return exprs[0] 638 return self.expression(exp.Concat, expressions=args, safe=True) 639 640 args = self._parse_csv(self._parse_lambda) 641 642 if args: 643 order = args[-1] if isinstance(args[-1], exp.Order) else None 644 645 if order: 646 # Order By is the last (or only) expression in the list and has consumed the 'expr' before it, 647 # remove 'expr' from exp.Order and add it back to args 648 args[-1] = order.this 649 order.set("this", concat_exprs(order.this, args)) 650 651 this = order or concat_exprs(args[0], args) 652 else: 653 this = None 654 655 separator = self._parse_field() if self._match(TokenType.SEPARATOR) else None 656 657 return self.expression(exp.GroupConcat, this=this, separator=separator) 658 659 def _parse_json_value(self) -> exp.JSONValue: 660 this = self._parse_bitwise() 661 self._match(TokenType.COMMA) 662 path = self._parse_bitwise() 663 664 returning = self._match(TokenType.RETURNING) and self._parse_type() 665 666 return self.expression( 667 exp.JSONValue, 668 this=this, 669 path=self.dialect.to_json_path(path), 670 returning=returning, 671 on_condition=self._parse_on_condition(), 672 ) 673 674 class Generator(generator.Generator): 675 INTERVAL_ALLOWS_PLURAL_FORM = False 676 LOCKING_READS_SUPPORTED = True 677 NULL_ORDERING_SUPPORTED = None 678 JOIN_HINTS = False 679 TABLE_HINTS = True 680 DUPLICATE_KEY_UPDATE_WITH_SET = False 681 QUERY_HINT_SEP = " " 682 VALUES_AS_TABLE = False 683 NVL2_SUPPORTED = False 684 LAST_DAY_SUPPORTS_DATE_PART = False 685 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 686 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 687 JSON_KEY_VALUE_PAIR_SEP = "," 688 SUPPORTS_TO_NUMBER = False 689 PARSE_JSON_NAME: t.Optional[str] = None 690 PAD_FILL_PATTERN_IS_REQUIRED = True 691 WRAP_DERIVED_VALUES = False 692 VARCHAR_REQUIRES_SIZE = True 693 694 TRANSFORMS = { 695 **generator.Generator.TRANSFORMS, 696 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 697 exp.CurrentDate: no_paren_current_date_sql, 698 exp.DateDiff: _remove_ts_or_ds_to_date( 699 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 700 ), 701 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 702 exp.DateStrToDate: datestrtodate_sql, 703 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 704 exp.DateTrunc: _date_trunc_sql, 705 exp.Day: _remove_ts_or_ds_to_date(), 706 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 707 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 708 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 709 exp.GroupConcat: lambda self, 710 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 711 exp.ILike: no_ilike_sql, 712 exp.JSONExtractScalar: arrow_json_extract_sql, 713 exp.Max: max_or_greatest, 714 exp.Min: min_or_least, 715 exp.Month: _remove_ts_or_ds_to_date(), 716 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 717 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 718 exp.Pivot: no_pivot_sql, 719 exp.Select: transforms.preprocess( 720 [ 721 transforms.eliminate_distinct_on, 722 transforms.eliminate_semi_and_anti_joins, 723 transforms.eliminate_qualify, 724 transforms.eliminate_full_outer_join, 725 transforms.unnest_generate_date_array_using_recursive_cte, 726 ] 727 ), 728 exp.StrPosition: strposition_to_locate_sql, 729 exp.StrToDate: _str_to_date_sql, 730 exp.StrToTime: _str_to_date_sql, 731 exp.Stuff: rename_func("INSERT"), 732 exp.TableSample: no_tablesample_sql, 733 exp.TimeFromParts: rename_func("MAKETIME"), 734 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 735 exp.TimestampDiff: lambda self, e: self.func( 736 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 737 ), 738 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 739 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 740 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 741 self, 742 e, 743 include_precision=not e.args.get("zone"), 744 ), 745 exp.TimeToStr: _remove_ts_or_ds_to_date( 746 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 747 ), 748 exp.Trim: trim_sql, 749 exp.TryCast: no_trycast_sql, 750 exp.TsOrDsAdd: date_add_sql("ADD"), 751 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 752 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 753 exp.UnixToTime: _unix_to_time_sql, 754 exp.Week: _remove_ts_or_ds_to_date(), 755 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 756 exp.Year: _remove_ts_or_ds_to_date(), 757 } 758 759 UNSIGNED_TYPE_MAPPING = { 760 exp.DataType.Type.UBIGINT: "BIGINT", 761 exp.DataType.Type.UINT: "INT", 762 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 763 exp.DataType.Type.USMALLINT: "SMALLINT", 764 exp.DataType.Type.UTINYINT: "TINYINT", 765 exp.DataType.Type.UDECIMAL: "DECIMAL", 766 } 767 768 TIMESTAMP_TYPE_MAPPING = { 769 exp.DataType.Type.TIMESTAMP: "DATETIME", 770 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 771 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 772 } 773 774 TYPE_MAPPING = { 775 **generator.Generator.TYPE_MAPPING, 776 **UNSIGNED_TYPE_MAPPING, 777 **TIMESTAMP_TYPE_MAPPING, 778 } 779 780 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 781 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 782 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 783 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 784 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 785 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 786 787 PROPERTIES_LOCATION = { 788 **generator.Generator.PROPERTIES_LOCATION, 789 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 790 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 791 } 792 793 LIMIT_FETCH = "LIMIT" 794 795 LIMIT_ONLY_LITERALS = True 796 797 CHAR_CAST_MAPPING = dict.fromkeys( 798 ( 799 exp.DataType.Type.LONGTEXT, 800 exp.DataType.Type.LONGBLOB, 801 exp.DataType.Type.MEDIUMBLOB, 802 exp.DataType.Type.MEDIUMTEXT, 803 exp.DataType.Type.TEXT, 804 exp.DataType.Type.TINYBLOB, 805 exp.DataType.Type.TINYTEXT, 806 exp.DataType.Type.VARCHAR, 807 ), 808 "CHAR", 809 ) 810 SIGNED_CAST_MAPPING = dict.fromkeys( 811 ( 812 exp.DataType.Type.BIGINT, 813 exp.DataType.Type.BOOLEAN, 814 exp.DataType.Type.INT, 815 exp.DataType.Type.SMALLINT, 816 exp.DataType.Type.TINYINT, 817 exp.DataType.Type.MEDIUMINT, 818 ), 819 "SIGNED", 820 ) 821 822 # MySQL doesn't support many datatypes in cast. 823 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 824 CAST_MAPPING = { 825 **CHAR_CAST_MAPPING, 826 **SIGNED_CAST_MAPPING, 827 exp.DataType.Type.UBIGINT: "UNSIGNED", 828 } 829 830 TIMESTAMP_FUNC_TYPES = { 831 exp.DataType.Type.TIMESTAMPTZ, 832 exp.DataType.Type.TIMESTAMPLTZ, 833 } 834 835 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 836 RESERVED_KEYWORDS = { 837 "accessible", 838 "add", 839 "all", 840 "alter", 841 "analyze", 842 "and", 843 "as", 844 "asc", 845 "asensitive", 846 "before", 847 "between", 848 "bigint", 849 "binary", 850 "blob", 851 "both", 852 "by", 853 "call", 854 "cascade", 855 "case", 856 "change", 857 "char", 858 "character", 859 "check", 860 "collate", 861 "column", 862 "condition", 863 "constraint", 864 "continue", 865 "convert", 866 "create", 867 "cross", 868 "cube", 869 "cume_dist", 870 "current_date", 871 "current_time", 872 "current_timestamp", 873 "current_user", 874 "cursor", 875 "database", 876 "databases", 877 "day_hour", 878 "day_microsecond", 879 "day_minute", 880 "day_second", 881 "dec", 882 "decimal", 883 "declare", 884 "default", 885 "delayed", 886 "delete", 887 "dense_rank", 888 "desc", 889 "describe", 890 "deterministic", 891 "distinct", 892 "distinctrow", 893 "div", 894 "double", 895 "drop", 896 "dual", 897 "each", 898 "else", 899 "elseif", 900 "empty", 901 "enclosed", 902 "escaped", 903 "except", 904 "exists", 905 "exit", 906 "explain", 907 "false", 908 "fetch", 909 "first_value", 910 "float", 911 "float4", 912 "float8", 913 "for", 914 "force", 915 "foreign", 916 "from", 917 "fulltext", 918 "function", 919 "generated", 920 "get", 921 "grant", 922 "group", 923 "grouping", 924 "groups", 925 "having", 926 "high_priority", 927 "hour_microsecond", 928 "hour_minute", 929 "hour_second", 930 "if", 931 "ignore", 932 "in", 933 "index", 934 "infile", 935 "inner", 936 "inout", 937 "insensitive", 938 "insert", 939 "int", 940 "int1", 941 "int2", 942 "int3", 943 "int4", 944 "int8", 945 "integer", 946 "intersect", 947 "interval", 948 "into", 949 "io_after_gtids", 950 "io_before_gtids", 951 "is", 952 "iterate", 953 "join", 954 "json_table", 955 "key", 956 "keys", 957 "kill", 958 "lag", 959 "last_value", 960 "lateral", 961 "lead", 962 "leading", 963 "leave", 964 "left", 965 "like", 966 "limit", 967 "linear", 968 "lines", 969 "load", 970 "localtime", 971 "localtimestamp", 972 "lock", 973 "long", 974 "longblob", 975 "longtext", 976 "loop", 977 "low_priority", 978 "master_bind", 979 "master_ssl_verify_server_cert", 980 "match", 981 "maxvalue", 982 "mediumblob", 983 "mediumint", 984 "mediumtext", 985 "middleint", 986 "minute_microsecond", 987 "minute_second", 988 "mod", 989 "modifies", 990 "natural", 991 "not", 992 "no_write_to_binlog", 993 "nth_value", 994 "ntile", 995 "null", 996 "numeric", 997 "of", 998 "on", 999 "optimize", 1000 "optimizer_costs", 1001 "option", 1002 "optionally", 1003 "or", 1004 "order", 1005 "out", 1006 "outer", 1007 "outfile", 1008 "over", 1009 "partition", 1010 "percent_rank", 1011 "precision", 1012 "primary", 1013 "procedure", 1014 "purge", 1015 "range", 1016 "rank", 1017 "read", 1018 "reads", 1019 "read_write", 1020 "real", 1021 "recursive", 1022 "references", 1023 "regexp", 1024 "release", 1025 "rename", 1026 "repeat", 1027 "replace", 1028 "require", 1029 "resignal", 1030 "restrict", 1031 "return", 1032 "revoke", 1033 "right", 1034 "rlike", 1035 "row", 1036 "rows", 1037 "row_number", 1038 "schema", 1039 "schemas", 1040 "second_microsecond", 1041 "select", 1042 "sensitive", 1043 "separator", 1044 "set", 1045 "show", 1046 "signal", 1047 "smallint", 1048 "spatial", 1049 "specific", 1050 "sql", 1051 "sqlexception", 1052 "sqlstate", 1053 "sqlwarning", 1054 "sql_big_result", 1055 "sql_calc_found_rows", 1056 "sql_small_result", 1057 "ssl", 1058 "starting", 1059 "stored", 1060 "straight_join", 1061 "system", 1062 "table", 1063 "terminated", 1064 "then", 1065 "tinyblob", 1066 "tinyint", 1067 "tinytext", 1068 "to", 1069 "trailing", 1070 "trigger", 1071 "true", 1072 "undo", 1073 "union", 1074 "unique", 1075 "unlock", 1076 "unsigned", 1077 "update", 1078 "usage", 1079 "use", 1080 "using", 1081 "utc_date", 1082 "utc_time", 1083 "utc_timestamp", 1084 "values", 1085 "varbinary", 1086 "varchar", 1087 "varcharacter", 1088 "varying", 1089 "virtual", 1090 "when", 1091 "where", 1092 "while", 1093 "window", 1094 "with", 1095 "write", 1096 "xor", 1097 "year_month", 1098 "zerofill", 1099 } 1100 1101 def array_sql(self, expression: exp.Array) -> str: 1102 self.unsupported("Arrays are not supported by MySQL") 1103 return self.function_fallback_sql(expression) 1104 1105 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1106 self.unsupported("Array operations are not supported by MySQL") 1107 return self.function_fallback_sql(expression) 1108 1109 def dpipe_sql(self, expression: exp.DPipe) -> str: 1110 return self.func("CONCAT", *expression.flatten()) 1111 1112 def extract_sql(self, expression: exp.Extract) -> str: 1113 unit = expression.name 1114 if unit and unit.lower() == "epoch": 1115 return self.func("UNIX_TIMESTAMP", expression.expression) 1116 1117 return super().extract_sql(expression) 1118 1119 def datatype_sql(self, expression: exp.DataType) -> str: 1120 if ( 1121 self.VARCHAR_REQUIRES_SIZE 1122 and expression.is_type(exp.DataType.Type.VARCHAR) 1123 and not expression.expressions 1124 ): 1125 # `VARCHAR` must always have a size - if it doesn't, we always generate `TEXT` 1126 return "TEXT" 1127 1128 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1129 result = super().datatype_sql(expression) 1130 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1131 result = f"{result} UNSIGNED" 1132 1133 return result 1134 1135 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1136 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1137 1138 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1139 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1140 return self.func("TIMESTAMP", expression.this) 1141 1142 to = self.CAST_MAPPING.get(expression.to.this) 1143 1144 if to: 1145 expression.to.set("this", to) 1146 return super().cast_sql(expression) 1147 1148 def show_sql(self, expression: exp.Show) -> str: 1149 this = f" {expression.name}" 1150 full = " FULL" if expression.args.get("full") else "" 1151 global_ = " GLOBAL" if expression.args.get("global") else "" 1152 1153 target = self.sql(expression, "target") 1154 target = f" {target}" if target else "" 1155 if expression.name in ("COLUMNS", "INDEX"): 1156 target = f" FROM{target}" 1157 elif expression.name == "GRANTS": 1158 target = f" FOR{target}" 1159 1160 db = self._prefixed_sql("FROM", expression, "db") 1161 1162 like = self._prefixed_sql("LIKE", expression, "like") 1163 where = self.sql(expression, "where") 1164 1165 types = self.expressions(expression, key="types") 1166 types = f" {types}" if types else types 1167 query = self._prefixed_sql("FOR QUERY", expression, "query") 1168 1169 if expression.name == "PROFILE": 1170 offset = self._prefixed_sql("OFFSET", expression, "offset") 1171 limit = self._prefixed_sql("LIMIT", expression, "limit") 1172 else: 1173 offset = "" 1174 limit = self._oldstyle_limit_sql(expression) 1175 1176 log = self._prefixed_sql("IN", expression, "log") 1177 position = self._prefixed_sql("FROM", expression, "position") 1178 1179 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1180 1181 if expression.name == "ENGINE": 1182 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1183 else: 1184 mutex_or_status = "" 1185 1186 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1187 1188 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1189 dtype = self.sql(expression, "dtype") 1190 if not dtype: 1191 return super().altercolumn_sql(expression) 1192 1193 this = self.sql(expression, "this") 1194 return f"MODIFY COLUMN {this} {dtype}" 1195 1196 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1197 sql = self.sql(expression, arg) 1198 return f" {prefix} {sql}" if sql else "" 1199 1200 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1201 limit = self.sql(expression, "limit") 1202 offset = self.sql(expression, "offset") 1203 if limit: 1204 limit_offset = f"{offset}, {limit}" if offset else limit 1205 return f" LIMIT {limit_offset}" 1206 return "" 1207 1208 def chr_sql(self, expression: exp.Chr) -> str: 1209 this = self.expressions(sqls=[expression.this] + expression.expressions) 1210 charset = expression.args.get("charset") 1211 using = f" USING {self.sql(charset)}" if charset else "" 1212 return f"CHAR({this}{using})" 1213 1214 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1215 unit = expression.args.get("unit") 1216 1217 # Pick an old-enough date to avoid negative timestamp diffs 1218 start_ts = "'0000-01-01 00:00:00'" 1219 1220 # Source: https://stackoverflow.com/a/32955740 1221 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1222 interval = exp.Interval(this=timestamp_diff, unit=unit) 1223 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1224 1225 return self.sql(dateadd) 1226 1227 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1228 from_tz = expression.args.get("source_tz") 1229 to_tz = expression.args.get("target_tz") 1230 dt = expression.args.get("timestamp") 1231 1232 return self.func("CONVERT_TZ", dt, from_tz, to_tz) 1233 1234 def attimezone_sql(self, expression: exp.AtTimeZone) -> str: 1235 self.unsupported("AT TIME ZONE is not supported by MySQL") 1236 return self.sql(expression.this)
TIME_SPECIFIERS =
{'i', 'h', 's', 'I', 'k', 'l', 'S', 'r', 'T', 'H', 'f', 'p'}
def
date_add_sql( kind: str) -> Callable[[sqlglot.generator.Generator, sqlglot.expressions.Expression], str]:
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
148class MySQL(Dialect): 149 # https://dev.mysql.com/doc/refman/8.0/en/identifiers.html 150 IDENTIFIERS_CAN_START_WITH_DIGIT = True 151 152 # We default to treating all identifiers as case-sensitive, since it matches MySQL's 153 # behavior on Linux systems. For MacOS and Windows systems, one can override this 154 # setting by specifying `dialect="mysql, normalization_strategy = lowercase"`. 155 # 156 # See also https://dev.mysql.com/doc/refman/8.2/en/identifier-case-sensitivity.html 157 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_SENSITIVE 158 159 TIME_FORMAT = "'%Y-%m-%d %T'" 160 DPIPE_IS_STRING_CONCAT = False 161 SUPPORTS_USER_DEFINED_TYPES = False 162 SUPPORTS_SEMI_ANTI_JOIN = False 163 SAFE_DIVISION = True 164 165 # https://prestodb.io/docs/current/functions/datetime.html#mysql-date-functions 166 TIME_MAPPING = { 167 "%M": "%B", 168 "%c": "%-m", 169 "%e": "%-d", 170 "%h": "%I", 171 "%i": "%M", 172 "%s": "%S", 173 "%u": "%W", 174 "%k": "%-H", 175 "%l": "%-I", 176 "%T": "%H:%M:%S", 177 "%W": "%A", 178 } 179 180 class Tokenizer(tokens.Tokenizer): 181 QUOTES = ["'", '"'] 182 COMMENTS = ["--", "#", ("/*", "*/")] 183 IDENTIFIERS = ["`"] 184 STRING_ESCAPES = ["'", '"', "\\"] 185 BIT_STRINGS = [("b'", "'"), ("B'", "'"), ("0b", "")] 186 HEX_STRINGS = [("x'", "'"), ("X'", "'"), ("0x", "")] 187 188 KEYWORDS = { 189 **tokens.Tokenizer.KEYWORDS, 190 "CHARSET": TokenType.CHARACTER_SET, 191 "FORCE": TokenType.FORCE, 192 "IGNORE": TokenType.IGNORE, 193 "KEY": TokenType.KEY, 194 "LOCK TABLES": TokenType.COMMAND, 195 "LONGBLOB": TokenType.LONGBLOB, 196 "LONGTEXT": TokenType.LONGTEXT, 197 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 198 "TINYBLOB": TokenType.TINYBLOB, 199 "TINYTEXT": TokenType.TINYTEXT, 200 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 201 "MEDIUMINT": TokenType.MEDIUMINT, 202 "MEMBER OF": TokenType.MEMBER_OF, 203 "SEPARATOR": TokenType.SEPARATOR, 204 "START": TokenType.BEGIN, 205 "SIGNED": TokenType.BIGINT, 206 "SIGNED INTEGER": TokenType.BIGINT, 207 "UNLOCK TABLES": TokenType.COMMAND, 208 "UNSIGNED": TokenType.UBIGINT, 209 "UNSIGNED INTEGER": TokenType.UBIGINT, 210 "YEAR": TokenType.YEAR, 211 "_ARMSCII8": TokenType.INTRODUCER, 212 "_ASCII": TokenType.INTRODUCER, 213 "_BIG5": TokenType.INTRODUCER, 214 "_BINARY": TokenType.INTRODUCER, 215 "_CP1250": TokenType.INTRODUCER, 216 "_CP1251": TokenType.INTRODUCER, 217 "_CP1256": TokenType.INTRODUCER, 218 "_CP1257": TokenType.INTRODUCER, 219 "_CP850": TokenType.INTRODUCER, 220 "_CP852": TokenType.INTRODUCER, 221 "_CP866": TokenType.INTRODUCER, 222 "_CP932": TokenType.INTRODUCER, 223 "_DEC8": TokenType.INTRODUCER, 224 "_EUCJPMS": TokenType.INTRODUCER, 225 "_EUCKR": TokenType.INTRODUCER, 226 "_GB18030": TokenType.INTRODUCER, 227 "_GB2312": TokenType.INTRODUCER, 228 "_GBK": TokenType.INTRODUCER, 229 "_GEOSTD8": TokenType.INTRODUCER, 230 "_GREEK": TokenType.INTRODUCER, 231 "_HEBREW": TokenType.INTRODUCER, 232 "_HP8": TokenType.INTRODUCER, 233 "_KEYBCS2": TokenType.INTRODUCER, 234 "_KOI8R": TokenType.INTRODUCER, 235 "_KOI8U": TokenType.INTRODUCER, 236 "_LATIN1": TokenType.INTRODUCER, 237 "_LATIN2": TokenType.INTRODUCER, 238 "_LATIN5": TokenType.INTRODUCER, 239 "_LATIN7": TokenType.INTRODUCER, 240 "_MACCE": TokenType.INTRODUCER, 241 "_MACROMAN": TokenType.INTRODUCER, 242 "_SJIS": TokenType.INTRODUCER, 243 "_SWE7": TokenType.INTRODUCER, 244 "_TIS620": TokenType.INTRODUCER, 245 "_UCS2": TokenType.INTRODUCER, 246 "_UJIS": TokenType.INTRODUCER, 247 # https://dev.mysql.com/doc/refman/8.0/en/string-literals.html 248 "_UTF8": TokenType.INTRODUCER, 249 "_UTF16": TokenType.INTRODUCER, 250 "_UTF16LE": TokenType.INTRODUCER, 251 "_UTF32": TokenType.INTRODUCER, 252 "_UTF8MB3": TokenType.INTRODUCER, 253 "_UTF8MB4": TokenType.INTRODUCER, 254 "@@": TokenType.SESSION_PARAMETER, 255 } 256 257 COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.REPLACE} - {TokenType.SHOW} 258 259 class Parser(parser.Parser): 260 FUNC_TOKENS = { 261 *parser.Parser.FUNC_TOKENS, 262 TokenType.DATABASE, 263 TokenType.SCHEMA, 264 TokenType.VALUES, 265 } 266 267 CONJUNCTION = { 268 **parser.Parser.CONJUNCTION, 269 TokenType.DAMP: exp.And, 270 TokenType.XOR: exp.Xor, 271 } 272 273 DISJUNCTION = { 274 **parser.Parser.DISJUNCTION, 275 TokenType.DPIPE: exp.Or, 276 } 277 278 TABLE_ALIAS_TOKENS = ( 279 parser.Parser.TABLE_ALIAS_TOKENS - parser.Parser.TABLE_INDEX_HINT_TOKENS 280 ) 281 282 RANGE_PARSERS = { 283 **parser.Parser.RANGE_PARSERS, 284 TokenType.MEMBER_OF: lambda self, this: self.expression( 285 exp.JSONArrayContains, 286 this=this, 287 expression=self._parse_wrapped(self._parse_expression), 288 ), 289 } 290 291 FUNCTIONS = { 292 **parser.Parser.FUNCTIONS, 293 "CONVERT_TZ": lambda args: exp.ConvertTimezone( 294 source_tz=seq_get(args, 1), target_tz=seq_get(args, 2), timestamp=seq_get(args, 0) 295 ), 296 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 297 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 298 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 299 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 300 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 301 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 302 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 303 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 304 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 305 "ISNULL": isnull_to_is_null, 306 "LOCATE": locate_to_strposition, 307 "MAKETIME": exp.TimeFromParts.from_arg_list, 308 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 309 "MONTHNAME": lambda args: exp.TimeToStr( 310 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 311 format=exp.Literal.string("%B"), 312 ), 313 "STR_TO_DATE": _str_to_date, 314 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 315 "TO_DAYS": lambda args: exp.paren( 316 exp.DateDiff( 317 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 318 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 319 unit=exp.var("DAY"), 320 ) 321 + 1 322 ), 323 "WEEK": lambda args: exp.Week( 324 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 325 ), 326 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 327 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 328 } 329 330 FUNCTION_PARSERS = { 331 **parser.Parser.FUNCTION_PARSERS, 332 "CHAR": lambda self: self.expression( 333 exp.Chr, 334 expressions=self._parse_csv(self._parse_assignment), 335 charset=self._match(TokenType.USING) and self._parse_var(), 336 ), 337 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 338 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 339 "VALUES": lambda self: self.expression( 340 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 341 ), 342 "JSON_VALUE": lambda self: self._parse_json_value(), 343 } 344 345 STATEMENT_PARSERS = { 346 **parser.Parser.STATEMENT_PARSERS, 347 TokenType.SHOW: lambda self: self._parse_show(), 348 } 349 350 SHOW_PARSERS = { 351 "BINARY LOGS": _show_parser("BINARY LOGS"), 352 "MASTER LOGS": _show_parser("BINARY LOGS"), 353 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 354 "CHARACTER SET": _show_parser("CHARACTER SET"), 355 "CHARSET": _show_parser("CHARACTER SET"), 356 "COLLATION": _show_parser("COLLATION"), 357 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 358 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 359 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 360 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 361 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 362 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 363 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 364 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 365 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 366 "DATABASES": _show_parser("DATABASES"), 367 "SCHEMAS": _show_parser("DATABASES"), 368 "ENGINE": _show_parser("ENGINE", target=True), 369 "STORAGE ENGINES": _show_parser("ENGINES"), 370 "ENGINES": _show_parser("ENGINES"), 371 "ERRORS": _show_parser("ERRORS"), 372 "EVENTS": _show_parser("EVENTS"), 373 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 374 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 375 "GRANTS": _show_parser("GRANTS", target="FOR"), 376 "INDEX": _show_parser("INDEX", target="FROM"), 377 "MASTER STATUS": _show_parser("MASTER STATUS"), 378 "OPEN TABLES": _show_parser("OPEN TABLES"), 379 "PLUGINS": _show_parser("PLUGINS"), 380 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 381 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 382 "PRIVILEGES": _show_parser("PRIVILEGES"), 383 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 384 "PROCESSLIST": _show_parser("PROCESSLIST"), 385 "PROFILE": _show_parser("PROFILE"), 386 "PROFILES": _show_parser("PROFILES"), 387 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 388 "REPLICAS": _show_parser("REPLICAS"), 389 "SLAVE HOSTS": _show_parser("REPLICAS"), 390 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 391 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 392 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 393 "SESSION STATUS": _show_parser("STATUS"), 394 "STATUS": _show_parser("STATUS"), 395 "TABLE STATUS": _show_parser("TABLE STATUS"), 396 "FULL TABLES": _show_parser("TABLES", full=True), 397 "TABLES": _show_parser("TABLES"), 398 "TRIGGERS": _show_parser("TRIGGERS"), 399 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 400 "SESSION VARIABLES": _show_parser("VARIABLES"), 401 "VARIABLES": _show_parser("VARIABLES"), 402 "WARNINGS": _show_parser("WARNINGS"), 403 } 404 405 PROPERTY_PARSERS = { 406 **parser.Parser.PROPERTY_PARSERS, 407 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 408 } 409 410 SET_PARSERS = { 411 **parser.Parser.SET_PARSERS, 412 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 413 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 414 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 415 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 416 "NAMES": lambda self: self._parse_set_item_names(), 417 } 418 419 CONSTRAINT_PARSERS = { 420 **parser.Parser.CONSTRAINT_PARSERS, 421 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 422 "INDEX": lambda self: self._parse_index_constraint(), 423 "KEY": lambda self: self._parse_index_constraint(), 424 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 425 } 426 427 ALTER_PARSERS = { 428 **parser.Parser.ALTER_PARSERS, 429 "MODIFY": lambda self: self._parse_alter_table_alter(), 430 } 431 432 SCHEMA_UNNAMED_CONSTRAINTS = { 433 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 434 "FULLTEXT", 435 "INDEX", 436 "KEY", 437 "SPATIAL", 438 } 439 440 PROFILE_TYPES: parser.OPTIONS_TYPE = { 441 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 442 "BLOCK": ("IO",), 443 "CONTEXT": ("SWITCHES",), 444 "PAGE": ("FAULTS",), 445 } 446 447 TYPE_TOKENS = { 448 *parser.Parser.TYPE_TOKENS, 449 TokenType.SET, 450 } 451 452 ENUM_TYPE_TOKENS = { 453 *parser.Parser.ENUM_TYPE_TOKENS, 454 TokenType.SET, 455 } 456 457 LOG_DEFAULTS_TO_LN = True 458 STRING_ALIASES = True 459 VALUES_FOLLOWED_BY_PAREN = False 460 SUPPORTS_PARTITION_SELECTION = True 461 462 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 463 this = self._parse_id_var() 464 if not self._match(TokenType.L_PAREN): 465 return this 466 467 expression = self._parse_number() 468 self._match_r_paren() 469 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 470 471 def _parse_index_constraint( 472 self, kind: t.Optional[str] = None 473 ) -> exp.IndexColumnConstraint: 474 if kind: 475 self._match_texts(("INDEX", "KEY")) 476 477 this = self._parse_id_var(any_token=False) 478 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 479 expressions = self._parse_wrapped_csv(self._parse_ordered) 480 481 options = [] 482 while True: 483 if self._match_text_seq("KEY_BLOCK_SIZE"): 484 self._match(TokenType.EQ) 485 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 486 elif self._match(TokenType.USING): 487 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 488 elif self._match_text_seq("WITH", "PARSER"): 489 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 490 elif self._match(TokenType.COMMENT): 491 opt = exp.IndexConstraintOption(comment=self._parse_string()) 492 elif self._match_text_seq("VISIBLE"): 493 opt = exp.IndexConstraintOption(visible=True) 494 elif self._match_text_seq("INVISIBLE"): 495 opt = exp.IndexConstraintOption(visible=False) 496 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 497 self._match(TokenType.EQ) 498 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 499 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 500 self._match(TokenType.EQ) 501 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 502 else: 503 opt = None 504 505 if not opt: 506 break 507 508 options.append(opt) 509 510 return self.expression( 511 exp.IndexColumnConstraint, 512 this=this, 513 expressions=expressions, 514 kind=kind, 515 index_type=index_type, 516 options=options, 517 ) 518 519 def _parse_show_mysql( 520 self, 521 this: str, 522 target: bool | str = False, 523 full: t.Optional[bool] = None, 524 global_: t.Optional[bool] = None, 525 ) -> exp.Show: 526 if target: 527 if isinstance(target, str): 528 self._match_text_seq(target) 529 target_id = self._parse_id_var() 530 else: 531 target_id = None 532 533 log = self._parse_string() if self._match_text_seq("IN") else None 534 535 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 536 position = self._parse_number() if self._match_text_seq("FROM") else None 537 db = None 538 else: 539 position = None 540 db = None 541 542 if self._match(TokenType.FROM): 543 db = self._parse_id_var() 544 elif self._match(TokenType.DOT): 545 db = target_id 546 target_id = self._parse_id_var() 547 548 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 549 550 like = self._parse_string() if self._match_text_seq("LIKE") else None 551 where = self._parse_where() 552 553 if this == "PROFILE": 554 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 555 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 556 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 557 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 558 else: 559 types, query = None, None 560 offset, limit = self._parse_oldstyle_limit() 561 562 mutex = True if self._match_text_seq("MUTEX") else None 563 mutex = False if self._match_text_seq("STATUS") else mutex 564 565 return self.expression( 566 exp.Show, 567 this=this, 568 target=target_id, 569 full=full, 570 log=log, 571 position=position, 572 db=db, 573 channel=channel, 574 like=like, 575 where=where, 576 types=types, 577 query=query, 578 offset=offset, 579 limit=limit, 580 mutex=mutex, 581 **{"global": global_}, # type: ignore 582 ) 583 584 def _parse_oldstyle_limit( 585 self, 586 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 587 limit = None 588 offset = None 589 if self._match_text_seq("LIMIT"): 590 parts = self._parse_csv(self._parse_number) 591 if len(parts) == 1: 592 limit = parts[0] 593 elif len(parts) == 2: 594 limit = parts[1] 595 offset = parts[0] 596 597 return offset, limit 598 599 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 600 this = self._parse_string() or self._parse_unquoted_field() 601 return self.expression(exp.SetItem, this=this, kind=kind) 602 603 def _parse_set_item_names(self) -> exp.Expression: 604 charset = self._parse_string() or self._parse_unquoted_field() 605 if self._match_text_seq("COLLATE"): 606 collate = self._parse_string() or self._parse_unquoted_field() 607 else: 608 collate = None 609 610 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 611 612 def _parse_type( 613 self, parse_interval: bool = True, fallback_to_identifier: bool = False 614 ) -> t.Optional[exp.Expression]: 615 # mysql binary is special and can work anywhere, even in order by operations 616 # it operates like a no paren func 617 if self._match(TokenType.BINARY, advance=False): 618 data_type = self._parse_types(check_func=True, allow_identifiers=False) 619 620 if isinstance(data_type, exp.DataType): 621 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 622 623 return super()._parse_type( 624 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 625 ) 626 627 def _parse_group_concat(self) -> t.Optional[exp.Expression]: 628 def concat_exprs( 629 node: t.Optional[exp.Expression], exprs: t.List[exp.Expression] 630 ) -> exp.Expression: 631 if isinstance(node, exp.Distinct) and len(node.expressions) > 1: 632 concat_exprs = [ 633 self.expression(exp.Concat, expressions=node.expressions, safe=True) 634 ] 635 node.set("expressions", concat_exprs) 636 return node 637 if len(exprs) == 1: 638 return exprs[0] 639 return self.expression(exp.Concat, expressions=args, safe=True) 640 641 args = self._parse_csv(self._parse_lambda) 642 643 if args: 644 order = args[-1] if isinstance(args[-1], exp.Order) else None 645 646 if order: 647 # Order By is the last (or only) expression in the list and has consumed the 'expr' before it, 648 # remove 'expr' from exp.Order and add it back to args 649 args[-1] = order.this 650 order.set("this", concat_exprs(order.this, args)) 651 652 this = order or concat_exprs(args[0], args) 653 else: 654 this = None 655 656 separator = self._parse_field() if self._match(TokenType.SEPARATOR) else None 657 658 return self.expression(exp.GroupConcat, this=this, separator=separator) 659 660 def _parse_json_value(self) -> exp.JSONValue: 661 this = self._parse_bitwise() 662 self._match(TokenType.COMMA) 663 path = self._parse_bitwise() 664 665 returning = self._match(TokenType.RETURNING) and self._parse_type() 666 667 return self.expression( 668 exp.JSONValue, 669 this=this, 670 path=self.dialect.to_json_path(path), 671 returning=returning, 672 on_condition=self._parse_on_condition(), 673 ) 674 675 class Generator(generator.Generator): 676 INTERVAL_ALLOWS_PLURAL_FORM = False 677 LOCKING_READS_SUPPORTED = True 678 NULL_ORDERING_SUPPORTED = None 679 JOIN_HINTS = False 680 TABLE_HINTS = True 681 DUPLICATE_KEY_UPDATE_WITH_SET = False 682 QUERY_HINT_SEP = " " 683 VALUES_AS_TABLE = False 684 NVL2_SUPPORTED = False 685 LAST_DAY_SUPPORTS_DATE_PART = False 686 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 687 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 688 JSON_KEY_VALUE_PAIR_SEP = "," 689 SUPPORTS_TO_NUMBER = False 690 PARSE_JSON_NAME: t.Optional[str] = None 691 PAD_FILL_PATTERN_IS_REQUIRED = True 692 WRAP_DERIVED_VALUES = False 693 VARCHAR_REQUIRES_SIZE = True 694 695 TRANSFORMS = { 696 **generator.Generator.TRANSFORMS, 697 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 698 exp.CurrentDate: no_paren_current_date_sql, 699 exp.DateDiff: _remove_ts_or_ds_to_date( 700 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 701 ), 702 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 703 exp.DateStrToDate: datestrtodate_sql, 704 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 705 exp.DateTrunc: _date_trunc_sql, 706 exp.Day: _remove_ts_or_ds_to_date(), 707 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 708 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 709 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 710 exp.GroupConcat: lambda self, 711 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 712 exp.ILike: no_ilike_sql, 713 exp.JSONExtractScalar: arrow_json_extract_sql, 714 exp.Max: max_or_greatest, 715 exp.Min: min_or_least, 716 exp.Month: _remove_ts_or_ds_to_date(), 717 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 718 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 719 exp.Pivot: no_pivot_sql, 720 exp.Select: transforms.preprocess( 721 [ 722 transforms.eliminate_distinct_on, 723 transforms.eliminate_semi_and_anti_joins, 724 transforms.eliminate_qualify, 725 transforms.eliminate_full_outer_join, 726 transforms.unnest_generate_date_array_using_recursive_cte, 727 ] 728 ), 729 exp.StrPosition: strposition_to_locate_sql, 730 exp.StrToDate: _str_to_date_sql, 731 exp.StrToTime: _str_to_date_sql, 732 exp.Stuff: rename_func("INSERT"), 733 exp.TableSample: no_tablesample_sql, 734 exp.TimeFromParts: rename_func("MAKETIME"), 735 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 736 exp.TimestampDiff: lambda self, e: self.func( 737 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 738 ), 739 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 740 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 741 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 742 self, 743 e, 744 include_precision=not e.args.get("zone"), 745 ), 746 exp.TimeToStr: _remove_ts_or_ds_to_date( 747 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 748 ), 749 exp.Trim: trim_sql, 750 exp.TryCast: no_trycast_sql, 751 exp.TsOrDsAdd: date_add_sql("ADD"), 752 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 753 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 754 exp.UnixToTime: _unix_to_time_sql, 755 exp.Week: _remove_ts_or_ds_to_date(), 756 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 757 exp.Year: _remove_ts_or_ds_to_date(), 758 } 759 760 UNSIGNED_TYPE_MAPPING = { 761 exp.DataType.Type.UBIGINT: "BIGINT", 762 exp.DataType.Type.UINT: "INT", 763 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 764 exp.DataType.Type.USMALLINT: "SMALLINT", 765 exp.DataType.Type.UTINYINT: "TINYINT", 766 exp.DataType.Type.UDECIMAL: "DECIMAL", 767 } 768 769 TIMESTAMP_TYPE_MAPPING = { 770 exp.DataType.Type.TIMESTAMP: "DATETIME", 771 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 772 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 773 } 774 775 TYPE_MAPPING = { 776 **generator.Generator.TYPE_MAPPING, 777 **UNSIGNED_TYPE_MAPPING, 778 **TIMESTAMP_TYPE_MAPPING, 779 } 780 781 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 782 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 783 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 784 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 785 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 786 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 787 788 PROPERTIES_LOCATION = { 789 **generator.Generator.PROPERTIES_LOCATION, 790 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 791 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 792 } 793 794 LIMIT_FETCH = "LIMIT" 795 796 LIMIT_ONLY_LITERALS = True 797 798 CHAR_CAST_MAPPING = dict.fromkeys( 799 ( 800 exp.DataType.Type.LONGTEXT, 801 exp.DataType.Type.LONGBLOB, 802 exp.DataType.Type.MEDIUMBLOB, 803 exp.DataType.Type.MEDIUMTEXT, 804 exp.DataType.Type.TEXT, 805 exp.DataType.Type.TINYBLOB, 806 exp.DataType.Type.TINYTEXT, 807 exp.DataType.Type.VARCHAR, 808 ), 809 "CHAR", 810 ) 811 SIGNED_CAST_MAPPING = dict.fromkeys( 812 ( 813 exp.DataType.Type.BIGINT, 814 exp.DataType.Type.BOOLEAN, 815 exp.DataType.Type.INT, 816 exp.DataType.Type.SMALLINT, 817 exp.DataType.Type.TINYINT, 818 exp.DataType.Type.MEDIUMINT, 819 ), 820 "SIGNED", 821 ) 822 823 # MySQL doesn't support many datatypes in cast. 824 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 825 CAST_MAPPING = { 826 **CHAR_CAST_MAPPING, 827 **SIGNED_CAST_MAPPING, 828 exp.DataType.Type.UBIGINT: "UNSIGNED", 829 } 830 831 TIMESTAMP_FUNC_TYPES = { 832 exp.DataType.Type.TIMESTAMPTZ, 833 exp.DataType.Type.TIMESTAMPLTZ, 834 } 835 836 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 837 RESERVED_KEYWORDS = { 838 "accessible", 839 "add", 840 "all", 841 "alter", 842 "analyze", 843 "and", 844 "as", 845 "asc", 846 "asensitive", 847 "before", 848 "between", 849 "bigint", 850 "binary", 851 "blob", 852 "both", 853 "by", 854 "call", 855 "cascade", 856 "case", 857 "change", 858 "char", 859 "character", 860 "check", 861 "collate", 862 "column", 863 "condition", 864 "constraint", 865 "continue", 866 "convert", 867 "create", 868 "cross", 869 "cube", 870 "cume_dist", 871 "current_date", 872 "current_time", 873 "current_timestamp", 874 "current_user", 875 "cursor", 876 "database", 877 "databases", 878 "day_hour", 879 "day_microsecond", 880 "day_minute", 881 "day_second", 882 "dec", 883 "decimal", 884 "declare", 885 "default", 886 "delayed", 887 "delete", 888 "dense_rank", 889 "desc", 890 "describe", 891 "deterministic", 892 "distinct", 893 "distinctrow", 894 "div", 895 "double", 896 "drop", 897 "dual", 898 "each", 899 "else", 900 "elseif", 901 "empty", 902 "enclosed", 903 "escaped", 904 "except", 905 "exists", 906 "exit", 907 "explain", 908 "false", 909 "fetch", 910 "first_value", 911 "float", 912 "float4", 913 "float8", 914 "for", 915 "force", 916 "foreign", 917 "from", 918 "fulltext", 919 "function", 920 "generated", 921 "get", 922 "grant", 923 "group", 924 "grouping", 925 "groups", 926 "having", 927 "high_priority", 928 "hour_microsecond", 929 "hour_minute", 930 "hour_second", 931 "if", 932 "ignore", 933 "in", 934 "index", 935 "infile", 936 "inner", 937 "inout", 938 "insensitive", 939 "insert", 940 "int", 941 "int1", 942 "int2", 943 "int3", 944 "int4", 945 "int8", 946 "integer", 947 "intersect", 948 "interval", 949 "into", 950 "io_after_gtids", 951 "io_before_gtids", 952 "is", 953 "iterate", 954 "join", 955 "json_table", 956 "key", 957 "keys", 958 "kill", 959 "lag", 960 "last_value", 961 "lateral", 962 "lead", 963 "leading", 964 "leave", 965 "left", 966 "like", 967 "limit", 968 "linear", 969 "lines", 970 "load", 971 "localtime", 972 "localtimestamp", 973 "lock", 974 "long", 975 "longblob", 976 "longtext", 977 "loop", 978 "low_priority", 979 "master_bind", 980 "master_ssl_verify_server_cert", 981 "match", 982 "maxvalue", 983 "mediumblob", 984 "mediumint", 985 "mediumtext", 986 "middleint", 987 "minute_microsecond", 988 "minute_second", 989 "mod", 990 "modifies", 991 "natural", 992 "not", 993 "no_write_to_binlog", 994 "nth_value", 995 "ntile", 996 "null", 997 "numeric", 998 "of", 999 "on", 1000 "optimize", 1001 "optimizer_costs", 1002 "option", 1003 "optionally", 1004 "or", 1005 "order", 1006 "out", 1007 "outer", 1008 "outfile", 1009 "over", 1010 "partition", 1011 "percent_rank", 1012 "precision", 1013 "primary", 1014 "procedure", 1015 "purge", 1016 "range", 1017 "rank", 1018 "read", 1019 "reads", 1020 "read_write", 1021 "real", 1022 "recursive", 1023 "references", 1024 "regexp", 1025 "release", 1026 "rename", 1027 "repeat", 1028 "replace", 1029 "require", 1030 "resignal", 1031 "restrict", 1032 "return", 1033 "revoke", 1034 "right", 1035 "rlike", 1036 "row", 1037 "rows", 1038 "row_number", 1039 "schema", 1040 "schemas", 1041 "second_microsecond", 1042 "select", 1043 "sensitive", 1044 "separator", 1045 "set", 1046 "show", 1047 "signal", 1048 "smallint", 1049 "spatial", 1050 "specific", 1051 "sql", 1052 "sqlexception", 1053 "sqlstate", 1054 "sqlwarning", 1055 "sql_big_result", 1056 "sql_calc_found_rows", 1057 "sql_small_result", 1058 "ssl", 1059 "starting", 1060 "stored", 1061 "straight_join", 1062 "system", 1063 "table", 1064 "terminated", 1065 "then", 1066 "tinyblob", 1067 "tinyint", 1068 "tinytext", 1069 "to", 1070 "trailing", 1071 "trigger", 1072 "true", 1073 "undo", 1074 "union", 1075 "unique", 1076 "unlock", 1077 "unsigned", 1078 "update", 1079 "usage", 1080 "use", 1081 "using", 1082 "utc_date", 1083 "utc_time", 1084 "utc_timestamp", 1085 "values", 1086 "varbinary", 1087 "varchar", 1088 "varcharacter", 1089 "varying", 1090 "virtual", 1091 "when", 1092 "where", 1093 "while", 1094 "window", 1095 "with", 1096 "write", 1097 "xor", 1098 "year_month", 1099 "zerofill", 1100 } 1101 1102 def array_sql(self, expression: exp.Array) -> str: 1103 self.unsupported("Arrays are not supported by MySQL") 1104 return self.function_fallback_sql(expression) 1105 1106 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1107 self.unsupported("Array operations are not supported by MySQL") 1108 return self.function_fallback_sql(expression) 1109 1110 def dpipe_sql(self, expression: exp.DPipe) -> str: 1111 return self.func("CONCAT", *expression.flatten()) 1112 1113 def extract_sql(self, expression: exp.Extract) -> str: 1114 unit = expression.name 1115 if unit and unit.lower() == "epoch": 1116 return self.func("UNIX_TIMESTAMP", expression.expression) 1117 1118 return super().extract_sql(expression) 1119 1120 def datatype_sql(self, expression: exp.DataType) -> str: 1121 if ( 1122 self.VARCHAR_REQUIRES_SIZE 1123 and expression.is_type(exp.DataType.Type.VARCHAR) 1124 and not expression.expressions 1125 ): 1126 # `VARCHAR` must always have a size - if it doesn't, we always generate `TEXT` 1127 return "TEXT" 1128 1129 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1130 result = super().datatype_sql(expression) 1131 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1132 result = f"{result} UNSIGNED" 1133 1134 return result 1135 1136 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1137 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1138 1139 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1140 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1141 return self.func("TIMESTAMP", expression.this) 1142 1143 to = self.CAST_MAPPING.get(expression.to.this) 1144 1145 if to: 1146 expression.to.set("this", to) 1147 return super().cast_sql(expression) 1148 1149 def show_sql(self, expression: exp.Show) -> str: 1150 this = f" {expression.name}" 1151 full = " FULL" if expression.args.get("full") else "" 1152 global_ = " GLOBAL" if expression.args.get("global") else "" 1153 1154 target = self.sql(expression, "target") 1155 target = f" {target}" if target else "" 1156 if expression.name in ("COLUMNS", "INDEX"): 1157 target = f" FROM{target}" 1158 elif expression.name == "GRANTS": 1159 target = f" FOR{target}" 1160 1161 db = self._prefixed_sql("FROM", expression, "db") 1162 1163 like = self._prefixed_sql("LIKE", expression, "like") 1164 where = self.sql(expression, "where") 1165 1166 types = self.expressions(expression, key="types") 1167 types = f" {types}" if types else types 1168 query = self._prefixed_sql("FOR QUERY", expression, "query") 1169 1170 if expression.name == "PROFILE": 1171 offset = self._prefixed_sql("OFFSET", expression, "offset") 1172 limit = self._prefixed_sql("LIMIT", expression, "limit") 1173 else: 1174 offset = "" 1175 limit = self._oldstyle_limit_sql(expression) 1176 1177 log = self._prefixed_sql("IN", expression, "log") 1178 position = self._prefixed_sql("FROM", expression, "position") 1179 1180 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1181 1182 if expression.name == "ENGINE": 1183 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1184 else: 1185 mutex_or_status = "" 1186 1187 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1188 1189 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1190 dtype = self.sql(expression, "dtype") 1191 if not dtype: 1192 return super().altercolumn_sql(expression) 1193 1194 this = self.sql(expression, "this") 1195 return f"MODIFY COLUMN {this} {dtype}" 1196 1197 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1198 sql = self.sql(expression, arg) 1199 return f" {prefix} {sql}" if sql else "" 1200 1201 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1202 limit = self.sql(expression, "limit") 1203 offset = self.sql(expression, "offset") 1204 if limit: 1205 limit_offset = f"{offset}, {limit}" if offset else limit 1206 return f" LIMIT {limit_offset}" 1207 return "" 1208 1209 def chr_sql(self, expression: exp.Chr) -> str: 1210 this = self.expressions(sqls=[expression.this] + expression.expressions) 1211 charset = expression.args.get("charset") 1212 using = f" USING {self.sql(charset)}" if charset else "" 1213 return f"CHAR({this}{using})" 1214 1215 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1216 unit = expression.args.get("unit") 1217 1218 # Pick an old-enough date to avoid negative timestamp diffs 1219 start_ts = "'0000-01-01 00:00:00'" 1220 1221 # Source: https://stackoverflow.com/a/32955740 1222 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1223 interval = exp.Interval(this=timestamp_diff, unit=unit) 1224 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1225 1226 return self.sql(dateadd) 1227 1228 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1229 from_tz = expression.args.get("source_tz") 1230 to_tz = expression.args.get("target_tz") 1231 dt = expression.args.get("timestamp") 1232 1233 return self.func("CONVERT_TZ", dt, from_tz, to_tz) 1234 1235 def attimezone_sql(self, expression: exp.AtTimeZone) -> str: 1236 self.unsupported("AT TIME ZONE is not supported by MySQL") 1237 return self.sql(expression.this)
NORMALIZATION_STRATEGY =
<NormalizationStrategy.CASE_SENSITIVE: 'CASE_SENSITIVE'>
Specifies the strategy according to which identifiers should be normalized.
TIME_MAPPING: Dict[str, str] =
{'%M': '%B', '%c': '%-m', '%e': '%-d', '%h': '%I', '%i': '%M', '%s': '%S', '%u': '%W', '%k': '%-H', '%l': '%-I', '%T': '%H:%M:%S', '%W': '%A'}
Associates this dialect's time formats with their equivalent Python strftime
formats.
UNESCAPED_SEQUENCES: Dict[str, str] =
{'\\a': '\x07', '\\b': '\x08', '\\f': '\x0c', '\\n': '\n', '\\r': '\r', '\\t': '\t', '\\v': '\x0b', '\\\\': '\\'}
Mapping of an escaped sequence (\n
) to its unescaped version (
).
tokenizer_class =
<class 'MySQL.Tokenizer'>
parser_class =
<class 'MySQL.Parser'>
generator_class =
<class 'MySQL.Generator'>
TIME_TRIE: Dict =
{'%': {'M': {0: True}, 'c': {0: True}, 'e': {0: True}, 'h': {0: True}, 'i': {0: True}, 's': {0: True}, 'u': {0: True}, 'k': {0: True}, 'l': {0: True}, 'T': {0: True}, 'W': {0: True}}}
FORMAT_TRIE: Dict =
{'%': {'M': {0: True}, 'c': {0: True}, 'e': {0: True}, 'h': {0: True}, 'i': {0: True}, 's': {0: True}, 'u': {0: True}, 'k': {0: True}, 'l': {0: True}, 'T': {0: True}, 'W': {0: True}}}
INVERSE_TIME_MAPPING: Dict[str, str] =
{'%B': '%M', '%-m': '%c', '%-d': '%e', '%I': '%h', '%M': '%i', '%S': '%s', '%W': '%u', '%-H': '%k', '%-I': '%l', '%H:%M:%S': '%T', '%A': '%W'}
INVERSE_TIME_TRIE: Dict =
{'%': {'B': {0: True}, '-': {'m': {0: True}, 'd': {0: True}, 'H': {0: True}, 'I': {0: True}}, 'I': {0: True}, 'M': {0: True}, 'S': {0: True}, 'W': {0: True}, 'H': {':': {'%': {'M': {':': {'%': {'S': {0: True}}}}}}}, 'A': {0: True}}}
ESCAPED_SEQUENCES: Dict[str, str] =
{'\x07': '\\a', '\x08': '\\b', '\x0c': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t', '\x0b': '\\v', '\\': '\\\\'}
Inherited Members
- sqlglot.dialects.dialect.Dialect
- Dialect
- INDEX_OFFSET
- WEEK_OFFSET
- UNNEST_COLUMN_ONLY
- ALIAS_POST_TABLESAMPLE
- TABLESAMPLE_SIZE_IS_PERCENT
- STRICT_STRING_CONCAT
- COPY_PARAMS_ARE_CSV
- NORMALIZE_FUNCTIONS
- LOG_BASE_FIRST
- NULL_ORDERING
- TYPED_DIVISION
- CONCAT_COALESCE
- HEX_LOWERCASE
- DATE_FORMAT
- DATEINT_FORMAT
- FORMAT_MAPPING
- PSEUDOCOLUMNS
- PREFER_CTE_ALIAS_COLUMN
- FORCE_EARLY_ALIAS_REF_EXPANSION
- EXPAND_ALIAS_REFS_EARLY_ONLY_IN_GROUP_BY
- SUPPORTS_ORDER_BY_ALL
- HAS_DISTINCT_ARRAY_CONSTRUCTORS
- SUPPORTS_FIXED_SIZE_ARRAYS
- STRICT_JSON_PATH_SYNTAX
- ON_CONDITION_EMPTY_BEFORE_ERROR
- ARRAY_AGG_INCLUDES_NULLS
- REGEXP_EXTRACT_DEFAULT_GROUP
- SET_OP_DISTINCT_BY_DEFAULT
- CREATABLE_KIND_MAPPING
- DATE_PART_MAPPING
- TYPE_TO_EXPRESSIONS
- ANNOTATORS
- get_or_raise
- format_time
- settings
- normalize_identifier
- case_sensitive
- can_identify
- quote_identifier
- to_json_path
- parse
- parse_into
- generate
- transpile
- tokenize
- tokenizer
- jsonpath_tokenizer
- parser
- generator
180 class Tokenizer(tokens.Tokenizer): 181 QUOTES = ["'", '"'] 182 COMMENTS = ["--", "#", ("/*", "*/")] 183 IDENTIFIERS = ["`"] 184 STRING_ESCAPES = ["'", '"', "\\"] 185 BIT_STRINGS = [("b'", "'"), ("B'", "'"), ("0b", "")] 186 HEX_STRINGS = [("x'", "'"), ("X'", "'"), ("0x", "")] 187 188 KEYWORDS = { 189 **tokens.Tokenizer.KEYWORDS, 190 "CHARSET": TokenType.CHARACTER_SET, 191 "FORCE": TokenType.FORCE, 192 "IGNORE": TokenType.IGNORE, 193 "KEY": TokenType.KEY, 194 "LOCK TABLES": TokenType.COMMAND, 195 "LONGBLOB": TokenType.LONGBLOB, 196 "LONGTEXT": TokenType.LONGTEXT, 197 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 198 "TINYBLOB": TokenType.TINYBLOB, 199 "TINYTEXT": TokenType.TINYTEXT, 200 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 201 "MEDIUMINT": TokenType.MEDIUMINT, 202 "MEMBER OF": TokenType.MEMBER_OF, 203 "SEPARATOR": TokenType.SEPARATOR, 204 "START": TokenType.BEGIN, 205 "SIGNED": TokenType.BIGINT, 206 "SIGNED INTEGER": TokenType.BIGINT, 207 "UNLOCK TABLES": TokenType.COMMAND, 208 "UNSIGNED": TokenType.UBIGINT, 209 "UNSIGNED INTEGER": TokenType.UBIGINT, 210 "YEAR": TokenType.YEAR, 211 "_ARMSCII8": TokenType.INTRODUCER, 212 "_ASCII": TokenType.INTRODUCER, 213 "_BIG5": TokenType.INTRODUCER, 214 "_BINARY": TokenType.INTRODUCER, 215 "_CP1250": TokenType.INTRODUCER, 216 "_CP1251": TokenType.INTRODUCER, 217 "_CP1256": TokenType.INTRODUCER, 218 "_CP1257": TokenType.INTRODUCER, 219 "_CP850": TokenType.INTRODUCER, 220 "_CP852": TokenType.INTRODUCER, 221 "_CP866": TokenType.INTRODUCER, 222 "_CP932": TokenType.INTRODUCER, 223 "_DEC8": TokenType.INTRODUCER, 224 "_EUCJPMS": TokenType.INTRODUCER, 225 "_EUCKR": TokenType.INTRODUCER, 226 "_GB18030": TokenType.INTRODUCER, 227 "_GB2312": TokenType.INTRODUCER, 228 "_GBK": TokenType.INTRODUCER, 229 "_GEOSTD8": TokenType.INTRODUCER, 230 "_GREEK": TokenType.INTRODUCER, 231 "_HEBREW": TokenType.INTRODUCER, 232 "_HP8": TokenType.INTRODUCER, 233 "_KEYBCS2": TokenType.INTRODUCER, 234 "_KOI8R": TokenType.INTRODUCER, 235 "_KOI8U": TokenType.INTRODUCER, 236 "_LATIN1": TokenType.INTRODUCER, 237 "_LATIN2": TokenType.INTRODUCER, 238 "_LATIN5": TokenType.INTRODUCER, 239 "_LATIN7": TokenType.INTRODUCER, 240 "_MACCE": TokenType.INTRODUCER, 241 "_MACROMAN": TokenType.INTRODUCER, 242 "_SJIS": TokenType.INTRODUCER, 243 "_SWE7": TokenType.INTRODUCER, 244 "_TIS620": TokenType.INTRODUCER, 245 "_UCS2": TokenType.INTRODUCER, 246 "_UJIS": TokenType.INTRODUCER, 247 # https://dev.mysql.com/doc/refman/8.0/en/string-literals.html 248 "_UTF8": TokenType.INTRODUCER, 249 "_UTF16": TokenType.INTRODUCER, 250 "_UTF16LE": TokenType.INTRODUCER, 251 "_UTF32": TokenType.INTRODUCER, 252 "_UTF8MB3": TokenType.INTRODUCER, 253 "_UTF8MB4": TokenType.INTRODUCER, 254 "@@": TokenType.SESSION_PARAMETER, 255 } 256 257 COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.REPLACE} - {TokenType.SHOW}
KEYWORDS =
{'{%': <TokenType.BLOCK_START: 'BLOCK_START'>, '{%+': <TokenType.BLOCK_START: 'BLOCK_START'>, '{%-': <TokenType.BLOCK_START: 'BLOCK_START'>, '%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '+%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '-%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '{{+': <TokenType.BLOCK_START: 'BLOCK_START'>, '{{-': <TokenType.BLOCK_START: 'BLOCK_START'>, '+}}': <TokenType.BLOCK_END: 'BLOCK_END'>, '-}}': <TokenType.BLOCK_END: 'BLOCK_END'>, '/*+': <TokenType.HINT: 'HINT'>, '==': <TokenType.EQ: 'EQ'>, '::': <TokenType.DCOLON: 'DCOLON'>, '||': <TokenType.DPIPE: 'DPIPE'>, '>=': <TokenType.GTE: 'GTE'>, '<=': <TokenType.LTE: 'LTE'>, '<>': <TokenType.NEQ: 'NEQ'>, '!=': <TokenType.NEQ: 'NEQ'>, ':=': <TokenType.COLON_EQ: 'COLON_EQ'>, '<=>': <TokenType.NULLSAFE_EQ: 'NULLSAFE_EQ'>, '->': <TokenType.ARROW: 'ARROW'>, '->>': <TokenType.DARROW: 'DARROW'>, '=>': <TokenType.FARROW: 'FARROW'>, '#>': <TokenType.HASH_ARROW: 'HASH_ARROW'>, '#>>': <TokenType.DHASH_ARROW: 'DHASH_ARROW'>, '<->': <TokenType.LR_ARROW: 'LR_ARROW'>, '&&': <TokenType.DAMP: 'DAMP'>, '??': <TokenType.DQMARK: 'DQMARK'>, '~~~': <TokenType.GLOB: 'GLOB'>, '~~': <TokenType.LIKE: 'LIKE'>, 'ALL': <TokenType.ALL: 'ALL'>, 'ALWAYS': <TokenType.ALWAYS: 'ALWAYS'>, 'AND': <TokenType.AND: 'AND'>, 'ANTI': <TokenType.ANTI: 'ANTI'>, 'ANY': <TokenType.ANY: 'ANY'>, 'ASC': <TokenType.ASC: 'ASC'>, 'AS': <TokenType.ALIAS: 'ALIAS'>, 'ASOF': <TokenType.ASOF: 'ASOF'>, 'AUTOINCREMENT': <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, 'AUTO_INCREMENT': <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, 'BEGIN': <TokenType.BEGIN: 'BEGIN'>, 'BETWEEN': <TokenType.BETWEEN: 'BETWEEN'>, 'CACHE': <TokenType.CACHE: 'CACHE'>, 'UNCACHE': <TokenType.UNCACHE: 'UNCACHE'>, 'CASE': <TokenType.CASE: 'CASE'>, 'CHARACTER SET': <TokenType.CHARACTER_SET: 'CHARACTER_SET'>, 'CLUSTER BY': <TokenType.CLUSTER_BY: 'CLUSTER_BY'>, 'COLLATE': <TokenType.COLLATE: 'COLLATE'>, 'COLUMN': <TokenType.COLUMN: 'COLUMN'>, 'COMMIT': <TokenType.COMMIT: 'COMMIT'>, 'CONNECT BY': <TokenType.CONNECT_BY: 'CONNECT_BY'>, 'CONSTRAINT': <TokenType.CONSTRAINT: 'CONSTRAINT'>, 'COPY': <TokenType.COPY: 'COPY'>, 'CREATE': <TokenType.CREATE: 'CREATE'>, 'CROSS': <TokenType.CROSS: 'CROSS'>, 'CUBE': <TokenType.CUBE: 'CUBE'>, 'CURRENT_DATE': <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, 'CURRENT_TIME': <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, 'CURRENT_TIMESTAMP': <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, 'CURRENT_USER': <TokenType.CURRENT_USER: 'CURRENT_USER'>, 'DATABASE': <TokenType.DATABASE: 'DATABASE'>, 'DEFAULT': <TokenType.DEFAULT: 'DEFAULT'>, 'DELETE': <TokenType.DELETE: 'DELETE'>, 'DESC': <TokenType.DESC: 'DESC'>, 'DESCRIBE': <TokenType.DESCRIBE: 'DESCRIBE'>, 'DISTINCT': <TokenType.DISTINCT: 'DISTINCT'>, 'DISTRIBUTE BY': <TokenType.DISTRIBUTE_BY: 'DISTRIBUTE_BY'>, 'DIV': <TokenType.DIV: 'DIV'>, 'DROP': <TokenType.DROP: 'DROP'>, 'ELSE': <TokenType.ELSE: 'ELSE'>, 'END': <TokenType.END: 'END'>, 'ENUM': <TokenType.ENUM: 'ENUM'>, 'ESCAPE': <TokenType.ESCAPE: 'ESCAPE'>, 'EXCEPT': <TokenType.EXCEPT: 'EXCEPT'>, 'EXECUTE': <TokenType.EXECUTE: 'EXECUTE'>, 'EXISTS': <TokenType.EXISTS: 'EXISTS'>, 'FALSE': <TokenType.FALSE: 'FALSE'>, 'FETCH': <TokenType.FETCH: 'FETCH'>, 'FILTER': <TokenType.FILTER: 'FILTER'>, 'FIRST': <TokenType.FIRST: 'FIRST'>, 'FULL': <TokenType.FULL: 'FULL'>, 'FUNCTION': <TokenType.FUNCTION: 'FUNCTION'>, 'FOR': <TokenType.FOR: 'FOR'>, 'FOREIGN KEY': <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, 'FORMAT': <TokenType.FORMAT: 'FORMAT'>, 'FROM': <TokenType.FROM: 'FROM'>, 'GEOGRAPHY': <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, 'GEOMETRY': <TokenType.GEOMETRY: 'GEOMETRY'>, 'GLOB': <TokenType.GLOB: 'GLOB'>, 'GROUP BY': <TokenType.GROUP_BY: 'GROUP_BY'>, 'GROUPING SETS': <TokenType.GROUPING_SETS: 'GROUPING_SETS'>, 'HAVING': <TokenType.HAVING: 'HAVING'>, 'ILIKE': <TokenType.ILIKE: 'ILIKE'>, 'IN': <TokenType.IN: 'IN'>, 'INDEX': <TokenType.INDEX: 'INDEX'>, 'INET': <TokenType.INET: 'INET'>, 'INNER': <TokenType.INNER: 'INNER'>, 'INSERT': <TokenType.INSERT: 'INSERT'>, 'INTERVAL': <TokenType.INTERVAL: 'INTERVAL'>, 'INTERSECT': <TokenType.INTERSECT: 'INTERSECT'>, 'INTO': <TokenType.INTO: 'INTO'>, 'IS': <TokenType.IS: 'IS'>, 'ISNULL': <TokenType.ISNULL: 'ISNULL'>, 'JOIN': <TokenType.JOIN: 'JOIN'>, 'KEEP': <TokenType.KEEP: 'KEEP'>, 'KILL': <TokenType.KILL: 'KILL'>, 'LATERAL': <TokenType.LATERAL: 'LATERAL'>, 'LEFT': <TokenType.LEFT: 'LEFT'>, 'LIKE': <TokenType.LIKE: 'LIKE'>, 'LIMIT': <TokenType.LIMIT: 'LIMIT'>, 'LOAD': <TokenType.LOAD: 'LOAD'>, 'LOCK': <TokenType.LOCK: 'LOCK'>, 'MERGE': <TokenType.MERGE: 'MERGE'>, 'NATURAL': <TokenType.NATURAL: 'NATURAL'>, 'NEXT': <TokenType.NEXT: 'NEXT'>, 'NOT': <TokenType.NOT: 'NOT'>, 'NOTNULL': <TokenType.NOTNULL: 'NOTNULL'>, 'NULL': <TokenType.NULL: 'NULL'>, 'OBJECT': <TokenType.OBJECT: 'OBJECT'>, 'OFFSET': <TokenType.OFFSET: 'OFFSET'>, 'ON': <TokenType.ON: 'ON'>, 'OR': <TokenType.OR: 'OR'>, 'XOR': <TokenType.XOR: 'XOR'>, 'ORDER BY': <TokenType.ORDER_BY: 'ORDER_BY'>, 'ORDINALITY': <TokenType.ORDINALITY: 'ORDINALITY'>, 'OUTER': <TokenType.OUTER: 'OUTER'>, 'OVER': <TokenType.OVER: 'OVER'>, 'OVERLAPS': <TokenType.OVERLAPS: 'OVERLAPS'>, 'OVERWRITE': <TokenType.OVERWRITE: 'OVERWRITE'>, 'PARTITION': <TokenType.PARTITION: 'PARTITION'>, 'PARTITION BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PARTITIONED BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PARTITIONED_BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PERCENT': <TokenType.PERCENT: 'PERCENT'>, 'PIVOT': <TokenType.PIVOT: 'PIVOT'>, 'PRAGMA': <TokenType.PRAGMA: 'PRAGMA'>, 'PRIMARY KEY': <TokenType.PRIMARY_KEY: 'PRIMARY_KEY'>, 'PROCEDURE': <TokenType.PROCEDURE: 'PROCEDURE'>, 'QUALIFY': <TokenType.QUALIFY: 'QUALIFY'>, 'RANGE': <TokenType.RANGE: 'RANGE'>, 'RECURSIVE': <TokenType.RECURSIVE: 'RECURSIVE'>, 'REGEXP': <TokenType.RLIKE: 'RLIKE'>, 'RENAME': <TokenType.RENAME: 'RENAME'>, 'REPLACE': <TokenType.REPLACE: 'REPLACE'>, 'RETURNING': <TokenType.RETURNING: 'RETURNING'>, 'REFERENCES': <TokenType.REFERENCES: 'REFERENCES'>, 'RIGHT': <TokenType.RIGHT: 'RIGHT'>, 'RLIKE': <TokenType.RLIKE: 'RLIKE'>, 'ROLLBACK': <TokenType.ROLLBACK: 'ROLLBACK'>, 'ROLLUP': <TokenType.ROLLUP: 'ROLLUP'>, 'ROW': <TokenType.ROW: 'ROW'>, 'ROWS': <TokenType.ROWS: 'ROWS'>, 'SCHEMA': <TokenType.SCHEMA: 'SCHEMA'>, 'SELECT': <TokenType.SELECT: 'SELECT'>, 'SEMI': <TokenType.SEMI: 'SEMI'>, 'SET': <TokenType.SET: 'SET'>, 'SETTINGS': <TokenType.SETTINGS: 'SETTINGS'>, 'SHOW': <TokenType.SHOW: 'SHOW'>, 'SIMILAR TO': <TokenType.SIMILAR_TO: 'SIMILAR_TO'>, 'SOME': <TokenType.SOME: 'SOME'>, 'SORT BY': <TokenType.SORT_BY: 'SORT_BY'>, 'START WITH': <TokenType.START_WITH: 'START_WITH'>, 'STRAIGHT_JOIN': <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, 'TABLE': <TokenType.TABLE: 'TABLE'>, 'TABLESAMPLE': <TokenType.TABLE_SAMPLE: 'TABLE_SAMPLE'>, 'TEMP': <TokenType.TEMPORARY: 'TEMPORARY'>, 'TEMPORARY': <TokenType.TEMPORARY: 'TEMPORARY'>, 'THEN': <TokenType.THEN: 'THEN'>, 'TRUE': <TokenType.TRUE: 'TRUE'>, 'TRUNCATE': <TokenType.TRUNCATE: 'TRUNCATE'>, 'UNION': <TokenType.UNION: 'UNION'>, 'UNKNOWN': <TokenType.UNKNOWN: 'UNKNOWN'>, 'UNNEST': <TokenType.UNNEST: 'UNNEST'>, 'UNPIVOT': <TokenType.UNPIVOT: 'UNPIVOT'>, 'UPDATE': <TokenType.UPDATE: 'UPDATE'>, 'USE': <TokenType.USE: 'USE'>, 'USING': <TokenType.USING: 'USING'>, 'UUID': <TokenType.UUID: 'UUID'>, 'VALUES': <TokenType.VALUES: 'VALUES'>, 'VIEW': <TokenType.VIEW: 'VIEW'>, 'VOLATILE': <TokenType.VOLATILE: 'VOLATILE'>, 'WHEN': <TokenType.WHEN: 'WHEN'>, 'WHERE': <TokenType.WHERE: 'WHERE'>, 'WINDOW': <TokenType.WINDOW: 'WINDOW'>, 'WITH': <TokenType.WITH: 'WITH'>, 'APPLY': <TokenType.APPLY: 'APPLY'>, 'ARRAY': <TokenType.ARRAY: 'ARRAY'>, 'BIT': <TokenType.BIT: 'BIT'>, 'BOOL': <TokenType.BOOLEAN: 'BOOLEAN'>, 'BOOLEAN': <TokenType.BOOLEAN: 'BOOLEAN'>, 'BYTE': <TokenType.TINYINT: 'TINYINT'>, 'MEDIUMINT': <TokenType.MEDIUMINT: 'MEDIUMINT'>, 'INT1': <TokenType.TINYINT: 'TINYINT'>, 'TINYINT': <TokenType.TINYINT: 'TINYINT'>, 'INT16': <TokenType.SMALLINT: 'SMALLINT'>, 'SHORT': <TokenType.SMALLINT: 'SMALLINT'>, 'SMALLINT': <TokenType.SMALLINT: 'SMALLINT'>, 'INT128': <TokenType.INT128: 'INT128'>, 'HUGEINT': <TokenType.INT128: 'INT128'>, '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'>, 'LONG': <TokenType.BIGINT: 'BIGINT'>, 'BIGINT': <TokenType.BIGINT: 'BIGINT'>, 'INT8': <TokenType.TINYINT: 'TINYINT'>, 'UINT': <TokenType.UINT: 'UINT'>, 'DEC': <TokenType.DECIMAL: 'DECIMAL'>, 'DECIMAL': <TokenType.DECIMAL: 'DECIMAL'>, 'DECIMAL32': <TokenType.DECIMAL32: 'DECIMAL32'>, 'DECIMAL64': <TokenType.DECIMAL64: 'DECIMAL64'>, 'DECIMAL128': <TokenType.DECIMAL128: 'DECIMAL128'>, 'BIGDECIMAL': <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, 'BIGNUMERIC': <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, 'LIST': <TokenType.LIST: 'LIST'>, 'MAP': <TokenType.MAP: 'MAP'>, 'NULLABLE': <TokenType.NULLABLE: 'NULLABLE'>, 'NUMBER': <TokenType.DECIMAL: 'DECIMAL'>, 'NUMERIC': <TokenType.DECIMAL: 'DECIMAL'>, 'FIXED': <TokenType.DECIMAL: 'DECIMAL'>, 'REAL': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT4': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT8': <TokenType.DOUBLE: 'DOUBLE'>, 'DOUBLE': <TokenType.DOUBLE: 'DOUBLE'>, 'DOUBLE PRECISION': <TokenType.DOUBLE: 'DOUBLE'>, 'JSON': <TokenType.JSON: 'JSON'>, 'JSONB': <TokenType.JSONB: 'JSONB'>, 'CHAR': <TokenType.CHAR: 'CHAR'>, 'CHARACTER': <TokenType.CHAR: 'CHAR'>, 'NCHAR': <TokenType.NCHAR: 'NCHAR'>, 'VARCHAR': <TokenType.VARCHAR: 'VARCHAR'>, 'VARCHAR2': <TokenType.VARCHAR: 'VARCHAR'>, 'NVARCHAR': <TokenType.NVARCHAR: 'NVARCHAR'>, 'NVARCHAR2': <TokenType.NVARCHAR: 'NVARCHAR'>, 'BPCHAR': <TokenType.BPCHAR: 'BPCHAR'>, 'STR': <TokenType.TEXT: 'TEXT'>, 'STRING': <TokenType.TEXT: 'TEXT'>, 'TEXT': <TokenType.TEXT: 'TEXT'>, 'LONGTEXT': <TokenType.LONGTEXT: 'LONGTEXT'>, 'MEDIUMTEXT': <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, 'TINYTEXT': <TokenType.TINYTEXT: 'TINYTEXT'>, 'CLOB': <TokenType.TEXT: 'TEXT'>, 'LONGVARCHAR': <TokenType.TEXT: 'TEXT'>, 'BINARY': <TokenType.BINARY: 'BINARY'>, 'BLOB': <TokenType.VARBINARY: 'VARBINARY'>, 'LONGBLOB': <TokenType.LONGBLOB: 'LONGBLOB'>, 'MEDIUMBLOB': <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, 'TINYBLOB': <TokenType.TINYBLOB: 'TINYBLOB'>, 'BYTEA': <TokenType.VARBINARY: 'VARBINARY'>, 'VARBINARY': <TokenType.VARBINARY: 'VARBINARY'>, 'TIME': <TokenType.TIME: 'TIME'>, 'TIMETZ': <TokenType.TIMETZ: 'TIMETZ'>, 'TIMESTAMP': <TokenType.TIMESTAMP: 'TIMESTAMP'>, 'TIMESTAMPTZ': <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, 'TIMESTAMPLTZ': <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, 'TIMESTAMP_LTZ': <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, 'TIMESTAMPNTZ': <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, 'TIMESTAMP_NTZ': <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, 'DATE': <TokenType.DATE: 'DATE'>, 'DATETIME': <TokenType.DATETIME: 'DATETIME'>, 'INT4RANGE': <TokenType.INT4RANGE: 'INT4RANGE'>, 'INT4MULTIRANGE': <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, 'INT8RANGE': <TokenType.INT8RANGE: 'INT8RANGE'>, 'INT8MULTIRANGE': <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, 'NUMRANGE': <TokenType.NUMRANGE: 'NUMRANGE'>, 'NUMMULTIRANGE': <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, 'TSRANGE': <TokenType.TSRANGE: 'TSRANGE'>, 'TSMULTIRANGE': <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, 'TSTZRANGE': <TokenType.TSTZRANGE: 'TSTZRANGE'>, 'TSTZMULTIRANGE': <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, 'DATERANGE': <TokenType.DATERANGE: 'DATERANGE'>, 'DATEMULTIRANGE': <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, 'UNIQUE': <TokenType.UNIQUE: 'UNIQUE'>, 'VECTOR': <TokenType.VECTOR: 'VECTOR'>, 'STRUCT': <TokenType.STRUCT: 'STRUCT'>, 'SEQUENCE': <TokenType.SEQUENCE: 'SEQUENCE'>, 'VARIANT': <TokenType.VARIANT: 'VARIANT'>, 'ALTER': <TokenType.ALTER: 'ALTER'>, 'ANALYZE': <TokenType.COMMAND: 'COMMAND'>, 'CALL': <TokenType.COMMAND: 'COMMAND'>, 'COMMENT': <TokenType.COMMENT: 'COMMENT'>, 'EXPLAIN': <TokenType.COMMAND: 'COMMAND'>, 'GRANT': <TokenType.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'>, '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.EXECUTE: 'EXECUTE'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.FETCH: 'FETCH'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.RENAME: 'RENAME'>}
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- SINGLE_TOKENS
- BYTE_STRINGS
- RAW_STRINGS
- HEREDOC_STRINGS
- UNICODE_STRINGS
- IDENTIFIER_ESCAPES
- VAR_SINGLE_TOKENS
- HEREDOC_TAG_IS_IDENTIFIER
- HEREDOC_STRING_ALTERNATIVE
- STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS
- NESTED_COMMENTS
- WHITE_SPACE
- COMMAND_PREFIX_TOKENS
- NUMERIC_LITERALS
- dialect
- reset
- tokenize
- tokenize_rs
- size
- sql
- tokens
259 class Parser(parser.Parser): 260 FUNC_TOKENS = { 261 *parser.Parser.FUNC_TOKENS, 262 TokenType.DATABASE, 263 TokenType.SCHEMA, 264 TokenType.VALUES, 265 } 266 267 CONJUNCTION = { 268 **parser.Parser.CONJUNCTION, 269 TokenType.DAMP: exp.And, 270 TokenType.XOR: exp.Xor, 271 } 272 273 DISJUNCTION = { 274 **parser.Parser.DISJUNCTION, 275 TokenType.DPIPE: exp.Or, 276 } 277 278 TABLE_ALIAS_TOKENS = ( 279 parser.Parser.TABLE_ALIAS_TOKENS - parser.Parser.TABLE_INDEX_HINT_TOKENS 280 ) 281 282 RANGE_PARSERS = { 283 **parser.Parser.RANGE_PARSERS, 284 TokenType.MEMBER_OF: lambda self, this: self.expression( 285 exp.JSONArrayContains, 286 this=this, 287 expression=self._parse_wrapped(self._parse_expression), 288 ), 289 } 290 291 FUNCTIONS = { 292 **parser.Parser.FUNCTIONS, 293 "CONVERT_TZ": lambda args: exp.ConvertTimezone( 294 source_tz=seq_get(args, 1), target_tz=seq_get(args, 2), timestamp=seq_get(args, 0) 295 ), 296 "DATE": lambda args: exp.TsOrDsToDate(this=seq_get(args, 0)), 297 "DATE_ADD": build_date_delta_with_interval(exp.DateAdd), 298 "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "mysql"), 299 "DATE_SUB": build_date_delta_with_interval(exp.DateSub), 300 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 301 "DAYOFMONTH": lambda args: exp.DayOfMonth(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 302 "DAYOFWEEK": lambda args: exp.DayOfWeek(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 303 "DAYOFYEAR": lambda args: exp.DayOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 304 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 305 "ISNULL": isnull_to_is_null, 306 "LOCATE": locate_to_strposition, 307 "MAKETIME": exp.TimeFromParts.from_arg_list, 308 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 309 "MONTHNAME": lambda args: exp.TimeToStr( 310 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 311 format=exp.Literal.string("%B"), 312 ), 313 "STR_TO_DATE": _str_to_date, 314 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 315 "TO_DAYS": lambda args: exp.paren( 316 exp.DateDiff( 317 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 318 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 319 unit=exp.var("DAY"), 320 ) 321 + 1 322 ), 323 "WEEK": lambda args: exp.Week( 324 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 325 ), 326 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 327 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 328 } 329 330 FUNCTION_PARSERS = { 331 **parser.Parser.FUNCTION_PARSERS, 332 "CHAR": lambda self: self.expression( 333 exp.Chr, 334 expressions=self._parse_csv(self._parse_assignment), 335 charset=self._match(TokenType.USING) and self._parse_var(), 336 ), 337 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 338 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 339 "VALUES": lambda self: self.expression( 340 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 341 ), 342 "JSON_VALUE": lambda self: self._parse_json_value(), 343 } 344 345 STATEMENT_PARSERS = { 346 **parser.Parser.STATEMENT_PARSERS, 347 TokenType.SHOW: lambda self: self._parse_show(), 348 } 349 350 SHOW_PARSERS = { 351 "BINARY LOGS": _show_parser("BINARY LOGS"), 352 "MASTER LOGS": _show_parser("BINARY LOGS"), 353 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 354 "CHARACTER SET": _show_parser("CHARACTER SET"), 355 "CHARSET": _show_parser("CHARACTER SET"), 356 "COLLATION": _show_parser("COLLATION"), 357 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 358 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 359 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 360 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 361 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 362 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 363 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 364 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 365 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 366 "DATABASES": _show_parser("DATABASES"), 367 "SCHEMAS": _show_parser("DATABASES"), 368 "ENGINE": _show_parser("ENGINE", target=True), 369 "STORAGE ENGINES": _show_parser("ENGINES"), 370 "ENGINES": _show_parser("ENGINES"), 371 "ERRORS": _show_parser("ERRORS"), 372 "EVENTS": _show_parser("EVENTS"), 373 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 374 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 375 "GRANTS": _show_parser("GRANTS", target="FOR"), 376 "INDEX": _show_parser("INDEX", target="FROM"), 377 "MASTER STATUS": _show_parser("MASTER STATUS"), 378 "OPEN TABLES": _show_parser("OPEN TABLES"), 379 "PLUGINS": _show_parser("PLUGINS"), 380 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 381 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 382 "PRIVILEGES": _show_parser("PRIVILEGES"), 383 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 384 "PROCESSLIST": _show_parser("PROCESSLIST"), 385 "PROFILE": _show_parser("PROFILE"), 386 "PROFILES": _show_parser("PROFILES"), 387 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 388 "REPLICAS": _show_parser("REPLICAS"), 389 "SLAVE HOSTS": _show_parser("REPLICAS"), 390 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 391 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 392 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 393 "SESSION STATUS": _show_parser("STATUS"), 394 "STATUS": _show_parser("STATUS"), 395 "TABLE STATUS": _show_parser("TABLE STATUS"), 396 "FULL TABLES": _show_parser("TABLES", full=True), 397 "TABLES": _show_parser("TABLES"), 398 "TRIGGERS": _show_parser("TRIGGERS"), 399 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 400 "SESSION VARIABLES": _show_parser("VARIABLES"), 401 "VARIABLES": _show_parser("VARIABLES"), 402 "WARNINGS": _show_parser("WARNINGS"), 403 } 404 405 PROPERTY_PARSERS = { 406 **parser.Parser.PROPERTY_PARSERS, 407 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 408 } 409 410 SET_PARSERS = { 411 **parser.Parser.SET_PARSERS, 412 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 413 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 414 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 415 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 416 "NAMES": lambda self: self._parse_set_item_names(), 417 } 418 419 CONSTRAINT_PARSERS = { 420 **parser.Parser.CONSTRAINT_PARSERS, 421 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 422 "INDEX": lambda self: self._parse_index_constraint(), 423 "KEY": lambda self: self._parse_index_constraint(), 424 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 425 } 426 427 ALTER_PARSERS = { 428 **parser.Parser.ALTER_PARSERS, 429 "MODIFY": lambda self: self._parse_alter_table_alter(), 430 } 431 432 SCHEMA_UNNAMED_CONSTRAINTS = { 433 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 434 "FULLTEXT", 435 "INDEX", 436 "KEY", 437 "SPATIAL", 438 } 439 440 PROFILE_TYPES: parser.OPTIONS_TYPE = { 441 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 442 "BLOCK": ("IO",), 443 "CONTEXT": ("SWITCHES",), 444 "PAGE": ("FAULTS",), 445 } 446 447 TYPE_TOKENS = { 448 *parser.Parser.TYPE_TOKENS, 449 TokenType.SET, 450 } 451 452 ENUM_TYPE_TOKENS = { 453 *parser.Parser.ENUM_TYPE_TOKENS, 454 TokenType.SET, 455 } 456 457 LOG_DEFAULTS_TO_LN = True 458 STRING_ALIASES = True 459 VALUES_FOLLOWED_BY_PAREN = False 460 SUPPORTS_PARTITION_SELECTION = True 461 462 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 463 this = self._parse_id_var() 464 if not self._match(TokenType.L_PAREN): 465 return this 466 467 expression = self._parse_number() 468 self._match_r_paren() 469 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 470 471 def _parse_index_constraint( 472 self, kind: t.Optional[str] = None 473 ) -> exp.IndexColumnConstraint: 474 if kind: 475 self._match_texts(("INDEX", "KEY")) 476 477 this = self._parse_id_var(any_token=False) 478 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 479 expressions = self._parse_wrapped_csv(self._parse_ordered) 480 481 options = [] 482 while True: 483 if self._match_text_seq("KEY_BLOCK_SIZE"): 484 self._match(TokenType.EQ) 485 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 486 elif self._match(TokenType.USING): 487 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 488 elif self._match_text_seq("WITH", "PARSER"): 489 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 490 elif self._match(TokenType.COMMENT): 491 opt = exp.IndexConstraintOption(comment=self._parse_string()) 492 elif self._match_text_seq("VISIBLE"): 493 opt = exp.IndexConstraintOption(visible=True) 494 elif self._match_text_seq("INVISIBLE"): 495 opt = exp.IndexConstraintOption(visible=False) 496 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 497 self._match(TokenType.EQ) 498 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 499 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 500 self._match(TokenType.EQ) 501 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 502 else: 503 opt = None 504 505 if not opt: 506 break 507 508 options.append(opt) 509 510 return self.expression( 511 exp.IndexColumnConstraint, 512 this=this, 513 expressions=expressions, 514 kind=kind, 515 index_type=index_type, 516 options=options, 517 ) 518 519 def _parse_show_mysql( 520 self, 521 this: str, 522 target: bool | str = False, 523 full: t.Optional[bool] = None, 524 global_: t.Optional[bool] = None, 525 ) -> exp.Show: 526 if target: 527 if isinstance(target, str): 528 self._match_text_seq(target) 529 target_id = self._parse_id_var() 530 else: 531 target_id = None 532 533 log = self._parse_string() if self._match_text_seq("IN") else None 534 535 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 536 position = self._parse_number() if self._match_text_seq("FROM") else None 537 db = None 538 else: 539 position = None 540 db = None 541 542 if self._match(TokenType.FROM): 543 db = self._parse_id_var() 544 elif self._match(TokenType.DOT): 545 db = target_id 546 target_id = self._parse_id_var() 547 548 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 549 550 like = self._parse_string() if self._match_text_seq("LIKE") else None 551 where = self._parse_where() 552 553 if this == "PROFILE": 554 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 555 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 556 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 557 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 558 else: 559 types, query = None, None 560 offset, limit = self._parse_oldstyle_limit() 561 562 mutex = True if self._match_text_seq("MUTEX") else None 563 mutex = False if self._match_text_seq("STATUS") else mutex 564 565 return self.expression( 566 exp.Show, 567 this=this, 568 target=target_id, 569 full=full, 570 log=log, 571 position=position, 572 db=db, 573 channel=channel, 574 like=like, 575 where=where, 576 types=types, 577 query=query, 578 offset=offset, 579 limit=limit, 580 mutex=mutex, 581 **{"global": global_}, # type: ignore 582 ) 583 584 def _parse_oldstyle_limit( 585 self, 586 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 587 limit = None 588 offset = None 589 if self._match_text_seq("LIMIT"): 590 parts = self._parse_csv(self._parse_number) 591 if len(parts) == 1: 592 limit = parts[0] 593 elif len(parts) == 2: 594 limit = parts[1] 595 offset = parts[0] 596 597 return offset, limit 598 599 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 600 this = self._parse_string() or self._parse_unquoted_field() 601 return self.expression(exp.SetItem, this=this, kind=kind) 602 603 def _parse_set_item_names(self) -> exp.Expression: 604 charset = self._parse_string() or self._parse_unquoted_field() 605 if self._match_text_seq("COLLATE"): 606 collate = self._parse_string() or self._parse_unquoted_field() 607 else: 608 collate = None 609 610 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 611 612 def _parse_type( 613 self, parse_interval: bool = True, fallback_to_identifier: bool = False 614 ) -> t.Optional[exp.Expression]: 615 # mysql binary is special and can work anywhere, even in order by operations 616 # it operates like a no paren func 617 if self._match(TokenType.BINARY, advance=False): 618 data_type = self._parse_types(check_func=True, allow_identifiers=False) 619 620 if isinstance(data_type, exp.DataType): 621 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 622 623 return super()._parse_type( 624 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 625 ) 626 627 def _parse_group_concat(self) -> t.Optional[exp.Expression]: 628 def concat_exprs( 629 node: t.Optional[exp.Expression], exprs: t.List[exp.Expression] 630 ) -> exp.Expression: 631 if isinstance(node, exp.Distinct) and len(node.expressions) > 1: 632 concat_exprs = [ 633 self.expression(exp.Concat, expressions=node.expressions, safe=True) 634 ] 635 node.set("expressions", concat_exprs) 636 return node 637 if len(exprs) == 1: 638 return exprs[0] 639 return self.expression(exp.Concat, expressions=args, safe=True) 640 641 args = self._parse_csv(self._parse_lambda) 642 643 if args: 644 order = args[-1] if isinstance(args[-1], exp.Order) else None 645 646 if order: 647 # Order By is the last (or only) expression in the list and has consumed the 'expr' before it, 648 # remove 'expr' from exp.Order and add it back to args 649 args[-1] = order.this 650 order.set("this", concat_exprs(order.this, args)) 651 652 this = order or concat_exprs(args[0], args) 653 else: 654 this = None 655 656 separator = self._parse_field() if self._match(TokenType.SEPARATOR) else None 657 658 return self.expression(exp.GroupConcat, this=this, separator=separator) 659 660 def _parse_json_value(self) -> exp.JSONValue: 661 this = self._parse_bitwise() 662 self._match(TokenType.COMMA) 663 path = self._parse_bitwise() 664 665 returning = self._match(TokenType.RETURNING) and self._parse_type() 666 667 return self.expression( 668 exp.JSONValue, 669 this=this, 670 path=self.dialect.to_json_path(path), 671 returning=returning, 672 on_condition=self._parse_on_condition(), 673 )
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.FIRST: 'FIRST'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.LIST: 'LIST'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.TEXT: 'TEXT'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.TABLE: 'TABLE'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.UINT: 'UINT'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.SOME: 'SOME'>, <TokenType.FILTER: 'FILTER'>, <TokenType.RLIKE: 'RLIKE'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.BIT: 'BIT'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.ILIKE: 'ILIKE'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.NAME: 'NAME'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.ENUM: 'ENUM'>, <TokenType.UNION: 'UNION'>, <TokenType.RANGE: 'RANGE'>, <TokenType.XOR: 'XOR'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.PRIMARY_KEY: 'PRIMARY_KEY'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.ROW: 'ROW'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.VAR: 'VAR'>, <TokenType.ALL: 'ALL'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.UINT128: 'UINT128'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.BINARY: 'BINARY'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.INET: 'INET'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.DATE32: 'DATE32'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.VALUES: 'VALUES'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.JSON: 'JSON'>, <TokenType.UUID: 'UUID'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.MAP: 'MAP'>, <TokenType.MERGE: 'MERGE'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.INT128: 'INT128'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.INT256: 'INT256'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.INT: 'INT'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.SUPER: 'SUPER'>, <TokenType.INDEX: 'INDEX'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.UINT256: 'UINT256'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.LIKE: 'LIKE'>, <TokenType.DATE: 'DATE'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.JSONB: 'JSONB'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.ANY: 'ANY'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.NULL: 'NULL'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.INSERT: 'INSERT'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.MONEY: 'MONEY'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.CHAR: 'CHAR'>, <TokenType.LEFT: 'LEFT'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.XML: 'XML'>, <TokenType.GLOB: 'GLOB'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.IPV4: 'IPV4'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.TIME: 'TIME'>, <TokenType.IPV6: 'IPV6'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.YEAR: 'YEAR'>}
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.FIRST: 'FIRST'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.LIST: 'LIST'>, <TokenType.SEMI: 'SEMI'>, <TokenType.NEXT: 'NEXT'>, <TokenType.SET: 'SET'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.CASE: 'CASE'>, <TokenType.END: 'END'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.CACHE: 'CACHE'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.TEXT: 'TEXT'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.DELETE: 'DELETE'>, <TokenType.ASC: 'ASC'>, <TokenType.DIV: 'DIV'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.TABLE: 'TABLE'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.COPY: 'COPY'>, <TokenType.UINT: 'UINT'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.SOME: 'SOME'>, <TokenType.FILTER: 'FILTER'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.BIT: 'BIT'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.NAME: 'NAME'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.ENUM: 'ENUM'>, <TokenType.RANGE: 'RANGE'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.FINAL: 'FINAL'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.TAG: 'TAG'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.CUBE: 'CUBE'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.ROW: 'ROW'>, <TokenType.RENAME: 'RENAME'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.ALL: 'ALL'>, <TokenType.VAR: 'VAR'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.ANTI: 'ANTI'>, <TokenType.UINT128: 'UINT128'>, <TokenType.BINARY: 'BINARY'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.INET: 'INET'>, <TokenType.DATE32: 'DATE32'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.JSON: 'JSON'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.ROWS: 'ROWS'>, <TokenType.UUID: 'UUID'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.MAP: 'MAP'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.MERGE: 'MERGE'>, <TokenType.TOP: 'TOP'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.INT128: 'INT128'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.KEEP: 'KEEP'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.SHOW: 'SHOW'>, <TokenType.INT256: 'INT256'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.INT: 'INT'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.TRUE: 'TRUE'>, <TokenType.MODEL: 'MODEL'>, <TokenType.LOAD: 'LOAD'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.SUPER: 'SUPER'>, <TokenType.INDEX: 'INDEX'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.KILL: 'KILL'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.UINT256: 'UINT256'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.DATE: 'DATE'>, <TokenType.JSONB: 'JSONB'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.FALSE: 'FALSE'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.VIEW: 'VIEW'>, <TokenType.ANY: 'ANY'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.NULL: 'NULL'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.MONEY: 'MONEY'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.CHAR: 'CHAR'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.XML: 'XML'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.IPV4: 'IPV4'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.TIME: 'TIME'>, <TokenType.IPV6: 'IPV6'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.DESC: 'DESC'>, <TokenType.IS: 'IS'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.YEAR: 'YEAR'>}
RANGE_PARSERS =
{<TokenType.BETWEEN: 'BETWEEN'>: <function Parser.<lambda>>, <TokenType.GLOB: 'GLOB'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ILIKE: 'ILIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IN: 'IN'>: <function Parser.<lambda>>, <TokenType.IRLIKE: 'IRLIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IS: 'IS'>: <function Parser.<lambda>>, <TokenType.LIKE: 'LIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.OVERLAPS: 'OVERLAPS'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.RLIKE: 'RLIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.SIMILAR_TO: 'SIMILAR_TO'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.FOR: 'FOR'>: <function Parser.<lambda>>, <TokenType.MEMBER_OF: 'MEMBER_OF'>: <function MySQL.Parser.<lambda>>}
FUNCTIONS =
{'ABS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Abs'>>, 'ADD_MONTHS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AddMonths'>>, 'ANONYMOUS_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AnonymousAggFunc'>>, 'ANY_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AnyValue'>>, '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_CONSTRUCT_COMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConstructCompact'>>, 'ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContains'>>, 'ARRAY_HAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContains'>>, 'ARRAY_CONTAINS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContainsAll'>>, 'ARRAY_HAS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContainsAll'>>, 'FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayFilter'>>, 'ARRAY_FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayFilter'>>, 'ARRAY_OVERLAPS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayOverlaps'>>, 'ARRAY_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySize'>>, 'ARRAY_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySize'>>, 'ARRAY_SORT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySort'>>, 'ARRAY_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySum'>>, 'ARRAY_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayToString'>>, 'ARRAY_JOIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayToString'>>, 'ARRAY_UNION_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayUnionAgg'>>, 'ARRAY_UNIQUE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayUniqueAgg'>>, 'AVG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Avg'>>, 'CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Case'>>, 'CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cast'>>, 'CAST_TO_STR_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CastToStrType'>>, 'CBRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cbrt'>>, 'CEIL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ceil'>>, 'CEILING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ceil'>>, 'CHR': <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'>>, 'CONVERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Convert'>>, 'CONVERT_TIMEZONE': <function build_convert_timezone>, 'CORR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Corr'>>, 'COUNT': <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_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTime'>>, 'CURRENT_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTimestamp'>>, 'CURRENT_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentUser'>>, 'DATE': <function MySQL.Parser.<lambda>>, 'DATE_ADD': <function build_date_delta_with_interval.<locals>._builder>, 'DATEDIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateDiff'>>, 'DATE_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateDiff'>>, 'DATE_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromParts'>>, 'DATEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromParts'>>, 'DATE_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateStrToDate'>>, 'DATE_SUB': <function build_date_delta_with_interval.<locals>._builder>, 'DATE_TO_DATE_STR': <function Parser.<lambda>>, 'DATE_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateToDi'>>, 'DATE_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateTrunc'>>, 'DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Datetime'>>, 'DATETIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeAdd'>>, 'DATETIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeDiff'>>, 'DATETIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeSub'>>, 'DATETIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeTrunc'>>, 'DAY': <function MySQL.Parser.<lambda>>, 'DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfMonth'>>, 'DAYOFMONTH': <function MySQL.Parser.<lambda>>, 'DAY_OF_WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfWeek'>>, 'DAYOFWEEK': <function MySQL.Parser.<lambda>>, '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'>>, 'EXP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Exp'>>, 'EXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Explode'>>, 'EXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ExplodeOuter'>>, 'EXPLODING_GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ExplodingGenerateSeries'>>, 'EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Extract'>>, 'FIRST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.First'>>, 'FIRST_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FirstValue'>>, 'FLATTEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Flatten'>>, 'FLOOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Floor'>>, 'FROM_BASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase'>>, 'FROM_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase64'>>, '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'>>, 'IS_INF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsInf'>>, 'ISINF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsInf'>>, 'IS_NAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsNan'>>, 'ISNAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsNan'>>, 'J_S_O_N_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArray'>>, 'J_S_O_N_ARRAY_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayAgg'>>, 'JSON_ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayContains'>>, 'JSONB_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBContains'>>, 'JSONB_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBExtract'>>, 'JSONB_EXTRACT_SCALAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBExtractScalar'>>, '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_SCALAR': <function build_extract_json_with_path.<locals>._builder>, 'JSON_FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONFormat'>>, 'J_S_O_N_OBJECT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONObject'>>, 'J_S_O_N_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONObjectAgg'>>, 'J_S_O_N_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONTable'>>, 'LAG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lag'>>, 'LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Last'>>, 'LAST_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LastDay'>>, 'LAST_DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LastDay'>>, 'LAST_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LastValue'>>, 'LEAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lead'>>, 'LEAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Least'>>, 'LEFT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Left'>>, 'LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'LEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'LEVENSHTEIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Levenshtein'>>, 'LIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.List'>>, 'LN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ln'>>, 'LOG': <function build_logarithm>, 'LOGICAL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'BOOL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'BOOLAND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'LOGICAL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'BOOL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'BOOLOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'LOWER': <function build_lower>, 'LCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lower'>>, 'LOWER_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LowerHex'>>, 'MD5': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5'>>, 'MD5_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5Digest'>>, 'MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Map'>>, 'MAP_FROM_ENTRIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MapFromEntries'>>, 'MATCH_AGAINST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MatchAgainst'>>, 'MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Max'>>, 'MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Min'>>, 'MONTH': <function MySQL.Parser.<lambda>>, 'MONTHS_BETWEEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MonthsBetween'>>, 'NEXT_VALUE_FOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NextValueFor'>>, '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'>>, '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_I_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpILike'>>, 'REGEXP_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpLike'>>, 'REGEXP_REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpReplace'>>, 'REGEXP_SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpSplit'>>, 'REPEAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Repeat'>>, 'RIGHT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Right'>>, 'ROUND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Round'>>, 'ROW_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RowNumber'>>, 'SHA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA2'>>, 'SAFE_DIVIDE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeDivide'>>, 'SIGN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SIGNUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SORT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SortArray'>>, 'SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Split'>>, 'SQRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sqrt'>>, 'STANDARD_HASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StandardHash'>>, 'STAR_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StarMap'>>, 'STARTS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STARTSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STDDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDDEV_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevPop'>>, 'STDDEV_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevSamp'>>, 'STR_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrPosition'>>, 'STR_TO_DATE': <function _str_to_date>, 'STR_TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToMap'>>, 'STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToTime'>>, 'STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToUnix'>>, 'STRING_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'SPLIT_BY_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'STRUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Struct'>>, 'STRUCT_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StructExtract'>>, 'STUFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'SUBSTRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Substring'>>, '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_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToMap'>>, 'TO_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToNumber'>>, 'TRANSFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Transform'>>, 'TRIM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Trim'>>, 'TRY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Try'>>, 'TRY_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryCast'>>, 'TS_OR_DI_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDiToDi'>>, 'TS_OR_DS_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsAdd'>>, 'TS_OR_DS_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsDiff'>>, 'TS_OR_DS_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToDate'>>, 'TS_OR_DS_TO_DATE_STR': <function Parser.<lambda>>, 'TS_OR_DS_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToTime'>>, 'TS_OR_DS_TO_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToTimestamp'>>, 'UNHEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Unhex'>>, 'UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixDate'>>, 'UNIX_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToStr'>>, 'UNIX_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToTime'>>, 'UNIX_TO_TIME_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToTimeStr'>>, 'UNNEST': <function Parser.<lambda>>, 'UPPER': <function build_upper>, 'UCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Upper'>>, '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>>, 'WHEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.When'>>, 'X_M_L_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.XMLTable'>>, 'XOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Xor'>>, 'YEAR': <function MySQL.Parser.<lambda>>, 'ARRAYAGG': <function Parser.<lambda>>, 'GLOB': <function Parser.<lambda>>, 'INSTR': <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>>, 'TO_HEX': <function build_hex>, 'CONVERT_TZ': <function MySQL.Parser.<lambda>>, 'DATE_FORMAT': <function build_formatted_time.<locals>._builder>, 'FROM_UNIXTIME': <function build_formatted_time.<locals>._builder>, 'ISNULL': <function isnull_to_is_null>, 'LOCATE': <function locate_to_strposition>, 'MAKETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'MONTHNAME': <function MySQL.Parser.<lambda>>}
FUNCTION_PARSERS =
{'CAST': <function Parser.<lambda>>, 'CONVERT': <function Parser.<lambda>>, 'DECODE': <function Parser.<lambda>>, 'EXTRACT': <function Parser.<lambda>>, 'GAP_FILL': <function Parser.<lambda>>, 'JSON_OBJECT': <function Parser.<lambda>>, 'JSON_OBJECTAGG': <function Parser.<lambda>>, 'JSON_TABLE': <function Parser.<lambda>>, 'MATCH': <function Parser.<lambda>>, '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>>, '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.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.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>>, '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>>, 'WITH': <function Parser.<lambda>>, 'FULLTEXT': <function MySQL.Parser.<lambda>>, 'INDEX': <function MySQL.Parser.<lambda>>, 'KEY': <function MySQL.Parser.<lambda>>, 'SPATIAL': <function MySQL.Parser.<lambda>>}
ALTER_PARSERS =
{'ADD': <function Parser.<lambda>>, 'ALTER': <function Parser.<lambda>>, 'CLUSTER BY': <function Parser.<lambda>>, 'DELETE': <function Parser.<lambda>>, 'DROP': <function Parser.<lambda>>, 'RENAME': <function Parser.<lambda>>, 'SET': <function Parser.<lambda>>, 'AS': <function Parser.<lambda>>, 'MODIFY': <function MySQL.Parser.<lambda>>}
SCHEMA_UNNAMED_CONSTRAINTS =
{'PERIOD', 'FOREIGN KEY', 'INDEX', 'SPATIAL', 'PRIMARY KEY', 'KEY', 'UNIQUE', 'EXCLUDE', 'LIKE', 'FULLTEXT', 'CHECK'}
PROFILE_TYPES: Dict[str, Sequence[Union[Sequence[str], str]]] =
{'ALL': (), 'CPU': (), 'IPC': (), 'MEMORY': (), 'SOURCE': (), 'SWAPS': (), 'BLOCK': ('IO',), 'CONTEXT': ('SWITCHES',), 'PAGE': ('FAULTS',)}
TYPE_TOKENS =
{<TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.INT128: 'INT128'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.LIST: 'LIST'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.INT256: 'INT256'>, <TokenType.SET: 'SET'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.INT: 'INT'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.TEXT: 'TEXT'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.SUPER: 'SUPER'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.UINT256: 'UINT256'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.DATE: 'DATE'>, <TokenType.JSONB: 'JSONB'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.UINT: 'UINT'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.BIT: 'BIT'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.NAME: 'NAME'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.ENUM: 'ENUM'>, <TokenType.UNION: 'UNION'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.RANGE: 'RANGE'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.NULL: 'NULL'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.MONEY: 'MONEY'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.CHAR: 'CHAR'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.XML: 'XML'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.IPV4: 'IPV4'>, <TokenType.UINT128: 'UINT128'>, <TokenType.BINARY: 'BINARY'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.INET: 'INET'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.DATE32: 'DATE32'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.JSON: 'JSON'>, <TokenType.TIME: 'TIME'>, <TokenType.IPV6: 'IPV6'>, <TokenType.UUID: 'UUID'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.MAP: 'MAP'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.YEAR: 'YEAR'>, <TokenType.LONGBLOB: 'LONGBLOB'>}
ENUM_TYPE_TOKENS =
{<TokenType.ENUM8: 'ENUM8'>, <TokenType.ENUM: 'ENUM'>, <TokenType.SET: 'SET'>, <TokenType.ENUM16: 'ENUM16'>}
SHOW_TRIE: Dict =
{'BINARY': {'LOGS': {0: True}}, 'MASTER': {'LOGS': {0: True}, 'STATUS': {0: True}}, 'BINLOG': {'EVENTS': {0: True}}, 'CHARACTER': {'SET': {0: True}}, 'CHARSET': {0: True}, 'COLLATION': {0: True}, 'FULL': {'COLUMNS': {0: True}, 'PROCESSLIST': {0: True}, 'TABLES': {0: True}}, 'COLUMNS': {0: True}, 'CREATE': {'DATABASE': {0: True}, 'EVENT': {0: True}, 'FUNCTION': {0: True}, 'PROCEDURE': {0: True}, 'TABLE': {0: True}, 'TRIGGER': {0: True}, 'VIEW': {0: True}}, 'DATABASES': {0: True}, 'SCHEMAS': {0: True}, 'ENGINE': {0: True}, 'STORAGE': {'ENGINES': {0: True}}, 'ENGINES': {0: True}, 'ERRORS': {0: True}, 'EVENTS': {0: True}, 'FUNCTION': {'CODE': {0: True}, 'STATUS': {0: True}}, 'GRANTS': {0: True}, 'INDEX': {0: True}, 'OPEN': {'TABLES': {0: True}}, 'PLUGINS': {0: True}, 'PROCEDURE': {'CODE': {0: True}, 'STATUS': {0: True}}, 'PRIVILEGES': {0: True}, 'PROCESSLIST': {0: True}, 'PROFILE': {0: True}, 'PROFILES': {0: True}, 'RELAYLOG': {'EVENTS': {0: True}}, 'REPLICAS': {0: True}, 'SLAVE': {'HOSTS': {0: True}, 'STATUS': {0: True}}, 'REPLICA': {'STATUS': {0: True}}, 'GLOBAL': {'STATUS': {0: True}, 'VARIABLES': {0: True}}, 'SESSION': {'STATUS': {0: True}, 'VARIABLES': {0: True}}, 'STATUS': {0: True}, 'TABLE': {'STATUS': {0: True}}, 'TABLES': {0: True}, 'TRIGGERS': {0: True}, 'VARIABLES': {0: True}, 'WARNINGS': {0: True}}
SET_TRIE: Dict =
{'GLOBAL': {0: True}, 'LOCAL': {0: True}, 'SESSION': {0: True}, 'TRANSACTION': {0: True}, 'PERSIST': {0: True}, 'PERSIST_ONLY': {0: True}, 'CHARACTER': {'SET': {0: True}}, 'CHARSET': {0: True}, 'NAMES': {0: True}}
Inherited Members
- sqlglot.parser.Parser
- Parser
- NO_PAREN_FUNCTIONS
- STRUCT_TYPE_TOKENS
- NESTED_TYPE_TOKENS
- AGGREGATE_TYPE_TOKENS
- SIGNED_TO_UNSIGNED_TYPE_TOKEN
- SUBQUERY_PREDICATES
- RESERVED_TOKENS
- DB_CREATABLES
- CREATABLES
- ALTERABLES
- ID_VAR_TOKENS
- INTERVAL_VARS
- ALIAS_TOKENS
- ARRAY_CONSTRUCTORS
- COMMENT_TABLE_ALIAS_TOKENS
- UPDATE_ALIAS_TOKENS
- TRIM_TYPES
- ASSIGNMENT
- EQUALITY
- COMPARISON
- BITWISE
- TERM
- FACTOR
- EXPONENT
- TIMES
- TIMESTAMPS
- SET_OPERATIONS
- JOIN_METHODS
- JOIN_SIDES
- JOIN_KINDS
- JOIN_HINTS
- LAMBDAS
- COLUMN_OPERATORS
- EXPRESSION_PARSERS
- UNARY_PARSERS
- STRING_PARSERS
- NUMERIC_PARSERS
- PRIMARY_PARSERS
- PLACEHOLDER_PARSERS
- ALTER_ALTER_PARSERS
- NO_PAREN_FUNCTION_PARSERS
- INVALID_FUNC_NAME_TOKENS
- FUNCTIONS_WITH_ALIASED_ARGS
- KEY_VALUE_DEFINITIONS
- QUERY_MODIFIER_PARSERS
- TYPE_LITERAL_PARSERS
- TYPE_CONVERTERS
- DDL_SELECT_TOKENS
- PRE_VOLATILE_TOKENS
- TRANSACTION_KIND
- TRANSACTION_CHARACTERISTICS
- CONFLICT_ACTIONS
- CREATE_SEQUENCE
- ISOLATED_LOADING_OPTIONS
- USABLES
- CAST_ACTIONS
- SCHEMA_BINDING_OPTIONS
- KEY_CONSTRAINT_OPTIONS
- INSERT_ALTERNATIVES
- CLONE_KEYWORDS
- HISTORICAL_DATA_PREFIX
- HISTORICAL_DATA_KIND
- OPCLASS_FOLLOW_KEYWORDS
- OPTYPE_FOLLOW_TOKENS
- TABLE_INDEX_HINT_TOKENS
- VIEW_ATTRIBUTES
- WINDOW_ALIAS_TOKENS
- WINDOW_BEFORE_PAREN_TOKENS
- WINDOW_SIDES
- JSON_KEY_VALUE_SEPARATOR_TOKENS
- FETCH_TOKENS
- ADD_CONSTRAINT_TOKENS
- DISTINCT_TOKENS
- NULL_TOKENS
- UNNEST_OFFSET_ALIAS_TOKENS
- SELECT_START_TOKENS
- COPY_INTO_VARLEN_OPTIONS
- IS_JSON_PREDICATE_KIND
- ODBC_DATETIME_LITERALS
- ON_CONDITION_TOKENS
- PRIVILEGE_FOLLOW_TOKENS
- STRICT_CAST
- PREFIXED_PIVOT_COLUMNS
- IDENTIFY_PIVOT_STRINGS
- ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMN
- TABLESAMPLE_CSV
- DEFAULT_SAMPLING_METHOD
- SET_REQUIRES_ASSIGNMENT_DELIMITER
- TRIM_PATTERN_FIRST
- MODIFIERS_ATTACHED_TO_SET_OP
- SET_OP_MODIFIERS
- NO_PAREN_IF_COMMANDS
- JSON_ARROWS_REQUIRE_JSON_TYPE
- COLON_IS_VARIANT_EXTRACT
- SUPPORTS_IMPLICIT_UNNEST
- INTERVAL_SPANS
- error_level
- error_message_context
- max_errors
- dialect
- reset
- parse
- parse_into
- check_errors
- raise_error
- expression
- validate_expression
- errors
- sql
675 class Generator(generator.Generator): 676 INTERVAL_ALLOWS_PLURAL_FORM = False 677 LOCKING_READS_SUPPORTED = True 678 NULL_ORDERING_SUPPORTED = None 679 JOIN_HINTS = False 680 TABLE_HINTS = True 681 DUPLICATE_KEY_UPDATE_WITH_SET = False 682 QUERY_HINT_SEP = " " 683 VALUES_AS_TABLE = False 684 NVL2_SUPPORTED = False 685 LAST_DAY_SUPPORTS_DATE_PART = False 686 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 687 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 688 JSON_KEY_VALUE_PAIR_SEP = "," 689 SUPPORTS_TO_NUMBER = False 690 PARSE_JSON_NAME: t.Optional[str] = None 691 PAD_FILL_PATTERN_IS_REQUIRED = True 692 WRAP_DERIVED_VALUES = False 693 VARCHAR_REQUIRES_SIZE = True 694 695 TRANSFORMS = { 696 **generator.Generator.TRANSFORMS, 697 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 698 exp.CurrentDate: no_paren_current_date_sql, 699 exp.DateDiff: _remove_ts_or_ds_to_date( 700 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 701 ), 702 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 703 exp.DateStrToDate: datestrtodate_sql, 704 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 705 exp.DateTrunc: _date_trunc_sql, 706 exp.Day: _remove_ts_or_ds_to_date(), 707 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 708 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 709 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 710 exp.GroupConcat: lambda self, 711 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 712 exp.ILike: no_ilike_sql, 713 exp.JSONExtractScalar: arrow_json_extract_sql, 714 exp.Max: max_or_greatest, 715 exp.Min: min_or_least, 716 exp.Month: _remove_ts_or_ds_to_date(), 717 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 718 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 719 exp.Pivot: no_pivot_sql, 720 exp.Select: transforms.preprocess( 721 [ 722 transforms.eliminate_distinct_on, 723 transforms.eliminate_semi_and_anti_joins, 724 transforms.eliminate_qualify, 725 transforms.eliminate_full_outer_join, 726 transforms.unnest_generate_date_array_using_recursive_cte, 727 ] 728 ), 729 exp.StrPosition: strposition_to_locate_sql, 730 exp.StrToDate: _str_to_date_sql, 731 exp.StrToTime: _str_to_date_sql, 732 exp.Stuff: rename_func("INSERT"), 733 exp.TableSample: no_tablesample_sql, 734 exp.TimeFromParts: rename_func("MAKETIME"), 735 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 736 exp.TimestampDiff: lambda self, e: self.func( 737 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 738 ), 739 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 740 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 741 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 742 self, 743 e, 744 include_precision=not e.args.get("zone"), 745 ), 746 exp.TimeToStr: _remove_ts_or_ds_to_date( 747 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 748 ), 749 exp.Trim: trim_sql, 750 exp.TryCast: no_trycast_sql, 751 exp.TsOrDsAdd: date_add_sql("ADD"), 752 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 753 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 754 exp.UnixToTime: _unix_to_time_sql, 755 exp.Week: _remove_ts_or_ds_to_date(), 756 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 757 exp.Year: _remove_ts_or_ds_to_date(), 758 } 759 760 UNSIGNED_TYPE_MAPPING = { 761 exp.DataType.Type.UBIGINT: "BIGINT", 762 exp.DataType.Type.UINT: "INT", 763 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 764 exp.DataType.Type.USMALLINT: "SMALLINT", 765 exp.DataType.Type.UTINYINT: "TINYINT", 766 exp.DataType.Type.UDECIMAL: "DECIMAL", 767 } 768 769 TIMESTAMP_TYPE_MAPPING = { 770 exp.DataType.Type.TIMESTAMP: "DATETIME", 771 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 772 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 773 } 774 775 TYPE_MAPPING = { 776 **generator.Generator.TYPE_MAPPING, 777 **UNSIGNED_TYPE_MAPPING, 778 **TIMESTAMP_TYPE_MAPPING, 779 } 780 781 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 782 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 783 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 784 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 785 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 786 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 787 788 PROPERTIES_LOCATION = { 789 **generator.Generator.PROPERTIES_LOCATION, 790 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 791 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 792 } 793 794 LIMIT_FETCH = "LIMIT" 795 796 LIMIT_ONLY_LITERALS = True 797 798 CHAR_CAST_MAPPING = dict.fromkeys( 799 ( 800 exp.DataType.Type.LONGTEXT, 801 exp.DataType.Type.LONGBLOB, 802 exp.DataType.Type.MEDIUMBLOB, 803 exp.DataType.Type.MEDIUMTEXT, 804 exp.DataType.Type.TEXT, 805 exp.DataType.Type.TINYBLOB, 806 exp.DataType.Type.TINYTEXT, 807 exp.DataType.Type.VARCHAR, 808 ), 809 "CHAR", 810 ) 811 SIGNED_CAST_MAPPING = dict.fromkeys( 812 ( 813 exp.DataType.Type.BIGINT, 814 exp.DataType.Type.BOOLEAN, 815 exp.DataType.Type.INT, 816 exp.DataType.Type.SMALLINT, 817 exp.DataType.Type.TINYINT, 818 exp.DataType.Type.MEDIUMINT, 819 ), 820 "SIGNED", 821 ) 822 823 # MySQL doesn't support many datatypes in cast. 824 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 825 CAST_MAPPING = { 826 **CHAR_CAST_MAPPING, 827 **SIGNED_CAST_MAPPING, 828 exp.DataType.Type.UBIGINT: "UNSIGNED", 829 } 830 831 TIMESTAMP_FUNC_TYPES = { 832 exp.DataType.Type.TIMESTAMPTZ, 833 exp.DataType.Type.TIMESTAMPLTZ, 834 } 835 836 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 837 RESERVED_KEYWORDS = { 838 "accessible", 839 "add", 840 "all", 841 "alter", 842 "analyze", 843 "and", 844 "as", 845 "asc", 846 "asensitive", 847 "before", 848 "between", 849 "bigint", 850 "binary", 851 "blob", 852 "both", 853 "by", 854 "call", 855 "cascade", 856 "case", 857 "change", 858 "char", 859 "character", 860 "check", 861 "collate", 862 "column", 863 "condition", 864 "constraint", 865 "continue", 866 "convert", 867 "create", 868 "cross", 869 "cube", 870 "cume_dist", 871 "current_date", 872 "current_time", 873 "current_timestamp", 874 "current_user", 875 "cursor", 876 "database", 877 "databases", 878 "day_hour", 879 "day_microsecond", 880 "day_minute", 881 "day_second", 882 "dec", 883 "decimal", 884 "declare", 885 "default", 886 "delayed", 887 "delete", 888 "dense_rank", 889 "desc", 890 "describe", 891 "deterministic", 892 "distinct", 893 "distinctrow", 894 "div", 895 "double", 896 "drop", 897 "dual", 898 "each", 899 "else", 900 "elseif", 901 "empty", 902 "enclosed", 903 "escaped", 904 "except", 905 "exists", 906 "exit", 907 "explain", 908 "false", 909 "fetch", 910 "first_value", 911 "float", 912 "float4", 913 "float8", 914 "for", 915 "force", 916 "foreign", 917 "from", 918 "fulltext", 919 "function", 920 "generated", 921 "get", 922 "grant", 923 "group", 924 "grouping", 925 "groups", 926 "having", 927 "high_priority", 928 "hour_microsecond", 929 "hour_minute", 930 "hour_second", 931 "if", 932 "ignore", 933 "in", 934 "index", 935 "infile", 936 "inner", 937 "inout", 938 "insensitive", 939 "insert", 940 "int", 941 "int1", 942 "int2", 943 "int3", 944 "int4", 945 "int8", 946 "integer", 947 "intersect", 948 "interval", 949 "into", 950 "io_after_gtids", 951 "io_before_gtids", 952 "is", 953 "iterate", 954 "join", 955 "json_table", 956 "key", 957 "keys", 958 "kill", 959 "lag", 960 "last_value", 961 "lateral", 962 "lead", 963 "leading", 964 "leave", 965 "left", 966 "like", 967 "limit", 968 "linear", 969 "lines", 970 "load", 971 "localtime", 972 "localtimestamp", 973 "lock", 974 "long", 975 "longblob", 976 "longtext", 977 "loop", 978 "low_priority", 979 "master_bind", 980 "master_ssl_verify_server_cert", 981 "match", 982 "maxvalue", 983 "mediumblob", 984 "mediumint", 985 "mediumtext", 986 "middleint", 987 "minute_microsecond", 988 "minute_second", 989 "mod", 990 "modifies", 991 "natural", 992 "not", 993 "no_write_to_binlog", 994 "nth_value", 995 "ntile", 996 "null", 997 "numeric", 998 "of", 999 "on", 1000 "optimize", 1001 "optimizer_costs", 1002 "option", 1003 "optionally", 1004 "or", 1005 "order", 1006 "out", 1007 "outer", 1008 "outfile", 1009 "over", 1010 "partition", 1011 "percent_rank", 1012 "precision", 1013 "primary", 1014 "procedure", 1015 "purge", 1016 "range", 1017 "rank", 1018 "read", 1019 "reads", 1020 "read_write", 1021 "real", 1022 "recursive", 1023 "references", 1024 "regexp", 1025 "release", 1026 "rename", 1027 "repeat", 1028 "replace", 1029 "require", 1030 "resignal", 1031 "restrict", 1032 "return", 1033 "revoke", 1034 "right", 1035 "rlike", 1036 "row", 1037 "rows", 1038 "row_number", 1039 "schema", 1040 "schemas", 1041 "second_microsecond", 1042 "select", 1043 "sensitive", 1044 "separator", 1045 "set", 1046 "show", 1047 "signal", 1048 "smallint", 1049 "spatial", 1050 "specific", 1051 "sql", 1052 "sqlexception", 1053 "sqlstate", 1054 "sqlwarning", 1055 "sql_big_result", 1056 "sql_calc_found_rows", 1057 "sql_small_result", 1058 "ssl", 1059 "starting", 1060 "stored", 1061 "straight_join", 1062 "system", 1063 "table", 1064 "terminated", 1065 "then", 1066 "tinyblob", 1067 "tinyint", 1068 "tinytext", 1069 "to", 1070 "trailing", 1071 "trigger", 1072 "true", 1073 "undo", 1074 "union", 1075 "unique", 1076 "unlock", 1077 "unsigned", 1078 "update", 1079 "usage", 1080 "use", 1081 "using", 1082 "utc_date", 1083 "utc_time", 1084 "utc_timestamp", 1085 "values", 1086 "varbinary", 1087 "varchar", 1088 "varcharacter", 1089 "varying", 1090 "virtual", 1091 "when", 1092 "where", 1093 "while", 1094 "window", 1095 "with", 1096 "write", 1097 "xor", 1098 "year_month", 1099 "zerofill", 1100 } 1101 1102 def array_sql(self, expression: exp.Array) -> str: 1103 self.unsupported("Arrays are not supported by MySQL") 1104 return self.function_fallback_sql(expression) 1105 1106 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1107 self.unsupported("Array operations are not supported by MySQL") 1108 return self.function_fallback_sql(expression) 1109 1110 def dpipe_sql(self, expression: exp.DPipe) -> str: 1111 return self.func("CONCAT", *expression.flatten()) 1112 1113 def extract_sql(self, expression: exp.Extract) -> str: 1114 unit = expression.name 1115 if unit and unit.lower() == "epoch": 1116 return self.func("UNIX_TIMESTAMP", expression.expression) 1117 1118 return super().extract_sql(expression) 1119 1120 def datatype_sql(self, expression: exp.DataType) -> str: 1121 if ( 1122 self.VARCHAR_REQUIRES_SIZE 1123 and expression.is_type(exp.DataType.Type.VARCHAR) 1124 and not expression.expressions 1125 ): 1126 # `VARCHAR` must always have a size - if it doesn't, we always generate `TEXT` 1127 return "TEXT" 1128 1129 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1130 result = super().datatype_sql(expression) 1131 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1132 result = f"{result} UNSIGNED" 1133 1134 return result 1135 1136 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1137 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1138 1139 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1140 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1141 return self.func("TIMESTAMP", expression.this) 1142 1143 to = self.CAST_MAPPING.get(expression.to.this) 1144 1145 if to: 1146 expression.to.set("this", to) 1147 return super().cast_sql(expression) 1148 1149 def show_sql(self, expression: exp.Show) -> str: 1150 this = f" {expression.name}" 1151 full = " FULL" if expression.args.get("full") else "" 1152 global_ = " GLOBAL" if expression.args.get("global") else "" 1153 1154 target = self.sql(expression, "target") 1155 target = f" {target}" if target else "" 1156 if expression.name in ("COLUMNS", "INDEX"): 1157 target = f" FROM{target}" 1158 elif expression.name == "GRANTS": 1159 target = f" FOR{target}" 1160 1161 db = self._prefixed_sql("FROM", expression, "db") 1162 1163 like = self._prefixed_sql("LIKE", expression, "like") 1164 where = self.sql(expression, "where") 1165 1166 types = self.expressions(expression, key="types") 1167 types = f" {types}" if types else types 1168 query = self._prefixed_sql("FOR QUERY", expression, "query") 1169 1170 if expression.name == "PROFILE": 1171 offset = self._prefixed_sql("OFFSET", expression, "offset") 1172 limit = self._prefixed_sql("LIMIT", expression, "limit") 1173 else: 1174 offset = "" 1175 limit = self._oldstyle_limit_sql(expression) 1176 1177 log = self._prefixed_sql("IN", expression, "log") 1178 position = self._prefixed_sql("FROM", expression, "position") 1179 1180 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1181 1182 if expression.name == "ENGINE": 1183 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1184 else: 1185 mutex_or_status = "" 1186 1187 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1188 1189 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1190 dtype = self.sql(expression, "dtype") 1191 if not dtype: 1192 return super().altercolumn_sql(expression) 1193 1194 this = self.sql(expression, "this") 1195 return f"MODIFY COLUMN {this} {dtype}" 1196 1197 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1198 sql = self.sql(expression, arg) 1199 return f" {prefix} {sql}" if sql else "" 1200 1201 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1202 limit = self.sql(expression, "limit") 1203 offset = self.sql(expression, "offset") 1204 if limit: 1205 limit_offset = f"{offset}, {limit}" if offset else limit 1206 return f" LIMIT {limit_offset}" 1207 return "" 1208 1209 def chr_sql(self, expression: exp.Chr) -> str: 1210 this = self.expressions(sqls=[expression.this] + expression.expressions) 1211 charset = expression.args.get("charset") 1212 using = f" USING {self.sql(charset)}" if charset else "" 1213 return f"CHAR({this}{using})" 1214 1215 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1216 unit = expression.args.get("unit") 1217 1218 # Pick an old-enough date to avoid negative timestamp diffs 1219 start_ts = "'0000-01-01 00:00:00'" 1220 1221 # Source: https://stackoverflow.com/a/32955740 1222 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1223 interval = exp.Interval(this=timestamp_diff, unit=unit) 1224 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1225 1226 return self.sql(dateadd) 1227 1228 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1229 from_tz = expression.args.get("source_tz") 1230 to_tz = expression.args.get("target_tz") 1231 dt = expression.args.get("timestamp") 1232 1233 return self.func("CONVERT_TZ", dt, from_tz, to_tz) 1234 1235 def attimezone_sql(self, expression: exp.AtTimeZone) -> str: 1236 self.unsupported("AT TIME ZONE is not supported by MySQL") 1237 return self.sql(expression.this)
Generator converts a given syntax tree to the corresponding SQL string.
Arguments:
- pretty: Whether to format the produced SQL string. Default: False.
- identify: Determines when an identifier should be quoted. Possible values are: False (default): Never quote, except in cases where it's mandatory by the dialect. True or 'always': Always quote. 'safe': Only quote identifiers that are case insensitive.
- normalize: Whether to normalize identifiers to lowercase. Default: False.
- pad: The pad size in a formatted string. For example, this affects the indentation of a projection in a query, relative to its nesting level. Default: 2.
- indent: The indentation size in a formatted string. For example, this affects the
indentation of subqueries and filters under a
WHERE
clause. Default: 2. - normalize_functions: How to normalize function names. Possible values are: "upper" or True (default): Convert names to uppercase. "lower": Convert names to lowercase. False: Disables function name normalization.
- unsupported_level: Determines the generator's behavior when it encounters unsupported expressions. Default ErrorLevel.WARN.
- max_unsupported: Maximum number of unsupported messages to include in a raised UnsupportedError. This is only relevant if unsupported_level is ErrorLevel.RAISE. Default: 3
- leading_comma: Whether the comma is leading or trailing in select expressions. This is only relevant when generating in pretty mode. Default: False
- max_text_width: The max number of characters in a segment before creating new lines in pretty mode. The default is on the smaller end because the length only represents a segment and not the true line length. Default: 80
- comments: Whether to preserve comments in the output SQL code. Default: True
TRANSFORMS =
{<class 'sqlglot.expressions.JSONPathFilter'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathKey'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathRecursive'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathRoot'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathScript'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathSelector'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathSlice'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathSubscript'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathUnion'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathWildcard'>: <function <lambda>>, <class 'sqlglot.expressions.AllowedValuesProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.AutoRefreshProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.BackupProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CaseSpecificColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CharacterSetColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CharacterSetProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ClusteredColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CollateColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CommentColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ConnectByRoot'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CopyGrantsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.DateFormatColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.DefaultColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.DynamicProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EmptyProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EncodeColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EphemeralColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ExcludeColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ExecuteAsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Except'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ExternalProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.GlobalProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.HeapProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.IcebergProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InheritsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InlineLengthColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InputModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Intersect'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.IntervalSpan'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LanguageProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LocationProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LogProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.MaterializedProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.NonClusteredColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.NoPrimaryIndexProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.NotForReplicationColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OnCommitProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OnProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OnUpdateColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Operator'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OutputModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PathColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PivotAny'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ProjectionPolicyColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.RemoteWithConnectionModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ReturnsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SampleProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SecureProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.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.TemporaryProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TagColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TitleColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ToMap'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ToTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TransformModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TransientProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Union'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UnloggedProperty'>: <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.WithSchemaBindingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithOperator'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ArrayAgg'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentDate'>: <function no_paren_current_date_sql>, <class 'sqlglot.expressions.DateDiff'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DateAdd'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DateStrToDate'>: <function datestrtodate_sql>, <class 'sqlglot.expressions.DateSub'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DateTrunc'>: <function _date_trunc_sql>, <class 'sqlglot.expressions.Day'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DayOfMonth'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DayOfWeek'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DayOfYear'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.GroupConcat'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.ILike'>: <function no_ilike_sql>, <class 'sqlglot.expressions.JSONExtractScalar'>: <function arrow_json_extract_sql>, <class 'sqlglot.expressions.Max'>: <function max_or_greatest>, <class 'sqlglot.expressions.Min'>: <function min_or_least>, <class 'sqlglot.expressions.Month'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.NullSafeEQ'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.NullSafeNEQ'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.Pivot'>: <function no_pivot_sql>, <class 'sqlglot.expressions.Select'>: <function preprocess.<locals>._to_sql>, <class 'sqlglot.expressions.StrPosition'>: <function strposition_to_locate_sql>, <class 'sqlglot.expressions.StrToDate'>: <function _str_to_date_sql>, <class 'sqlglot.expressions.StrToTime'>: <function _str_to_date_sql>, <class 'sqlglot.expressions.Stuff'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TableSample'>: <function no_tablesample_sql>, <class 'sqlglot.expressions.TimeFromParts'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TimestampAdd'>: <function date_add_interval_sql.<locals>.func>, <class 'sqlglot.expressions.TimestampDiff'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.TimestampSub'>: <function date_add_interval_sql.<locals>.func>, <class 'sqlglot.expressions.TimeStrToUnix'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeStrToTime'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.TimeToStr'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.Trim'>: <function trim_sql>, <class 'sqlglot.expressions.TryCast'>: <function no_trycast_sql>, <class 'sqlglot.expressions.TsOrDsAdd'>: <function date_add_sql.<locals>.func>, <class 'sqlglot.expressions.TsOrDsDiff'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.TsOrDsToDate'>: <function _ts_or_ds_to_date_sql>, <class 'sqlglot.expressions.UnixToTime'>: <function _unix_to_time_sql>, <class 'sqlglot.expressions.Week'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.WeekOfYear'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.Year'>: <function _remove_ts_or_ds_to_date.<locals>.func>}
UNSIGNED_TYPE_MAPPING =
{<Type.UBIGINT: 'UBIGINT'>: 'BIGINT', <Type.UINT: 'UINT'>: 'INT', <Type.UMEDIUMINT: 'UMEDIUMINT'>: 'MEDIUMINT', <Type.USMALLINT: 'USMALLINT'>: 'SMALLINT', <Type.UTINYINT: 'UTINYINT'>: 'TINYINT', <Type.UDECIMAL: 'UDECIMAL'>: 'DECIMAL'}
TIMESTAMP_TYPE_MAPPING =
{<Type.TIMESTAMP: 'TIMESTAMP'>: 'DATETIME', <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>: 'TIMESTAMP', <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>: 'TIMESTAMP'}
TYPE_MAPPING =
{<Type.NCHAR: 'NCHAR'>: 'CHAR', <Type.NVARCHAR: 'NVARCHAR'>: 'VARCHAR', <Type.INET: 'INET'>: 'INET', <Type.ROWVERSION: 'ROWVERSION'>: 'VARBINARY', <Type.UBIGINT: 'UBIGINT'>: 'BIGINT', <Type.UINT: 'UINT'>: 'INT', <Type.UMEDIUMINT: 'UMEDIUMINT'>: 'MEDIUMINT', <Type.USMALLINT: 'USMALLINT'>: 'SMALLINT', <Type.UTINYINT: 'UTINYINT'>: 'TINYINT', <Type.UDECIMAL: 'UDECIMAL'>: 'DECIMAL', <Type.TIMESTAMP: 'TIMESTAMP'>: 'DATETIME', <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>: 'TIMESTAMP', <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>: 'TIMESTAMP'}
PROPERTIES_LOCATION =
{<class 'sqlglot.expressions.AllowedValuesProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.AlgorithmProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.AutoIncrementProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.AutoRefreshProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.BackupProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.BlockCompressionProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.CharacterSetProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ChecksumProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.CollateProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.CopyGrantsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Cluster'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ClusteredByProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.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.EngineProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ExecuteAsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ExternalProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.FallbackProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.FileFormatProperty'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.FreespaceProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.GlobalProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.HeapProperty'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.InheritsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.IcebergProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.InputModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.IsolatedLoadingProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.JournalProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.LanguageProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LikeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LocationProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LockProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LockingProperty'>: <Location.POST_ALIAS: 'POST_ALIAS'>, <class 'sqlglot.expressions.LogProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.MaterializedProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.MergeBlockRatioProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.NoPrimaryIndexProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.OnProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.OnCommitProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.Order'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.OutputModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PartitionedByProperty'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.PartitionedOfProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PrimaryKey'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Property'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.RemoteWithConnectionModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ReturnsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatDelimitedProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatSerdeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SampleProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SchemaCommentProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SecureProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.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.StreamingTableProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.StrictProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.TemporaryProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.ToTableProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.TransientProperty'>: <Location.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.TransformModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.MergeTreeTTL'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.UnloggedProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.ViewAttributeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.VolatileProperty'>: <Location.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.WithDataProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.WithJournalTableProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.WithSchemaBindingProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.WithSystemVersioningProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>}
CHAR_CAST_MAPPING =
{<Type.LONGTEXT: 'LONGTEXT'>: 'CHAR', <Type.LONGBLOB: 'LONGBLOB'>: 'CHAR', <Type.MEDIUMBLOB: 'MEDIUMBLOB'>: 'CHAR', <Type.MEDIUMTEXT: 'MEDIUMTEXT'>: 'CHAR', <Type.TEXT: 'TEXT'>: 'CHAR', <Type.TINYBLOB: 'TINYBLOB'>: 'CHAR', <Type.TINYTEXT: 'TINYTEXT'>: 'CHAR', <Type.VARCHAR: 'VARCHAR'>: 'CHAR'}
SIGNED_CAST_MAPPING =
{<Type.BIGINT: 'BIGINT'>: 'SIGNED', <Type.BOOLEAN: 'BOOLEAN'>: 'SIGNED', <Type.INT: 'INT'>: 'SIGNED', <Type.SMALLINT: 'SMALLINT'>: 'SIGNED', <Type.TINYINT: 'TINYINT'>: 'SIGNED', <Type.MEDIUMINT: 'MEDIUMINT'>: 'SIGNED'}
CAST_MAPPING =
{<Type.LONGTEXT: 'LONGTEXT'>: 'CHAR', <Type.LONGBLOB: 'LONGBLOB'>: 'CHAR', <Type.MEDIUMBLOB: 'MEDIUMBLOB'>: 'CHAR', <Type.MEDIUMTEXT: 'MEDIUMTEXT'>: 'CHAR', <Type.TEXT: 'TEXT'>: 'CHAR', <Type.TINYBLOB: 'TINYBLOB'>: 'CHAR', <Type.TINYTEXT: 'TINYTEXT'>: 'CHAR', <Type.VARCHAR: 'VARCHAR'>: 'CHAR', <Type.BIGINT: 'BIGINT'>: 'SIGNED', <Type.BOOLEAN: 'BOOLEAN'>: 'SIGNED', <Type.INT: 'INT'>: 'SIGNED', <Type.SMALLINT: 'SMALLINT'>: 'SIGNED', <Type.TINYINT: 'TINYINT'>: 'SIGNED', <Type.MEDIUMINT: 'MEDIUMINT'>: 'SIGNED', <Type.UBIGINT: 'UBIGINT'>: 'UNSIGNED'}
RESERVED_KEYWORDS =
{'int3', 'call', 'check', 'distinct', 'mediumtext', 'kill', 'read_write', 'tinyblob', 'both', 'fetch', 'hour_microsecond', 'exit', 'mod', 'int', 'elseif', 'localtimestamp', 'null', 'fulltext', 'between', 'sql_small_result', 'numeric', 'rank', 'like', 'unsigned', 'repeat', 'float4', 'default', 'order', 'group', 'escaped', 'select', 'stored', 'cross', 'ignore', 'day_hour', 'update', 'on', 'as', 'replace', 'except', 'by', 'long', 'explain', 'mediumblob', 'dense_rank', 'purge', 'delayed', 'low_priority', 'keys', 'insensitive', 'inner', 'cascade', 'force', 'lead', 'regexp', 'percent_rank', 'column', 'case', 'with', 'if', 'schemas', 'varcharacter', 'specific', 'collate', 'current_timestamp', 'table', 'optionally', 'integer', 'foreign', 'hour_minute', 'character', 'master_bind', 'day_second', 'current_user', 'inout', 'of', 'databases', 'write', 'option', 'condition', 'range', 'unique', 'deterministic', 'varbinary', 'asensitive', 'accessible', 'real', 'minute_second', 'partition', 'from', 'index', 'using', 'references', 'match', 'modifies', 'set', 'row', 'first_value', 'is', 'require', 'utc_timestamp', 'binary', 'tinyint', 'values', 'or', 'loop', 'database', 'lock', 'sql_big_result', 'false', 'trigger', 'having', 'alter', 'linear', 'revoke', 'varchar', 'float8', 'interval', 'io_before_gtids', 'int4', 'left', 'show', 'optimize', 'optimizer_costs', 'exists', 'continue', 'maxvalue', 'int8', 'infile', 'blob', 'for', 'straight_join', 'use', 'while', 'insert', 'utc_date', 'starting', 'all', 'sql', 'convert', 'each', 'float', 'undo', 'groups', 'hour_second', 'last_value', 'ssl', 'lag', 'enclosed', 'over', 'and', 'dual', 'load', 'spatial', 'mediumint', 'rename', 'right', 'sqlexception', 'lines', 'cursor', 'double', 'minute_microsecond', 'when', 'out', 'drop', 'change', 'recursive', 'add', 'terminated', 'io_after_gtids', 'system', 'smallint', 'constraint', 'int2', 'intersect', 'tinytext', 'separator', 'describe', 'to', 'leading', 'reads', 'dec', 'json_table', 'not', 'union', 'day_microsecond', 'lateral', 'current_date', 'unlock', 'read', 'high_priority', 'longblob', 'true', 'join', 'function', 'longtext', 'where', 'rows', 'decimal', 'release', 'sensitive', 'int1', 'iterate', 'delete', 'desc', 'div', 'leave', 'no_write_to_binlog', 'return', 'virtual', 'cube', 'utc_time', 'localtime', 'primary', 'bigint', 'key', 'nth_value', 'middleint', 'varying', 'current_time', 'usage', 'char', 'row_number', 'create', 'empty', 'cume_dist', 'grant', 'before', 'ntile', 'outer', 'analyze', 'natural', 'get', 'xor', 'then', 'limit', 'zerofill', 'grouping', 'generated', 'precision', 'signal', 'declare', 'asc', 'resignal', 'sqlstate', 'sql_calc_found_rows', 'day_minute', 'outfile', 'master_ssl_verify_server_cert', 'schema', 'year_month', 'restrict', 'in', 'sqlwarning', 'procedure', 'rlike', 'trailing', 'distinctrow', 'into', 'window', 'else', 'second_microsecond'}
1120 def datatype_sql(self, expression: exp.DataType) -> str: 1121 if ( 1122 self.VARCHAR_REQUIRES_SIZE 1123 and expression.is_type(exp.DataType.Type.VARCHAR) 1124 and not expression.expressions 1125 ): 1126 # `VARCHAR` must always have a size - if it doesn't, we always generate `TEXT` 1127 return "TEXT" 1128 1129 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1130 result = super().datatype_sql(expression) 1131 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1132 result = f"{result} UNSIGNED" 1133 1134 return result
def
cast_sql( self, expression: sqlglot.expressions.Cast, safe_prefix: Optional[str] = None) -> str:
1139 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1140 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1141 return self.func("TIMESTAMP", expression.this) 1142 1143 to = self.CAST_MAPPING.get(expression.to.this) 1144 1145 if to: 1146 expression.to.set("this", to) 1147 return super().cast_sql(expression)
1149 def show_sql(self, expression: exp.Show) -> str: 1150 this = f" {expression.name}" 1151 full = " FULL" if expression.args.get("full") else "" 1152 global_ = " GLOBAL" if expression.args.get("global") else "" 1153 1154 target = self.sql(expression, "target") 1155 target = f" {target}" if target else "" 1156 if expression.name in ("COLUMNS", "INDEX"): 1157 target = f" FROM{target}" 1158 elif expression.name == "GRANTS": 1159 target = f" FOR{target}" 1160 1161 db = self._prefixed_sql("FROM", expression, "db") 1162 1163 like = self._prefixed_sql("LIKE", expression, "like") 1164 where = self.sql(expression, "where") 1165 1166 types = self.expressions(expression, key="types") 1167 types = f" {types}" if types else types 1168 query = self._prefixed_sql("FOR QUERY", expression, "query") 1169 1170 if expression.name == "PROFILE": 1171 offset = self._prefixed_sql("OFFSET", expression, "offset") 1172 limit = self._prefixed_sql("LIMIT", expression, "limit") 1173 else: 1174 offset = "" 1175 limit = self._oldstyle_limit_sql(expression) 1176 1177 log = self._prefixed_sql("IN", expression, "log") 1178 position = self._prefixed_sql("FROM", expression, "position") 1179 1180 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1181 1182 if expression.name == "ENGINE": 1183 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1184 else: 1185 mutex_or_status = "" 1186 1187 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}"
1215 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1216 unit = expression.args.get("unit") 1217 1218 # Pick an old-enough date to avoid negative timestamp diffs 1219 start_ts = "'0000-01-01 00:00:00'" 1220 1221 # Source: https://stackoverflow.com/a/32955740 1222 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1223 interval = exp.Interval(this=timestamp_diff, unit=unit) 1224 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1225 1226 return self.sql(dateadd)
AFTER_HAVING_MODIFIER_TRANSFORMS =
{'windows': <function Generator.<lambda>>, 'qualify': <function Generator.<lambda>>}
Inherited Members
- sqlglot.generator.Generator
- Generator
- IGNORE_NULLS_IN_FUNC
- 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
- SET_OP_MODIFIERS
- COPY_PARAMS_ARE_WRAPPED
- COPY_PARAMS_EQ_REQUIRED
- COPY_HAS_INTO_KEYWORD
- STAR_EXCEPT
- HEX_FUNC
- WITH_PROPERTIES_PREFIX
- QUOTE_JSON_PATH
- SUPPORTS_EXPLODING_PROJECTIONS
- ARRAY_CONCAT_IS_VAR_LEN
- SUPPORTS_CONVERT_TIMEZONE
- TIME_PART_SINGULARS
- TOKEN_MAPPING
- STRUCT_DELIMITER
- PARAMETER_TOKEN
- NAMED_PLACEHOLDER_TOKEN
- WITH_SEPARATED_COMMENTS
- EXCLUDE_COMMENTS
- UNWRAPPED_INTERVAL_VALUES
- PARAMETERIZABLE_TEXT_TYPES
- EXPRESSIONS_WITHOUT_NESTED_CTES
- SENTINEL_LINE_BREAK
- pretty
- identify
- normalize
- pad
- unsupported_level
- max_unsupported
- leading_comma
- max_text_width
- comments
- dialect
- normalize_functions
- unsupported_messages
- generate
- preprocess
- unsupported
- sep
- seg
- pad_comment
- maybe_comment
- wrap
- no_identify
- normalize_func
- indent
- sql
- uncache_sql
- cache_sql
- characterset_sql
- column_parts
- column_sql
- columnposition_sql
- columndef_sql
- columnconstraint_sql
- computedcolumnconstraint_sql
- autoincrementcolumnconstraint_sql
- compresscolumnconstraint_sql
- generatedasidentitycolumnconstraint_sql
- generatedasrowcolumnconstraint_sql
- periodforsystemtimeconstraint_sql
- notnullcolumnconstraint_sql
- transformcolumnconstraint_sql
- primarykeycolumnconstraint_sql
- uniquecolumnconstraint_sql
- createable_sql
- create_sql
- sequenceproperties_sql
- clone_sql
- describe_sql
- heredoc_sql
- prepend_ctes
- with_sql
- cte_sql
- tablealias_sql
- bitstring_sql
- hexstring_sql
- bytestring_sql
- unicodestring_sql
- rawstring_sql
- datatypeparam_sql
- directory_sql
- delete_sql
- drop_sql
- set_operation
- set_operations
- fetch_sql
- filter_sql
- hint_sql
- indexparameters_sql
- index_sql
- identifier_sql
- hex_sql
- lowerhex_sql
- inputoutputformat_sql
- national_sql
- partition_sql
- properties_sql
- root_properties
- properties
- with_properties
- locate_properties
- property_name
- property_sql
- likeproperty_sql
- fallbackproperty_sql
- journalproperty_sql
- freespaceproperty_sql
- checksumproperty_sql
- mergeblockratioproperty_sql
- datablocksizeproperty_sql
- blockcompressionproperty_sql
- isolatedloadingproperty_sql
- partitionboundspec_sql
- partitionedofproperty_sql
- lockingproperty_sql
- withdataproperty_sql
- withsystemversioningproperty_sql
- insert_sql
- introducer_sql
- kill_sql
- pseudotype_sql
- objectidentifier_sql
- onconflict_sql
- returning_sql
- rowformatdelimitedproperty_sql
- withtablehint_sql
- indextablehint_sql
- historicaldata_sql
- table_parts
- table_sql
- tablesample_sql
- pivot_sql
- version_sql
- tuple_sql
- update_sql
- values_sql
- var_sql
- into_sql
- from_sql
- 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
- 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
- alterdiststyle_sql
- altersortkey_sql
- renametable_sql
- renamecolumn_sql
- alterset_sql
- alter_sql
- add_column_sql
- droppartition_sql
- addconstraint_sql
- distinct_sql
- ignorenulls_sql
- respectnulls_sql
- havingmax_sql
- intdiv_sql
- div_sql
- overlaps_sql
- distance_sql
- dot_sql
- eq_sql
- propertyeq_sql
- escape_sql
- glob_sql
- gt_sql
- gte_sql
- ilike_sql
- ilikeany_sql
- is_sql
- like_sql
- likeany_sql
- similarto_sql
- lt_sql
- lte_sql
- mod_sql
- mul_sql
- neq_sql
- nullsafeeq_sql
- nullsafeneq_sql
- slice_sql
- sub_sql
- trycast_sql
- try_sql
- log_sql
- use_sql
- binary
- function_fallback_sql
- func
- format_args
- too_wide
- format_time
- expressions
- op_expressions
- naked_property
- tag_sql
- token_sql
- userdefinedfunction_sql
- joinhint_sql
- kwarg_sql
- when_sql
- merge_sql
- tochar_sql
- tonumber_sql
- dictproperty_sql
- dictrange_sql
- dictsubproperty_sql
- duplicatekeyproperty_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
- 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
- jsonexists_sql
- arrayagg_sql
- apply_sql
- grant_sql
- grantprivilege_sql
- grantprincipal_sql
- columns_sql
- overlay_sql