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 "INSTR": lambda args: exp.StrPosition(substr=seq_get(args, 1), 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._parse_chr(), 333 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 334 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 335 "VALUES": lambda self: self.expression( 336 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 337 ), 338 "JSON_VALUE": lambda self: self._parse_json_value(), 339 } 340 341 STATEMENT_PARSERS = { 342 **parser.Parser.STATEMENT_PARSERS, 343 TokenType.SHOW: lambda self: self._parse_show(), 344 } 345 346 SHOW_PARSERS = { 347 "BINARY LOGS": _show_parser("BINARY LOGS"), 348 "MASTER LOGS": _show_parser("BINARY LOGS"), 349 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 350 "CHARACTER SET": _show_parser("CHARACTER SET"), 351 "CHARSET": _show_parser("CHARACTER SET"), 352 "COLLATION": _show_parser("COLLATION"), 353 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 354 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 355 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 356 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 357 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 358 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 359 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 360 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 361 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 362 "DATABASES": _show_parser("DATABASES"), 363 "SCHEMAS": _show_parser("DATABASES"), 364 "ENGINE": _show_parser("ENGINE", target=True), 365 "STORAGE ENGINES": _show_parser("ENGINES"), 366 "ENGINES": _show_parser("ENGINES"), 367 "ERRORS": _show_parser("ERRORS"), 368 "EVENTS": _show_parser("EVENTS"), 369 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 370 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 371 "GRANTS": _show_parser("GRANTS", target="FOR"), 372 "INDEX": _show_parser("INDEX", target="FROM"), 373 "MASTER STATUS": _show_parser("MASTER STATUS"), 374 "OPEN TABLES": _show_parser("OPEN TABLES"), 375 "PLUGINS": _show_parser("PLUGINS"), 376 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 377 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 378 "PRIVILEGES": _show_parser("PRIVILEGES"), 379 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 380 "PROCESSLIST": _show_parser("PROCESSLIST"), 381 "PROFILE": _show_parser("PROFILE"), 382 "PROFILES": _show_parser("PROFILES"), 383 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 384 "REPLICAS": _show_parser("REPLICAS"), 385 "SLAVE HOSTS": _show_parser("REPLICAS"), 386 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 387 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 388 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 389 "SESSION STATUS": _show_parser("STATUS"), 390 "STATUS": _show_parser("STATUS"), 391 "TABLE STATUS": _show_parser("TABLE STATUS"), 392 "FULL TABLES": _show_parser("TABLES", full=True), 393 "TABLES": _show_parser("TABLES"), 394 "TRIGGERS": _show_parser("TRIGGERS"), 395 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 396 "SESSION VARIABLES": _show_parser("VARIABLES"), 397 "VARIABLES": _show_parser("VARIABLES"), 398 "WARNINGS": _show_parser("WARNINGS"), 399 } 400 401 PROPERTY_PARSERS = { 402 **parser.Parser.PROPERTY_PARSERS, 403 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 404 } 405 406 SET_PARSERS = { 407 **parser.Parser.SET_PARSERS, 408 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 409 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 410 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 411 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 412 "NAMES": lambda self: self._parse_set_item_names(), 413 } 414 415 CONSTRAINT_PARSERS = { 416 **parser.Parser.CONSTRAINT_PARSERS, 417 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 418 "INDEX": lambda self: self._parse_index_constraint(), 419 "KEY": lambda self: self._parse_index_constraint(), 420 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 421 } 422 423 ALTER_PARSERS = { 424 **parser.Parser.ALTER_PARSERS, 425 "MODIFY": lambda self: self._parse_alter_table_alter(), 426 } 427 428 SCHEMA_UNNAMED_CONSTRAINTS = { 429 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 430 "FULLTEXT", 431 "INDEX", 432 "KEY", 433 "SPATIAL", 434 } 435 436 PROFILE_TYPES: parser.OPTIONS_TYPE = { 437 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 438 "BLOCK": ("IO",), 439 "CONTEXT": ("SWITCHES",), 440 "PAGE": ("FAULTS",), 441 } 442 443 TYPE_TOKENS = { 444 *parser.Parser.TYPE_TOKENS, 445 TokenType.SET, 446 } 447 448 ENUM_TYPE_TOKENS = { 449 *parser.Parser.ENUM_TYPE_TOKENS, 450 TokenType.SET, 451 } 452 453 LOG_DEFAULTS_TO_LN = True 454 STRING_ALIASES = True 455 VALUES_FOLLOWED_BY_PAREN = False 456 SUPPORTS_PARTITION_SELECTION = True 457 458 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 459 this = self._parse_id_var() 460 if not self._match(TokenType.L_PAREN): 461 return this 462 463 expression = self._parse_number() 464 self._match_r_paren() 465 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 466 467 def _parse_index_constraint( 468 self, kind: t.Optional[str] = None 469 ) -> exp.IndexColumnConstraint: 470 if kind: 471 self._match_texts(("INDEX", "KEY")) 472 473 this = self._parse_id_var(any_token=False) 474 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 475 expressions = self._parse_wrapped_csv(self._parse_ordered) 476 477 options = [] 478 while True: 479 if self._match_text_seq("KEY_BLOCK_SIZE"): 480 self._match(TokenType.EQ) 481 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 482 elif self._match(TokenType.USING): 483 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 484 elif self._match_text_seq("WITH", "PARSER"): 485 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 486 elif self._match(TokenType.COMMENT): 487 opt = exp.IndexConstraintOption(comment=self._parse_string()) 488 elif self._match_text_seq("VISIBLE"): 489 opt = exp.IndexConstraintOption(visible=True) 490 elif self._match_text_seq("INVISIBLE"): 491 opt = exp.IndexConstraintOption(visible=False) 492 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 493 self._match(TokenType.EQ) 494 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 495 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 496 self._match(TokenType.EQ) 497 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 498 else: 499 opt = None 500 501 if not opt: 502 break 503 504 options.append(opt) 505 506 return self.expression( 507 exp.IndexColumnConstraint, 508 this=this, 509 expressions=expressions, 510 kind=kind, 511 index_type=index_type, 512 options=options, 513 ) 514 515 def _parse_show_mysql( 516 self, 517 this: str, 518 target: bool | str = False, 519 full: t.Optional[bool] = None, 520 global_: t.Optional[bool] = None, 521 ) -> exp.Show: 522 if target: 523 if isinstance(target, str): 524 self._match_text_seq(target) 525 target_id = self._parse_id_var() 526 else: 527 target_id = None 528 529 log = self._parse_string() if self._match_text_seq("IN") else None 530 531 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 532 position = self._parse_number() if self._match_text_seq("FROM") else None 533 db = None 534 else: 535 position = None 536 db = None 537 538 if self._match(TokenType.FROM): 539 db = self._parse_id_var() 540 elif self._match(TokenType.DOT): 541 db = target_id 542 target_id = self._parse_id_var() 543 544 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 545 546 like = self._parse_string() if self._match_text_seq("LIKE") else None 547 where = self._parse_where() 548 549 if this == "PROFILE": 550 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 551 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 552 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 553 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 554 else: 555 types, query = None, None 556 offset, limit = self._parse_oldstyle_limit() 557 558 mutex = True if self._match_text_seq("MUTEX") else None 559 mutex = False if self._match_text_seq("STATUS") else mutex 560 561 return self.expression( 562 exp.Show, 563 this=this, 564 target=target_id, 565 full=full, 566 log=log, 567 position=position, 568 db=db, 569 channel=channel, 570 like=like, 571 where=where, 572 types=types, 573 query=query, 574 offset=offset, 575 limit=limit, 576 mutex=mutex, 577 **{"global": global_}, # type: ignore 578 ) 579 580 def _parse_oldstyle_limit( 581 self, 582 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 583 limit = None 584 offset = None 585 if self._match_text_seq("LIMIT"): 586 parts = self._parse_csv(self._parse_number) 587 if len(parts) == 1: 588 limit = parts[0] 589 elif len(parts) == 2: 590 limit = parts[1] 591 offset = parts[0] 592 593 return offset, limit 594 595 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 596 this = self._parse_string() or self._parse_unquoted_field() 597 return self.expression(exp.SetItem, this=this, kind=kind) 598 599 def _parse_set_item_names(self) -> exp.Expression: 600 charset = self._parse_string() or self._parse_unquoted_field() 601 if self._match_text_seq("COLLATE"): 602 collate = self._parse_string() or self._parse_unquoted_field() 603 else: 604 collate = None 605 606 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 607 608 def _parse_type( 609 self, parse_interval: bool = True, fallback_to_identifier: bool = False 610 ) -> t.Optional[exp.Expression]: 611 # mysql binary is special and can work anywhere, even in order by operations 612 # it operates like a no paren func 613 if self._match(TokenType.BINARY, advance=False): 614 data_type = self._parse_types(check_func=True, allow_identifiers=False) 615 616 if isinstance(data_type, exp.DataType): 617 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 618 619 return super()._parse_type( 620 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 621 ) 622 623 def _parse_chr(self) -> t.Optional[exp.Expression]: 624 expressions = self._parse_csv(self._parse_assignment) 625 kwargs: t.Dict[str, t.Any] = {"this": seq_get(expressions, 0)} 626 627 if len(expressions) > 1: 628 kwargs["expressions"] = expressions[1:] 629 630 if self._match(TokenType.USING): 631 kwargs["charset"] = self._parse_var() 632 633 return self.expression(exp.Chr, **kwargs) 634 635 def _parse_group_concat(self) -> t.Optional[exp.Expression]: 636 def concat_exprs( 637 node: t.Optional[exp.Expression], exprs: t.List[exp.Expression] 638 ) -> exp.Expression: 639 if isinstance(node, exp.Distinct) and len(node.expressions) > 1: 640 concat_exprs = [ 641 self.expression(exp.Concat, expressions=node.expressions, safe=True) 642 ] 643 node.set("expressions", concat_exprs) 644 return node 645 if len(exprs) == 1: 646 return exprs[0] 647 return self.expression(exp.Concat, expressions=args, safe=True) 648 649 args = self._parse_csv(self._parse_lambda) 650 651 if args: 652 order = args[-1] if isinstance(args[-1], exp.Order) else None 653 654 if order: 655 # Order By is the last (or only) expression in the list and has consumed the 'expr' before it, 656 # remove 'expr' from exp.Order and add it back to args 657 args[-1] = order.this 658 order.set("this", concat_exprs(order.this, args)) 659 660 this = order or concat_exprs(args[0], args) 661 else: 662 this = None 663 664 separator = self._parse_field() if self._match(TokenType.SEPARATOR) else None 665 666 return self.expression(exp.GroupConcat, this=this, separator=separator) 667 668 def _parse_json_value(self) -> exp.JSONValue: 669 this = self._parse_bitwise() 670 self._match(TokenType.COMMA) 671 path = self._parse_bitwise() 672 673 returning = self._match(TokenType.RETURNING) and self._parse_type() 674 675 return self.expression( 676 exp.JSONValue, 677 this=this, 678 path=self.dialect.to_json_path(path), 679 returning=returning, 680 on_condition=self._parse_on_condition(), 681 ) 682 683 class Generator(generator.Generator): 684 INTERVAL_ALLOWS_PLURAL_FORM = False 685 LOCKING_READS_SUPPORTED = True 686 NULL_ORDERING_SUPPORTED = None 687 JOIN_HINTS = False 688 TABLE_HINTS = True 689 DUPLICATE_KEY_UPDATE_WITH_SET = False 690 QUERY_HINT_SEP = " " 691 VALUES_AS_TABLE = False 692 NVL2_SUPPORTED = False 693 LAST_DAY_SUPPORTS_DATE_PART = False 694 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 695 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 696 JSON_KEY_VALUE_PAIR_SEP = "," 697 SUPPORTS_TO_NUMBER = False 698 PARSE_JSON_NAME: t.Optional[str] = None 699 PAD_FILL_PATTERN_IS_REQUIRED = True 700 WRAP_DERIVED_VALUES = False 701 702 TRANSFORMS = { 703 **generator.Generator.TRANSFORMS, 704 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 705 exp.CurrentDate: no_paren_current_date_sql, 706 exp.DateDiff: _remove_ts_or_ds_to_date( 707 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 708 ), 709 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 710 exp.DateStrToDate: datestrtodate_sql, 711 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 712 exp.DateTrunc: _date_trunc_sql, 713 exp.Day: _remove_ts_or_ds_to_date(), 714 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 715 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 716 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 717 exp.GroupConcat: lambda self, 718 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 719 exp.ILike: no_ilike_sql, 720 exp.JSONExtractScalar: arrow_json_extract_sql, 721 exp.Max: max_or_greatest, 722 exp.Min: min_or_least, 723 exp.Month: _remove_ts_or_ds_to_date(), 724 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 725 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 726 exp.Pivot: no_pivot_sql, 727 exp.Select: transforms.preprocess( 728 [ 729 transforms.eliminate_distinct_on, 730 transforms.eliminate_semi_and_anti_joins, 731 transforms.eliminate_qualify, 732 transforms.eliminate_full_outer_join, 733 transforms.unnest_generate_date_array_using_recursive_cte, 734 ] 735 ), 736 exp.StrPosition: strposition_to_locate_sql, 737 exp.StrToDate: _str_to_date_sql, 738 exp.StrToTime: _str_to_date_sql, 739 exp.Stuff: rename_func("INSERT"), 740 exp.TableSample: no_tablesample_sql, 741 exp.TimeFromParts: rename_func("MAKETIME"), 742 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 743 exp.TimestampDiff: lambda self, e: self.func( 744 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 745 ), 746 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 747 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 748 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 749 self, 750 e, 751 include_precision=not e.args.get("zone"), 752 ), 753 exp.TimeToStr: _remove_ts_or_ds_to_date( 754 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 755 ), 756 exp.Trim: trim_sql, 757 exp.TryCast: no_trycast_sql, 758 exp.TsOrDsAdd: date_add_sql("ADD"), 759 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 760 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 761 exp.UnixToTime: _unix_to_time_sql, 762 exp.Week: _remove_ts_or_ds_to_date(), 763 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 764 exp.Year: _remove_ts_or_ds_to_date(), 765 } 766 767 UNSIGNED_TYPE_MAPPING = { 768 exp.DataType.Type.UBIGINT: "BIGINT", 769 exp.DataType.Type.UINT: "INT", 770 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 771 exp.DataType.Type.USMALLINT: "SMALLINT", 772 exp.DataType.Type.UTINYINT: "TINYINT", 773 exp.DataType.Type.UDECIMAL: "DECIMAL", 774 } 775 776 TIMESTAMP_TYPE_MAPPING = { 777 exp.DataType.Type.TIMESTAMP: "DATETIME", 778 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 779 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 780 } 781 782 TYPE_MAPPING = { 783 **generator.Generator.TYPE_MAPPING, 784 **UNSIGNED_TYPE_MAPPING, 785 **TIMESTAMP_TYPE_MAPPING, 786 } 787 788 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 789 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 790 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 791 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 792 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 793 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 794 795 PROPERTIES_LOCATION = { 796 **generator.Generator.PROPERTIES_LOCATION, 797 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 798 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 799 } 800 801 LIMIT_FETCH = "LIMIT" 802 803 LIMIT_ONLY_LITERALS = True 804 805 CHAR_CAST_MAPPING = dict.fromkeys( 806 ( 807 exp.DataType.Type.LONGTEXT, 808 exp.DataType.Type.LONGBLOB, 809 exp.DataType.Type.MEDIUMBLOB, 810 exp.DataType.Type.MEDIUMTEXT, 811 exp.DataType.Type.TEXT, 812 exp.DataType.Type.TINYBLOB, 813 exp.DataType.Type.TINYTEXT, 814 exp.DataType.Type.VARCHAR, 815 ), 816 "CHAR", 817 ) 818 SIGNED_CAST_MAPPING = dict.fromkeys( 819 ( 820 exp.DataType.Type.BIGINT, 821 exp.DataType.Type.BOOLEAN, 822 exp.DataType.Type.INT, 823 exp.DataType.Type.SMALLINT, 824 exp.DataType.Type.TINYINT, 825 exp.DataType.Type.MEDIUMINT, 826 ), 827 "SIGNED", 828 ) 829 830 # MySQL doesn't support many datatypes in cast. 831 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 832 CAST_MAPPING = { 833 **CHAR_CAST_MAPPING, 834 **SIGNED_CAST_MAPPING, 835 exp.DataType.Type.UBIGINT: "UNSIGNED", 836 } 837 838 TIMESTAMP_FUNC_TYPES = { 839 exp.DataType.Type.TIMESTAMPTZ, 840 exp.DataType.Type.TIMESTAMPLTZ, 841 } 842 843 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 844 RESERVED_KEYWORDS = { 845 "accessible", 846 "add", 847 "all", 848 "alter", 849 "analyze", 850 "and", 851 "as", 852 "asc", 853 "asensitive", 854 "before", 855 "between", 856 "bigint", 857 "binary", 858 "blob", 859 "both", 860 "by", 861 "call", 862 "cascade", 863 "case", 864 "change", 865 "char", 866 "character", 867 "check", 868 "collate", 869 "column", 870 "condition", 871 "constraint", 872 "continue", 873 "convert", 874 "create", 875 "cross", 876 "cube", 877 "cume_dist", 878 "current_date", 879 "current_time", 880 "current_timestamp", 881 "current_user", 882 "cursor", 883 "database", 884 "databases", 885 "day_hour", 886 "day_microsecond", 887 "day_minute", 888 "day_second", 889 "dec", 890 "decimal", 891 "declare", 892 "default", 893 "delayed", 894 "delete", 895 "dense_rank", 896 "desc", 897 "describe", 898 "deterministic", 899 "distinct", 900 "distinctrow", 901 "div", 902 "double", 903 "drop", 904 "dual", 905 "each", 906 "else", 907 "elseif", 908 "empty", 909 "enclosed", 910 "escaped", 911 "except", 912 "exists", 913 "exit", 914 "explain", 915 "false", 916 "fetch", 917 "first_value", 918 "float", 919 "float4", 920 "float8", 921 "for", 922 "force", 923 "foreign", 924 "from", 925 "fulltext", 926 "function", 927 "generated", 928 "get", 929 "grant", 930 "group", 931 "grouping", 932 "groups", 933 "having", 934 "high_priority", 935 "hour_microsecond", 936 "hour_minute", 937 "hour_second", 938 "if", 939 "ignore", 940 "in", 941 "index", 942 "infile", 943 "inner", 944 "inout", 945 "insensitive", 946 "insert", 947 "int", 948 "int1", 949 "int2", 950 "int3", 951 "int4", 952 "int8", 953 "integer", 954 "intersect", 955 "interval", 956 "into", 957 "io_after_gtids", 958 "io_before_gtids", 959 "is", 960 "iterate", 961 "join", 962 "json_table", 963 "key", 964 "keys", 965 "kill", 966 "lag", 967 "last_value", 968 "lateral", 969 "lead", 970 "leading", 971 "leave", 972 "left", 973 "like", 974 "limit", 975 "linear", 976 "lines", 977 "load", 978 "localtime", 979 "localtimestamp", 980 "lock", 981 "long", 982 "longblob", 983 "longtext", 984 "loop", 985 "low_priority", 986 "master_bind", 987 "master_ssl_verify_server_cert", 988 "match", 989 "maxvalue", 990 "mediumblob", 991 "mediumint", 992 "mediumtext", 993 "middleint", 994 "minute_microsecond", 995 "minute_second", 996 "mod", 997 "modifies", 998 "natural", 999 "not", 1000 "no_write_to_binlog", 1001 "nth_value", 1002 "ntile", 1003 "null", 1004 "numeric", 1005 "of", 1006 "on", 1007 "optimize", 1008 "optimizer_costs", 1009 "option", 1010 "optionally", 1011 "or", 1012 "order", 1013 "out", 1014 "outer", 1015 "outfile", 1016 "over", 1017 "partition", 1018 "percent_rank", 1019 "precision", 1020 "primary", 1021 "procedure", 1022 "purge", 1023 "range", 1024 "rank", 1025 "read", 1026 "reads", 1027 "read_write", 1028 "real", 1029 "recursive", 1030 "references", 1031 "regexp", 1032 "release", 1033 "rename", 1034 "repeat", 1035 "replace", 1036 "require", 1037 "resignal", 1038 "restrict", 1039 "return", 1040 "revoke", 1041 "right", 1042 "rlike", 1043 "row", 1044 "rows", 1045 "row_number", 1046 "schema", 1047 "schemas", 1048 "second_microsecond", 1049 "select", 1050 "sensitive", 1051 "separator", 1052 "set", 1053 "show", 1054 "signal", 1055 "smallint", 1056 "spatial", 1057 "specific", 1058 "sql", 1059 "sqlexception", 1060 "sqlstate", 1061 "sqlwarning", 1062 "sql_big_result", 1063 "sql_calc_found_rows", 1064 "sql_small_result", 1065 "ssl", 1066 "starting", 1067 "stored", 1068 "straight_join", 1069 "system", 1070 "table", 1071 "terminated", 1072 "then", 1073 "tinyblob", 1074 "tinyint", 1075 "tinytext", 1076 "to", 1077 "trailing", 1078 "trigger", 1079 "true", 1080 "undo", 1081 "union", 1082 "unique", 1083 "unlock", 1084 "unsigned", 1085 "update", 1086 "usage", 1087 "use", 1088 "using", 1089 "utc_date", 1090 "utc_time", 1091 "utc_timestamp", 1092 "values", 1093 "varbinary", 1094 "varchar", 1095 "varcharacter", 1096 "varying", 1097 "virtual", 1098 "when", 1099 "where", 1100 "while", 1101 "window", 1102 "with", 1103 "write", 1104 "xor", 1105 "year_month", 1106 "zerofill", 1107 } 1108 1109 def array_sql(self, expression: exp.Array) -> str: 1110 self.unsupported("Arrays are not supported by MySQL") 1111 return self.function_fallback_sql(expression) 1112 1113 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1114 self.unsupported("Array operations are not supported by MySQL") 1115 return self.function_fallback_sql(expression) 1116 1117 def dpipe_sql(self, expression: exp.DPipe) -> str: 1118 return self.func("CONCAT", *expression.flatten()) 1119 1120 def extract_sql(self, expression: exp.Extract) -> str: 1121 unit = expression.name 1122 if unit and unit.lower() == "epoch": 1123 return self.func("UNIX_TIMESTAMP", expression.expression) 1124 1125 return super().extract_sql(expression) 1126 1127 def datatype_sql(self, expression: exp.DataType) -> str: 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 return result 1133 1134 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1135 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1136 1137 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1138 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1139 return self.func("TIMESTAMP", expression.this) 1140 1141 to = self.CAST_MAPPING.get(expression.to.this) 1142 1143 if to: 1144 expression.to.set("this", to) 1145 return super().cast_sql(expression) 1146 1147 def show_sql(self, expression: exp.Show) -> str: 1148 this = f" {expression.name}" 1149 full = " FULL" if expression.args.get("full") else "" 1150 global_ = " GLOBAL" if expression.args.get("global") else "" 1151 1152 target = self.sql(expression, "target") 1153 target = f" {target}" if target else "" 1154 if expression.name in ("COLUMNS", "INDEX"): 1155 target = f" FROM{target}" 1156 elif expression.name == "GRANTS": 1157 target = f" FOR{target}" 1158 1159 db = self._prefixed_sql("FROM", expression, "db") 1160 1161 like = self._prefixed_sql("LIKE", expression, "like") 1162 where = self.sql(expression, "where") 1163 1164 types = self.expressions(expression, key="types") 1165 types = f" {types}" if types else types 1166 query = self._prefixed_sql("FOR QUERY", expression, "query") 1167 1168 if expression.name == "PROFILE": 1169 offset = self._prefixed_sql("OFFSET", expression, "offset") 1170 limit = self._prefixed_sql("LIMIT", expression, "limit") 1171 else: 1172 offset = "" 1173 limit = self._oldstyle_limit_sql(expression) 1174 1175 log = self._prefixed_sql("IN", expression, "log") 1176 position = self._prefixed_sql("FROM", expression, "position") 1177 1178 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1179 1180 if expression.name == "ENGINE": 1181 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1182 else: 1183 mutex_or_status = "" 1184 1185 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1186 1187 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1188 dtype = self.sql(expression, "dtype") 1189 if not dtype: 1190 return super().altercolumn_sql(expression) 1191 1192 this = self.sql(expression, "this") 1193 return f"MODIFY COLUMN {this} {dtype}" 1194 1195 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1196 sql = self.sql(expression, arg) 1197 return f" {prefix} {sql}" if sql else "" 1198 1199 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1200 limit = self.sql(expression, "limit") 1201 offset = self.sql(expression, "offset") 1202 if limit: 1203 limit_offset = f"{offset}, {limit}" if offset else limit 1204 return f" LIMIT {limit_offset}" 1205 return "" 1206 1207 def chr_sql(self, expression: exp.Chr) -> str: 1208 this = self.expressions(sqls=[expression.this] + expression.expressions) 1209 charset = expression.args.get("charset") 1210 using = f" USING {self.sql(charset)}" if charset else "" 1211 return f"CHAR({this}{using})" 1212 1213 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1214 unit = expression.args.get("unit") 1215 1216 # Pick an old-enough date to avoid negative timestamp diffs 1217 start_ts = "'0000-01-01 00:00:00'" 1218 1219 # Source: https://stackoverflow.com/a/32955740 1220 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1221 interval = exp.Interval(this=timestamp_diff, unit=unit) 1222 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1223 1224 return self.sql(dateadd) 1225 1226 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1227 from_tz = expression.args.get("source_tz") 1228 to_tz = expression.args.get("target_tz") 1229 dt = expression.args.get("timestamp") 1230 1231 return self.func("CONVERT_TZ", dt, from_tz, to_tz) 1232 1233 def attimezone_sql(self, expression: exp.AtTimeZone) -> str: 1234 self.unsupported("AT TIME ZONE is not supported by MySQL") 1235 return self.sql(expression.this)
TIME_SPECIFIERS =
{'H', 'S', 'h', 'I', 'f', 'p', 'i', 'r', 's', 'T', 'k', 'l'}
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 "INSTR": lambda args: exp.StrPosition(substr=seq_get(args, 1), this=seq_get(args, 0)), 305 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 306 "ISNULL": isnull_to_is_null, 307 "LOCATE": locate_to_strposition, 308 "MAKETIME": exp.TimeFromParts.from_arg_list, 309 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 310 "MONTHNAME": lambda args: exp.TimeToStr( 311 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 312 format=exp.Literal.string("%B"), 313 ), 314 "STR_TO_DATE": _str_to_date, 315 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 316 "TO_DAYS": lambda args: exp.paren( 317 exp.DateDiff( 318 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 319 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 320 unit=exp.var("DAY"), 321 ) 322 + 1 323 ), 324 "WEEK": lambda args: exp.Week( 325 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 326 ), 327 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 328 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 329 } 330 331 FUNCTION_PARSERS = { 332 **parser.Parser.FUNCTION_PARSERS, 333 "CHAR": lambda self: self._parse_chr(), 334 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 335 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 336 "VALUES": lambda self: self.expression( 337 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 338 ), 339 "JSON_VALUE": lambda self: self._parse_json_value(), 340 } 341 342 STATEMENT_PARSERS = { 343 **parser.Parser.STATEMENT_PARSERS, 344 TokenType.SHOW: lambda self: self._parse_show(), 345 } 346 347 SHOW_PARSERS = { 348 "BINARY LOGS": _show_parser("BINARY LOGS"), 349 "MASTER LOGS": _show_parser("BINARY LOGS"), 350 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 351 "CHARACTER SET": _show_parser("CHARACTER SET"), 352 "CHARSET": _show_parser("CHARACTER SET"), 353 "COLLATION": _show_parser("COLLATION"), 354 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 355 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 356 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 357 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 358 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 359 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 360 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 361 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 362 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 363 "DATABASES": _show_parser("DATABASES"), 364 "SCHEMAS": _show_parser("DATABASES"), 365 "ENGINE": _show_parser("ENGINE", target=True), 366 "STORAGE ENGINES": _show_parser("ENGINES"), 367 "ENGINES": _show_parser("ENGINES"), 368 "ERRORS": _show_parser("ERRORS"), 369 "EVENTS": _show_parser("EVENTS"), 370 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 371 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 372 "GRANTS": _show_parser("GRANTS", target="FOR"), 373 "INDEX": _show_parser("INDEX", target="FROM"), 374 "MASTER STATUS": _show_parser("MASTER STATUS"), 375 "OPEN TABLES": _show_parser("OPEN TABLES"), 376 "PLUGINS": _show_parser("PLUGINS"), 377 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 378 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 379 "PRIVILEGES": _show_parser("PRIVILEGES"), 380 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 381 "PROCESSLIST": _show_parser("PROCESSLIST"), 382 "PROFILE": _show_parser("PROFILE"), 383 "PROFILES": _show_parser("PROFILES"), 384 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 385 "REPLICAS": _show_parser("REPLICAS"), 386 "SLAVE HOSTS": _show_parser("REPLICAS"), 387 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 388 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 389 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 390 "SESSION STATUS": _show_parser("STATUS"), 391 "STATUS": _show_parser("STATUS"), 392 "TABLE STATUS": _show_parser("TABLE STATUS"), 393 "FULL TABLES": _show_parser("TABLES", full=True), 394 "TABLES": _show_parser("TABLES"), 395 "TRIGGERS": _show_parser("TRIGGERS"), 396 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 397 "SESSION VARIABLES": _show_parser("VARIABLES"), 398 "VARIABLES": _show_parser("VARIABLES"), 399 "WARNINGS": _show_parser("WARNINGS"), 400 } 401 402 PROPERTY_PARSERS = { 403 **parser.Parser.PROPERTY_PARSERS, 404 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 405 } 406 407 SET_PARSERS = { 408 **parser.Parser.SET_PARSERS, 409 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 410 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 411 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 412 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 413 "NAMES": lambda self: self._parse_set_item_names(), 414 } 415 416 CONSTRAINT_PARSERS = { 417 **parser.Parser.CONSTRAINT_PARSERS, 418 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 419 "INDEX": lambda self: self._parse_index_constraint(), 420 "KEY": lambda self: self._parse_index_constraint(), 421 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 422 } 423 424 ALTER_PARSERS = { 425 **parser.Parser.ALTER_PARSERS, 426 "MODIFY": lambda self: self._parse_alter_table_alter(), 427 } 428 429 SCHEMA_UNNAMED_CONSTRAINTS = { 430 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 431 "FULLTEXT", 432 "INDEX", 433 "KEY", 434 "SPATIAL", 435 } 436 437 PROFILE_TYPES: parser.OPTIONS_TYPE = { 438 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 439 "BLOCK": ("IO",), 440 "CONTEXT": ("SWITCHES",), 441 "PAGE": ("FAULTS",), 442 } 443 444 TYPE_TOKENS = { 445 *parser.Parser.TYPE_TOKENS, 446 TokenType.SET, 447 } 448 449 ENUM_TYPE_TOKENS = { 450 *parser.Parser.ENUM_TYPE_TOKENS, 451 TokenType.SET, 452 } 453 454 LOG_DEFAULTS_TO_LN = True 455 STRING_ALIASES = True 456 VALUES_FOLLOWED_BY_PAREN = False 457 SUPPORTS_PARTITION_SELECTION = True 458 459 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 460 this = self._parse_id_var() 461 if not self._match(TokenType.L_PAREN): 462 return this 463 464 expression = self._parse_number() 465 self._match_r_paren() 466 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 467 468 def _parse_index_constraint( 469 self, kind: t.Optional[str] = None 470 ) -> exp.IndexColumnConstraint: 471 if kind: 472 self._match_texts(("INDEX", "KEY")) 473 474 this = self._parse_id_var(any_token=False) 475 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 476 expressions = self._parse_wrapped_csv(self._parse_ordered) 477 478 options = [] 479 while True: 480 if self._match_text_seq("KEY_BLOCK_SIZE"): 481 self._match(TokenType.EQ) 482 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 483 elif self._match(TokenType.USING): 484 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 485 elif self._match_text_seq("WITH", "PARSER"): 486 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 487 elif self._match(TokenType.COMMENT): 488 opt = exp.IndexConstraintOption(comment=self._parse_string()) 489 elif self._match_text_seq("VISIBLE"): 490 opt = exp.IndexConstraintOption(visible=True) 491 elif self._match_text_seq("INVISIBLE"): 492 opt = exp.IndexConstraintOption(visible=False) 493 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 494 self._match(TokenType.EQ) 495 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 496 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 497 self._match(TokenType.EQ) 498 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 499 else: 500 opt = None 501 502 if not opt: 503 break 504 505 options.append(opt) 506 507 return self.expression( 508 exp.IndexColumnConstraint, 509 this=this, 510 expressions=expressions, 511 kind=kind, 512 index_type=index_type, 513 options=options, 514 ) 515 516 def _parse_show_mysql( 517 self, 518 this: str, 519 target: bool | str = False, 520 full: t.Optional[bool] = None, 521 global_: t.Optional[bool] = None, 522 ) -> exp.Show: 523 if target: 524 if isinstance(target, str): 525 self._match_text_seq(target) 526 target_id = self._parse_id_var() 527 else: 528 target_id = None 529 530 log = self._parse_string() if self._match_text_seq("IN") else None 531 532 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 533 position = self._parse_number() if self._match_text_seq("FROM") else None 534 db = None 535 else: 536 position = None 537 db = None 538 539 if self._match(TokenType.FROM): 540 db = self._parse_id_var() 541 elif self._match(TokenType.DOT): 542 db = target_id 543 target_id = self._parse_id_var() 544 545 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 546 547 like = self._parse_string() if self._match_text_seq("LIKE") else None 548 where = self._parse_where() 549 550 if this == "PROFILE": 551 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 552 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 553 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 554 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 555 else: 556 types, query = None, None 557 offset, limit = self._parse_oldstyle_limit() 558 559 mutex = True if self._match_text_seq("MUTEX") else None 560 mutex = False if self._match_text_seq("STATUS") else mutex 561 562 return self.expression( 563 exp.Show, 564 this=this, 565 target=target_id, 566 full=full, 567 log=log, 568 position=position, 569 db=db, 570 channel=channel, 571 like=like, 572 where=where, 573 types=types, 574 query=query, 575 offset=offset, 576 limit=limit, 577 mutex=mutex, 578 **{"global": global_}, # type: ignore 579 ) 580 581 def _parse_oldstyle_limit( 582 self, 583 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 584 limit = None 585 offset = None 586 if self._match_text_seq("LIMIT"): 587 parts = self._parse_csv(self._parse_number) 588 if len(parts) == 1: 589 limit = parts[0] 590 elif len(parts) == 2: 591 limit = parts[1] 592 offset = parts[0] 593 594 return offset, limit 595 596 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 597 this = self._parse_string() or self._parse_unquoted_field() 598 return self.expression(exp.SetItem, this=this, kind=kind) 599 600 def _parse_set_item_names(self) -> exp.Expression: 601 charset = self._parse_string() or self._parse_unquoted_field() 602 if self._match_text_seq("COLLATE"): 603 collate = self._parse_string() or self._parse_unquoted_field() 604 else: 605 collate = None 606 607 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 608 609 def _parse_type( 610 self, parse_interval: bool = True, fallback_to_identifier: bool = False 611 ) -> t.Optional[exp.Expression]: 612 # mysql binary is special and can work anywhere, even in order by operations 613 # it operates like a no paren func 614 if self._match(TokenType.BINARY, advance=False): 615 data_type = self._parse_types(check_func=True, allow_identifiers=False) 616 617 if isinstance(data_type, exp.DataType): 618 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 619 620 return super()._parse_type( 621 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 622 ) 623 624 def _parse_chr(self) -> t.Optional[exp.Expression]: 625 expressions = self._parse_csv(self._parse_assignment) 626 kwargs: t.Dict[str, t.Any] = {"this": seq_get(expressions, 0)} 627 628 if len(expressions) > 1: 629 kwargs["expressions"] = expressions[1:] 630 631 if self._match(TokenType.USING): 632 kwargs["charset"] = self._parse_var() 633 634 return self.expression(exp.Chr, **kwargs) 635 636 def _parse_group_concat(self) -> t.Optional[exp.Expression]: 637 def concat_exprs( 638 node: t.Optional[exp.Expression], exprs: t.List[exp.Expression] 639 ) -> exp.Expression: 640 if isinstance(node, exp.Distinct) and len(node.expressions) > 1: 641 concat_exprs = [ 642 self.expression(exp.Concat, expressions=node.expressions, safe=True) 643 ] 644 node.set("expressions", concat_exprs) 645 return node 646 if len(exprs) == 1: 647 return exprs[0] 648 return self.expression(exp.Concat, expressions=args, safe=True) 649 650 args = self._parse_csv(self._parse_lambda) 651 652 if args: 653 order = args[-1] if isinstance(args[-1], exp.Order) else None 654 655 if order: 656 # Order By is the last (or only) expression in the list and has consumed the 'expr' before it, 657 # remove 'expr' from exp.Order and add it back to args 658 args[-1] = order.this 659 order.set("this", concat_exprs(order.this, args)) 660 661 this = order or concat_exprs(args[0], args) 662 else: 663 this = None 664 665 separator = self._parse_field() if self._match(TokenType.SEPARATOR) else None 666 667 return self.expression(exp.GroupConcat, this=this, separator=separator) 668 669 def _parse_json_value(self) -> exp.JSONValue: 670 this = self._parse_bitwise() 671 self._match(TokenType.COMMA) 672 path = self._parse_bitwise() 673 674 returning = self._match(TokenType.RETURNING) and self._parse_type() 675 676 return self.expression( 677 exp.JSONValue, 678 this=this, 679 path=self.dialect.to_json_path(path), 680 returning=returning, 681 on_condition=self._parse_on_condition(), 682 ) 683 684 class Generator(generator.Generator): 685 INTERVAL_ALLOWS_PLURAL_FORM = False 686 LOCKING_READS_SUPPORTED = True 687 NULL_ORDERING_SUPPORTED = None 688 JOIN_HINTS = False 689 TABLE_HINTS = True 690 DUPLICATE_KEY_UPDATE_WITH_SET = False 691 QUERY_HINT_SEP = " " 692 VALUES_AS_TABLE = False 693 NVL2_SUPPORTED = False 694 LAST_DAY_SUPPORTS_DATE_PART = False 695 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 696 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 697 JSON_KEY_VALUE_PAIR_SEP = "," 698 SUPPORTS_TO_NUMBER = False 699 PARSE_JSON_NAME: t.Optional[str] = None 700 PAD_FILL_PATTERN_IS_REQUIRED = True 701 WRAP_DERIVED_VALUES = False 702 703 TRANSFORMS = { 704 **generator.Generator.TRANSFORMS, 705 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 706 exp.CurrentDate: no_paren_current_date_sql, 707 exp.DateDiff: _remove_ts_or_ds_to_date( 708 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 709 ), 710 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 711 exp.DateStrToDate: datestrtodate_sql, 712 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 713 exp.DateTrunc: _date_trunc_sql, 714 exp.Day: _remove_ts_or_ds_to_date(), 715 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 716 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 717 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 718 exp.GroupConcat: lambda self, 719 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 720 exp.ILike: no_ilike_sql, 721 exp.JSONExtractScalar: arrow_json_extract_sql, 722 exp.Max: max_or_greatest, 723 exp.Min: min_or_least, 724 exp.Month: _remove_ts_or_ds_to_date(), 725 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 726 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 727 exp.Pivot: no_pivot_sql, 728 exp.Select: transforms.preprocess( 729 [ 730 transforms.eliminate_distinct_on, 731 transforms.eliminate_semi_and_anti_joins, 732 transforms.eliminate_qualify, 733 transforms.eliminate_full_outer_join, 734 transforms.unnest_generate_date_array_using_recursive_cte, 735 ] 736 ), 737 exp.StrPosition: strposition_to_locate_sql, 738 exp.StrToDate: _str_to_date_sql, 739 exp.StrToTime: _str_to_date_sql, 740 exp.Stuff: rename_func("INSERT"), 741 exp.TableSample: no_tablesample_sql, 742 exp.TimeFromParts: rename_func("MAKETIME"), 743 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 744 exp.TimestampDiff: lambda self, e: self.func( 745 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 746 ), 747 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 748 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 749 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 750 self, 751 e, 752 include_precision=not e.args.get("zone"), 753 ), 754 exp.TimeToStr: _remove_ts_or_ds_to_date( 755 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 756 ), 757 exp.Trim: trim_sql, 758 exp.TryCast: no_trycast_sql, 759 exp.TsOrDsAdd: date_add_sql("ADD"), 760 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 761 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 762 exp.UnixToTime: _unix_to_time_sql, 763 exp.Week: _remove_ts_or_ds_to_date(), 764 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 765 exp.Year: _remove_ts_or_ds_to_date(), 766 } 767 768 UNSIGNED_TYPE_MAPPING = { 769 exp.DataType.Type.UBIGINT: "BIGINT", 770 exp.DataType.Type.UINT: "INT", 771 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 772 exp.DataType.Type.USMALLINT: "SMALLINT", 773 exp.DataType.Type.UTINYINT: "TINYINT", 774 exp.DataType.Type.UDECIMAL: "DECIMAL", 775 } 776 777 TIMESTAMP_TYPE_MAPPING = { 778 exp.DataType.Type.TIMESTAMP: "DATETIME", 779 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 780 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 781 } 782 783 TYPE_MAPPING = { 784 **generator.Generator.TYPE_MAPPING, 785 **UNSIGNED_TYPE_MAPPING, 786 **TIMESTAMP_TYPE_MAPPING, 787 } 788 789 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 790 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 791 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 792 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 793 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 794 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 795 796 PROPERTIES_LOCATION = { 797 **generator.Generator.PROPERTIES_LOCATION, 798 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 799 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 800 } 801 802 LIMIT_FETCH = "LIMIT" 803 804 LIMIT_ONLY_LITERALS = True 805 806 CHAR_CAST_MAPPING = dict.fromkeys( 807 ( 808 exp.DataType.Type.LONGTEXT, 809 exp.DataType.Type.LONGBLOB, 810 exp.DataType.Type.MEDIUMBLOB, 811 exp.DataType.Type.MEDIUMTEXT, 812 exp.DataType.Type.TEXT, 813 exp.DataType.Type.TINYBLOB, 814 exp.DataType.Type.TINYTEXT, 815 exp.DataType.Type.VARCHAR, 816 ), 817 "CHAR", 818 ) 819 SIGNED_CAST_MAPPING = dict.fromkeys( 820 ( 821 exp.DataType.Type.BIGINT, 822 exp.DataType.Type.BOOLEAN, 823 exp.DataType.Type.INT, 824 exp.DataType.Type.SMALLINT, 825 exp.DataType.Type.TINYINT, 826 exp.DataType.Type.MEDIUMINT, 827 ), 828 "SIGNED", 829 ) 830 831 # MySQL doesn't support many datatypes in cast. 832 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 833 CAST_MAPPING = { 834 **CHAR_CAST_MAPPING, 835 **SIGNED_CAST_MAPPING, 836 exp.DataType.Type.UBIGINT: "UNSIGNED", 837 } 838 839 TIMESTAMP_FUNC_TYPES = { 840 exp.DataType.Type.TIMESTAMPTZ, 841 exp.DataType.Type.TIMESTAMPLTZ, 842 } 843 844 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 845 RESERVED_KEYWORDS = { 846 "accessible", 847 "add", 848 "all", 849 "alter", 850 "analyze", 851 "and", 852 "as", 853 "asc", 854 "asensitive", 855 "before", 856 "between", 857 "bigint", 858 "binary", 859 "blob", 860 "both", 861 "by", 862 "call", 863 "cascade", 864 "case", 865 "change", 866 "char", 867 "character", 868 "check", 869 "collate", 870 "column", 871 "condition", 872 "constraint", 873 "continue", 874 "convert", 875 "create", 876 "cross", 877 "cube", 878 "cume_dist", 879 "current_date", 880 "current_time", 881 "current_timestamp", 882 "current_user", 883 "cursor", 884 "database", 885 "databases", 886 "day_hour", 887 "day_microsecond", 888 "day_minute", 889 "day_second", 890 "dec", 891 "decimal", 892 "declare", 893 "default", 894 "delayed", 895 "delete", 896 "dense_rank", 897 "desc", 898 "describe", 899 "deterministic", 900 "distinct", 901 "distinctrow", 902 "div", 903 "double", 904 "drop", 905 "dual", 906 "each", 907 "else", 908 "elseif", 909 "empty", 910 "enclosed", 911 "escaped", 912 "except", 913 "exists", 914 "exit", 915 "explain", 916 "false", 917 "fetch", 918 "first_value", 919 "float", 920 "float4", 921 "float8", 922 "for", 923 "force", 924 "foreign", 925 "from", 926 "fulltext", 927 "function", 928 "generated", 929 "get", 930 "grant", 931 "group", 932 "grouping", 933 "groups", 934 "having", 935 "high_priority", 936 "hour_microsecond", 937 "hour_minute", 938 "hour_second", 939 "if", 940 "ignore", 941 "in", 942 "index", 943 "infile", 944 "inner", 945 "inout", 946 "insensitive", 947 "insert", 948 "int", 949 "int1", 950 "int2", 951 "int3", 952 "int4", 953 "int8", 954 "integer", 955 "intersect", 956 "interval", 957 "into", 958 "io_after_gtids", 959 "io_before_gtids", 960 "is", 961 "iterate", 962 "join", 963 "json_table", 964 "key", 965 "keys", 966 "kill", 967 "lag", 968 "last_value", 969 "lateral", 970 "lead", 971 "leading", 972 "leave", 973 "left", 974 "like", 975 "limit", 976 "linear", 977 "lines", 978 "load", 979 "localtime", 980 "localtimestamp", 981 "lock", 982 "long", 983 "longblob", 984 "longtext", 985 "loop", 986 "low_priority", 987 "master_bind", 988 "master_ssl_verify_server_cert", 989 "match", 990 "maxvalue", 991 "mediumblob", 992 "mediumint", 993 "mediumtext", 994 "middleint", 995 "minute_microsecond", 996 "minute_second", 997 "mod", 998 "modifies", 999 "natural", 1000 "not", 1001 "no_write_to_binlog", 1002 "nth_value", 1003 "ntile", 1004 "null", 1005 "numeric", 1006 "of", 1007 "on", 1008 "optimize", 1009 "optimizer_costs", 1010 "option", 1011 "optionally", 1012 "or", 1013 "order", 1014 "out", 1015 "outer", 1016 "outfile", 1017 "over", 1018 "partition", 1019 "percent_rank", 1020 "precision", 1021 "primary", 1022 "procedure", 1023 "purge", 1024 "range", 1025 "rank", 1026 "read", 1027 "reads", 1028 "read_write", 1029 "real", 1030 "recursive", 1031 "references", 1032 "regexp", 1033 "release", 1034 "rename", 1035 "repeat", 1036 "replace", 1037 "require", 1038 "resignal", 1039 "restrict", 1040 "return", 1041 "revoke", 1042 "right", 1043 "rlike", 1044 "row", 1045 "rows", 1046 "row_number", 1047 "schema", 1048 "schemas", 1049 "second_microsecond", 1050 "select", 1051 "sensitive", 1052 "separator", 1053 "set", 1054 "show", 1055 "signal", 1056 "smallint", 1057 "spatial", 1058 "specific", 1059 "sql", 1060 "sqlexception", 1061 "sqlstate", 1062 "sqlwarning", 1063 "sql_big_result", 1064 "sql_calc_found_rows", 1065 "sql_small_result", 1066 "ssl", 1067 "starting", 1068 "stored", 1069 "straight_join", 1070 "system", 1071 "table", 1072 "terminated", 1073 "then", 1074 "tinyblob", 1075 "tinyint", 1076 "tinytext", 1077 "to", 1078 "trailing", 1079 "trigger", 1080 "true", 1081 "undo", 1082 "union", 1083 "unique", 1084 "unlock", 1085 "unsigned", 1086 "update", 1087 "usage", 1088 "use", 1089 "using", 1090 "utc_date", 1091 "utc_time", 1092 "utc_timestamp", 1093 "values", 1094 "varbinary", 1095 "varchar", 1096 "varcharacter", 1097 "varying", 1098 "virtual", 1099 "when", 1100 "where", 1101 "while", 1102 "window", 1103 "with", 1104 "write", 1105 "xor", 1106 "year_month", 1107 "zerofill", 1108 } 1109 1110 def array_sql(self, expression: exp.Array) -> str: 1111 self.unsupported("Arrays are not supported by MySQL") 1112 return self.function_fallback_sql(expression) 1113 1114 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1115 self.unsupported("Array operations are not supported by MySQL") 1116 return self.function_fallback_sql(expression) 1117 1118 def dpipe_sql(self, expression: exp.DPipe) -> str: 1119 return self.func("CONCAT", *expression.flatten()) 1120 1121 def extract_sql(self, expression: exp.Extract) -> str: 1122 unit = expression.name 1123 if unit and unit.lower() == "epoch": 1124 return self.func("UNIX_TIMESTAMP", expression.expression) 1125 1126 return super().extract_sql(expression) 1127 1128 def datatype_sql(self, expression: exp.DataType) -> str: 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 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)
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'>, 'ALL': <TokenType.ALL: 'ALL'>, 'ALWAYS': <TokenType.ALWAYS: 'ALWAYS'>, 'AND': <TokenType.AND: 'AND'>, 'ANTI': <TokenType.ANTI: 'ANTI'>, 'ANY': <TokenType.ANY: 'ANY'>, 'ASC': <TokenType.ASC: 'ASC'>, 'AS': <TokenType.ALIAS: 'ALIAS'>, 'ASOF': <TokenType.ASOF: 'ASOF'>, 'AUTOINCREMENT': <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, 'AUTO_INCREMENT': <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, 'BEGIN': <TokenType.BEGIN: 'BEGIN'>, 'BETWEEN': <TokenType.BETWEEN: 'BETWEEN'>, 'CACHE': <TokenType.CACHE: 'CACHE'>, 'UNCACHE': <TokenType.UNCACHE: 'UNCACHE'>, 'CASE': <TokenType.CASE: 'CASE'>, 'CHARACTER SET': <TokenType.CHARACTER_SET: 'CHARACTER_SET'>, 'CLUSTER BY': <TokenType.CLUSTER_BY: 'CLUSTER_BY'>, 'COLLATE': <TokenType.COLLATE: 'COLLATE'>, 'COLUMN': <TokenType.COLUMN: 'COLUMN'>, 'COMMIT': <TokenType.COMMIT: 'COMMIT'>, 'CONNECT BY': <TokenType.CONNECT_BY: 'CONNECT_BY'>, 'CONSTRAINT': <TokenType.CONSTRAINT: 'CONSTRAINT'>, 'COPY': <TokenType.COPY: 'COPY'>, 'CREATE': <TokenType.CREATE: 'CREATE'>, 'CROSS': <TokenType.CROSS: 'CROSS'>, 'CUBE': <TokenType.CUBE: 'CUBE'>, 'CURRENT_DATE': <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, 'CURRENT_TIME': <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, 'CURRENT_TIMESTAMP': <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, 'CURRENT_USER': <TokenType.CURRENT_USER: 'CURRENT_USER'>, 'DATABASE': <TokenType.DATABASE: 'DATABASE'>, 'DEFAULT': <TokenType.DEFAULT: 'DEFAULT'>, 'DELETE': <TokenType.DELETE: 'DELETE'>, 'DESC': <TokenType.DESC: 'DESC'>, 'DESCRIBE': <TokenType.DESCRIBE: 'DESCRIBE'>, 'DISTINCT': <TokenType.DISTINCT: 'DISTINCT'>, 'DISTRIBUTE BY': <TokenType.DISTRIBUTE_BY: 'DISTRIBUTE_BY'>, 'DIV': <TokenType.DIV: 'DIV'>, 'DROP': <TokenType.DROP: 'DROP'>, 'ELSE': <TokenType.ELSE: 'ELSE'>, 'END': <TokenType.END: 'END'>, 'ENUM': <TokenType.ENUM: 'ENUM'>, 'ESCAPE': <TokenType.ESCAPE: 'ESCAPE'>, 'EXCEPT': <TokenType.EXCEPT: 'EXCEPT'>, 'EXECUTE': <TokenType.EXECUTE: 'EXECUTE'>, 'EXISTS': <TokenType.EXISTS: 'EXISTS'>, 'FALSE': <TokenType.FALSE: 'FALSE'>, 'FETCH': <TokenType.FETCH: 'FETCH'>, 'FILTER': <TokenType.FILTER: 'FILTER'>, 'FIRST': <TokenType.FIRST: 'FIRST'>, 'FULL': <TokenType.FULL: 'FULL'>, 'FUNCTION': <TokenType.FUNCTION: 'FUNCTION'>, 'FOR': <TokenType.FOR: 'FOR'>, 'FOREIGN KEY': <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, 'FORMAT': <TokenType.FORMAT: 'FORMAT'>, 'FROM': <TokenType.FROM: 'FROM'>, 'GEOGRAPHY': <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, 'GEOMETRY': <TokenType.GEOMETRY: 'GEOMETRY'>, 'GLOB': <TokenType.GLOB: 'GLOB'>, 'GROUP BY': <TokenType.GROUP_BY: 'GROUP_BY'>, 'GROUPING SETS': <TokenType.GROUPING_SETS: 'GROUPING_SETS'>, 'HAVING': <TokenType.HAVING: 'HAVING'>, 'ILIKE': <TokenType.ILIKE: 'ILIKE'>, 'IN': <TokenType.IN: 'IN'>, 'INDEX': <TokenType.INDEX: 'INDEX'>, 'INET': <TokenType.INET: 'INET'>, 'INNER': <TokenType.INNER: 'INNER'>, 'INSERT': <TokenType.INSERT: 'INSERT'>, 'INTERVAL': <TokenType.INTERVAL: 'INTERVAL'>, 'INTERSECT': <TokenType.INTERSECT: 'INTERSECT'>, 'INTO': <TokenType.INTO: 'INTO'>, 'IS': <TokenType.IS: 'IS'>, 'ISNULL': <TokenType.ISNULL: 'ISNULL'>, 'JOIN': <TokenType.JOIN: 'JOIN'>, 'KEEP': <TokenType.KEEP: 'KEEP'>, 'KILL': <TokenType.KILL: 'KILL'>, 'LATERAL': <TokenType.LATERAL: 'LATERAL'>, 'LEFT': <TokenType.LEFT: 'LEFT'>, 'LIKE': <TokenType.LIKE: 'LIKE'>, 'LIMIT': <TokenType.LIMIT: 'LIMIT'>, 'LOAD': <TokenType.LOAD: 'LOAD'>, 'LOCK': <TokenType.LOCK: 'LOCK'>, 'MERGE': <TokenType.MERGE: 'MERGE'>, 'NATURAL': <TokenType.NATURAL: 'NATURAL'>, 'NEXT': <TokenType.NEXT: 'NEXT'>, 'NOT': <TokenType.NOT: 'NOT'>, 'NOTNULL': <TokenType.NOTNULL: 'NOTNULL'>, 'NULL': <TokenType.NULL: 'NULL'>, 'OBJECT': <TokenType.OBJECT: 'OBJECT'>, 'OFFSET': <TokenType.OFFSET: 'OFFSET'>, 'ON': <TokenType.ON: 'ON'>, 'OR': <TokenType.OR: 'OR'>, 'XOR': <TokenType.XOR: 'XOR'>, 'ORDER BY': <TokenType.ORDER_BY: 'ORDER_BY'>, 'ORDINALITY': <TokenType.ORDINALITY: 'ORDINALITY'>, 'OUTER': <TokenType.OUTER: 'OUTER'>, 'OVER': <TokenType.OVER: 'OVER'>, 'OVERLAPS': <TokenType.OVERLAPS: 'OVERLAPS'>, 'OVERWRITE': <TokenType.OVERWRITE: 'OVERWRITE'>, 'PARTITION': <TokenType.PARTITION: 'PARTITION'>, 'PARTITION BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PARTITIONED BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PARTITIONED_BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PERCENT': <TokenType.PERCENT: 'PERCENT'>, 'PIVOT': <TokenType.PIVOT: 'PIVOT'>, 'PRAGMA': <TokenType.PRAGMA: 'PRAGMA'>, 'PRIMARY KEY': <TokenType.PRIMARY_KEY: 'PRIMARY_KEY'>, 'PROCEDURE': <TokenType.PROCEDURE: 'PROCEDURE'>, 'QUALIFY': <TokenType.QUALIFY: 'QUALIFY'>, 'RANGE': <TokenType.RANGE: 'RANGE'>, 'RECURSIVE': <TokenType.RECURSIVE: 'RECURSIVE'>, 'REGEXP': <TokenType.RLIKE: 'RLIKE'>, 'RENAME': <TokenType.RENAME: 'RENAME'>, 'REPLACE': <TokenType.REPLACE: 'REPLACE'>, 'RETURNING': <TokenType.RETURNING: 'RETURNING'>, 'REFERENCES': <TokenType.REFERENCES: 'REFERENCES'>, 'RIGHT': <TokenType.RIGHT: 'RIGHT'>, 'RLIKE': <TokenType.RLIKE: 'RLIKE'>, 'ROLLBACK': <TokenType.ROLLBACK: 'ROLLBACK'>, 'ROLLUP': <TokenType.ROLLUP: 'ROLLUP'>, 'ROW': <TokenType.ROW: 'ROW'>, 'ROWS': <TokenType.ROWS: 'ROWS'>, 'SCHEMA': <TokenType.SCHEMA: 'SCHEMA'>, 'SELECT': <TokenType.SELECT: 'SELECT'>, 'SEMI': <TokenType.SEMI: 'SEMI'>, 'SET': <TokenType.SET: 'SET'>, 'SETTINGS': <TokenType.SETTINGS: 'SETTINGS'>, 'SHOW': <TokenType.SHOW: 'SHOW'>, 'SIMILAR TO': <TokenType.SIMILAR_TO: 'SIMILAR_TO'>, 'SOME': <TokenType.SOME: 'SOME'>, 'SORT BY': <TokenType.SORT_BY: 'SORT_BY'>, 'START WITH': <TokenType.START_WITH: 'START_WITH'>, 'STRAIGHT_JOIN': <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, 'TABLE': <TokenType.TABLE: 'TABLE'>, 'TABLESAMPLE': <TokenType.TABLE_SAMPLE: 'TABLE_SAMPLE'>, 'TEMP': <TokenType.TEMPORARY: 'TEMPORARY'>, 'TEMPORARY': <TokenType.TEMPORARY: 'TEMPORARY'>, 'THEN': <TokenType.THEN: 'THEN'>, 'TRUE': <TokenType.TRUE: 'TRUE'>, 'TRUNCATE': <TokenType.TRUNCATE: 'TRUNCATE'>, 'UNION': <TokenType.UNION: 'UNION'>, 'UNKNOWN': <TokenType.UNKNOWN: 'UNKNOWN'>, 'UNNEST': <TokenType.UNNEST: 'UNNEST'>, 'UNPIVOT': <TokenType.UNPIVOT: 'UNPIVOT'>, 'UPDATE': <TokenType.UPDATE: 'UPDATE'>, 'USE': <TokenType.USE: 'USE'>, 'USING': <TokenType.USING: 'USING'>, 'UUID': <TokenType.UUID: 'UUID'>, 'VALUES': <TokenType.VALUES: 'VALUES'>, 'VIEW': <TokenType.VIEW: 'VIEW'>, 'VOLATILE': <TokenType.VOLATILE: 'VOLATILE'>, 'WHEN': <TokenType.WHEN: 'WHEN'>, 'WHERE': <TokenType.WHERE: 'WHERE'>, 'WINDOW': <TokenType.WINDOW: 'WINDOW'>, 'WITH': <TokenType.WITH: 'WITH'>, 'APPLY': <TokenType.APPLY: 'APPLY'>, 'ARRAY': <TokenType.ARRAY: 'ARRAY'>, 'BIT': <TokenType.BIT: 'BIT'>, 'BOOL': <TokenType.BOOLEAN: 'BOOLEAN'>, 'BOOLEAN': <TokenType.BOOLEAN: 'BOOLEAN'>, 'BYTE': <TokenType.TINYINT: 'TINYINT'>, 'MEDIUMINT': <TokenType.MEDIUMINT: 'MEDIUMINT'>, 'INT1': <TokenType.TINYINT: 'TINYINT'>, 'TINYINT': <TokenType.TINYINT: 'TINYINT'>, 'INT16': <TokenType.SMALLINT: 'SMALLINT'>, 'SHORT': <TokenType.SMALLINT: 'SMALLINT'>, 'SMALLINT': <TokenType.SMALLINT: 'SMALLINT'>, 'INT128': <TokenType.INT128: 'INT128'>, 'HUGEINT': <TokenType.INT128: 'INT128'>, 'INT2': <TokenType.SMALLINT: 'SMALLINT'>, 'INTEGER': <TokenType.INT: 'INT'>, 'INT': <TokenType.INT: 'INT'>, 'INT4': <TokenType.INT: 'INT'>, 'INT32': <TokenType.INT: 'INT'>, 'INT64': <TokenType.BIGINT: 'BIGINT'>, 'LONG': <TokenType.BIGINT: 'BIGINT'>, 'BIGINT': <TokenType.BIGINT: 'BIGINT'>, 'INT8': <TokenType.TINYINT: 'TINYINT'>, 'UINT': <TokenType.UINT: 'UINT'>, 'DEC': <TokenType.DECIMAL: 'DECIMAL'>, 'DECIMAL': <TokenType.DECIMAL: 'DECIMAL'>, '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.COMMAND: 'COMMAND'>, 'OPTIMIZE': <TokenType.COMMAND: 'COMMAND'>, 'PREPARE': <TokenType.COMMAND: 'COMMAND'>, 'VACUUM': <TokenType.COMMAND: 'COMMAND'>, 'USER-DEFINED': <TokenType.USERDEFINED: 'USERDEFINED'>, 'FOR VERSION': <TokenType.VERSION_SNAPSHOT: 'VERSION_SNAPSHOT'>, 'FOR TIMESTAMP': <TokenType.TIMESTAMP_SNAPSHOT: 'TIMESTAMP_SNAPSHOT'>, 'CHARSET': <TokenType.CHARACTER_SET: 'CHARACTER_SET'>, 'FORCE': <TokenType.FORCE: 'FORCE'>, 'IGNORE': <TokenType.IGNORE: 'IGNORE'>, 'KEY': <TokenType.KEY: 'KEY'>, 'LOCK TABLES': <TokenType.COMMAND: 'COMMAND'>, 'MEMBER OF': <TokenType.MEMBER_OF: 'MEMBER_OF'>, 'SEPARATOR': <TokenType.SEPARATOR: 'SEPARATOR'>, 'START': <TokenType.BEGIN: 'BEGIN'>, 'SIGNED': <TokenType.BIGINT: 'BIGINT'>, 'SIGNED INTEGER': <TokenType.BIGINT: 'BIGINT'>, 'UNLOCK TABLES': <TokenType.COMMAND: 'COMMAND'>, 'UNSIGNED': <TokenType.UBIGINT: 'UBIGINT'>, 'UNSIGNED INTEGER': <TokenType.UBIGINT: 'UBIGINT'>, 'YEAR': <TokenType.YEAR: 'YEAR'>, '_ARMSCII8': <TokenType.INTRODUCER: 'INTRODUCER'>, '_ASCII': <TokenType.INTRODUCER: 'INTRODUCER'>, '_BIG5': <TokenType.INTRODUCER: 'INTRODUCER'>, '_BINARY': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP1250': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP1251': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP1256': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP1257': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP850': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP852': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP866': <TokenType.INTRODUCER: 'INTRODUCER'>, '_CP932': <TokenType.INTRODUCER: 'INTRODUCER'>, '_DEC8': <TokenType.INTRODUCER: 'INTRODUCER'>, '_EUCJPMS': <TokenType.INTRODUCER: 'INTRODUCER'>, '_EUCKR': <TokenType.INTRODUCER: 'INTRODUCER'>, '_GB18030': <TokenType.INTRODUCER: 'INTRODUCER'>, '_GB2312': <TokenType.INTRODUCER: 'INTRODUCER'>, '_GBK': <TokenType.INTRODUCER: 'INTRODUCER'>, '_GEOSTD8': <TokenType.INTRODUCER: 'INTRODUCER'>, '_GREEK': <TokenType.INTRODUCER: 'INTRODUCER'>, '_HEBREW': <TokenType.INTRODUCER: 'INTRODUCER'>, '_HP8': <TokenType.INTRODUCER: 'INTRODUCER'>, '_KEYBCS2': <TokenType.INTRODUCER: 'INTRODUCER'>, '_KOI8R': <TokenType.INTRODUCER: 'INTRODUCER'>, '_KOI8U': <TokenType.INTRODUCER: 'INTRODUCER'>, '_LATIN1': <TokenType.INTRODUCER: 'INTRODUCER'>, '_LATIN2': <TokenType.INTRODUCER: 'INTRODUCER'>, '_LATIN5': <TokenType.INTRODUCER: 'INTRODUCER'>, '_LATIN7': <TokenType.INTRODUCER: 'INTRODUCER'>, '_MACCE': <TokenType.INTRODUCER: 'INTRODUCER'>, '_MACROMAN': <TokenType.INTRODUCER: 'INTRODUCER'>, '_SJIS': <TokenType.INTRODUCER: 'INTRODUCER'>, '_SWE7': <TokenType.INTRODUCER: 'INTRODUCER'>, '_TIS620': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UCS2': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UJIS': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UTF8': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UTF16': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UTF16LE': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UTF32': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UTF8MB3': <TokenType.INTRODUCER: 'INTRODUCER'>, '_UTF8MB4': <TokenType.INTRODUCER: 'INTRODUCER'>, '@@': <TokenType.SESSION_PARAMETER: 'SESSION_PARAMETER'>}
COMMANDS =
{<TokenType.FETCH: 'FETCH'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.COMMAND: 'COMMAND'>, <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 "INSTR": lambda args: exp.StrPosition(substr=seq_get(args, 1), this=seq_get(args, 0)), 305 "FROM_UNIXTIME": build_formatted_time(exp.UnixToTime, "mysql"), 306 "ISNULL": isnull_to_is_null, 307 "LOCATE": locate_to_strposition, 308 "MAKETIME": exp.TimeFromParts.from_arg_list, 309 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 310 "MONTHNAME": lambda args: exp.TimeToStr( 311 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 312 format=exp.Literal.string("%B"), 313 ), 314 "STR_TO_DATE": _str_to_date, 315 "TIMESTAMPDIFF": build_date_delta(exp.TimestampDiff), 316 "TO_DAYS": lambda args: exp.paren( 317 exp.DateDiff( 318 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 319 expression=exp.TsOrDsToDate(this=exp.Literal.string("0000-01-01")), 320 unit=exp.var("DAY"), 321 ) 322 + 1 323 ), 324 "WEEK": lambda args: exp.Week( 325 this=exp.TsOrDsToDate(this=seq_get(args, 0)), mode=seq_get(args, 1) 326 ), 327 "WEEKOFYEAR": lambda args: exp.WeekOfYear(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 328 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 329 } 330 331 FUNCTION_PARSERS = { 332 **parser.Parser.FUNCTION_PARSERS, 333 "CHAR": lambda self: self._parse_chr(), 334 "GROUP_CONCAT": lambda self: self._parse_group_concat(), 335 # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values 336 "VALUES": lambda self: self.expression( 337 exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] 338 ), 339 "JSON_VALUE": lambda self: self._parse_json_value(), 340 } 341 342 STATEMENT_PARSERS = { 343 **parser.Parser.STATEMENT_PARSERS, 344 TokenType.SHOW: lambda self: self._parse_show(), 345 } 346 347 SHOW_PARSERS = { 348 "BINARY LOGS": _show_parser("BINARY LOGS"), 349 "MASTER LOGS": _show_parser("BINARY LOGS"), 350 "BINLOG EVENTS": _show_parser("BINLOG EVENTS"), 351 "CHARACTER SET": _show_parser("CHARACTER SET"), 352 "CHARSET": _show_parser("CHARACTER SET"), 353 "COLLATION": _show_parser("COLLATION"), 354 "FULL COLUMNS": _show_parser("COLUMNS", target="FROM", full=True), 355 "COLUMNS": _show_parser("COLUMNS", target="FROM"), 356 "CREATE DATABASE": _show_parser("CREATE DATABASE", target=True), 357 "CREATE EVENT": _show_parser("CREATE EVENT", target=True), 358 "CREATE FUNCTION": _show_parser("CREATE FUNCTION", target=True), 359 "CREATE PROCEDURE": _show_parser("CREATE PROCEDURE", target=True), 360 "CREATE TABLE": _show_parser("CREATE TABLE", target=True), 361 "CREATE TRIGGER": _show_parser("CREATE TRIGGER", target=True), 362 "CREATE VIEW": _show_parser("CREATE VIEW", target=True), 363 "DATABASES": _show_parser("DATABASES"), 364 "SCHEMAS": _show_parser("DATABASES"), 365 "ENGINE": _show_parser("ENGINE", target=True), 366 "STORAGE ENGINES": _show_parser("ENGINES"), 367 "ENGINES": _show_parser("ENGINES"), 368 "ERRORS": _show_parser("ERRORS"), 369 "EVENTS": _show_parser("EVENTS"), 370 "FUNCTION CODE": _show_parser("FUNCTION CODE", target=True), 371 "FUNCTION STATUS": _show_parser("FUNCTION STATUS"), 372 "GRANTS": _show_parser("GRANTS", target="FOR"), 373 "INDEX": _show_parser("INDEX", target="FROM"), 374 "MASTER STATUS": _show_parser("MASTER STATUS"), 375 "OPEN TABLES": _show_parser("OPEN TABLES"), 376 "PLUGINS": _show_parser("PLUGINS"), 377 "PROCEDURE CODE": _show_parser("PROCEDURE CODE", target=True), 378 "PROCEDURE STATUS": _show_parser("PROCEDURE STATUS"), 379 "PRIVILEGES": _show_parser("PRIVILEGES"), 380 "FULL PROCESSLIST": _show_parser("PROCESSLIST", full=True), 381 "PROCESSLIST": _show_parser("PROCESSLIST"), 382 "PROFILE": _show_parser("PROFILE"), 383 "PROFILES": _show_parser("PROFILES"), 384 "RELAYLOG EVENTS": _show_parser("RELAYLOG EVENTS"), 385 "REPLICAS": _show_parser("REPLICAS"), 386 "SLAVE HOSTS": _show_parser("REPLICAS"), 387 "REPLICA STATUS": _show_parser("REPLICA STATUS"), 388 "SLAVE STATUS": _show_parser("REPLICA STATUS"), 389 "GLOBAL STATUS": _show_parser("STATUS", global_=True), 390 "SESSION STATUS": _show_parser("STATUS"), 391 "STATUS": _show_parser("STATUS"), 392 "TABLE STATUS": _show_parser("TABLE STATUS"), 393 "FULL TABLES": _show_parser("TABLES", full=True), 394 "TABLES": _show_parser("TABLES"), 395 "TRIGGERS": _show_parser("TRIGGERS"), 396 "GLOBAL VARIABLES": _show_parser("VARIABLES", global_=True), 397 "SESSION VARIABLES": _show_parser("VARIABLES"), 398 "VARIABLES": _show_parser("VARIABLES"), 399 "WARNINGS": _show_parser("WARNINGS"), 400 } 401 402 PROPERTY_PARSERS = { 403 **parser.Parser.PROPERTY_PARSERS, 404 "LOCK": lambda self: self._parse_property_assignment(exp.LockProperty), 405 } 406 407 SET_PARSERS = { 408 **parser.Parser.SET_PARSERS, 409 "PERSIST": lambda self: self._parse_set_item_assignment("PERSIST"), 410 "PERSIST_ONLY": lambda self: self._parse_set_item_assignment("PERSIST_ONLY"), 411 "CHARACTER SET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 412 "CHARSET": lambda self: self._parse_set_item_charset("CHARACTER SET"), 413 "NAMES": lambda self: self._parse_set_item_names(), 414 } 415 416 CONSTRAINT_PARSERS = { 417 **parser.Parser.CONSTRAINT_PARSERS, 418 "FULLTEXT": lambda self: self._parse_index_constraint(kind="FULLTEXT"), 419 "INDEX": lambda self: self._parse_index_constraint(), 420 "KEY": lambda self: self._parse_index_constraint(), 421 "SPATIAL": lambda self: self._parse_index_constraint(kind="SPATIAL"), 422 } 423 424 ALTER_PARSERS = { 425 **parser.Parser.ALTER_PARSERS, 426 "MODIFY": lambda self: self._parse_alter_table_alter(), 427 } 428 429 SCHEMA_UNNAMED_CONSTRAINTS = { 430 *parser.Parser.SCHEMA_UNNAMED_CONSTRAINTS, 431 "FULLTEXT", 432 "INDEX", 433 "KEY", 434 "SPATIAL", 435 } 436 437 PROFILE_TYPES: parser.OPTIONS_TYPE = { 438 **dict.fromkeys(("ALL", "CPU", "IPC", "MEMORY", "SOURCE", "SWAPS"), tuple()), 439 "BLOCK": ("IO",), 440 "CONTEXT": ("SWITCHES",), 441 "PAGE": ("FAULTS",), 442 } 443 444 TYPE_TOKENS = { 445 *parser.Parser.TYPE_TOKENS, 446 TokenType.SET, 447 } 448 449 ENUM_TYPE_TOKENS = { 450 *parser.Parser.ENUM_TYPE_TOKENS, 451 TokenType.SET, 452 } 453 454 LOG_DEFAULTS_TO_LN = True 455 STRING_ALIASES = True 456 VALUES_FOLLOWED_BY_PAREN = False 457 SUPPORTS_PARTITION_SELECTION = True 458 459 def _parse_primary_key_part(self) -> t.Optional[exp.Expression]: 460 this = self._parse_id_var() 461 if not self._match(TokenType.L_PAREN): 462 return this 463 464 expression = self._parse_number() 465 self._match_r_paren() 466 return self.expression(exp.ColumnPrefix, this=this, expression=expression) 467 468 def _parse_index_constraint( 469 self, kind: t.Optional[str] = None 470 ) -> exp.IndexColumnConstraint: 471 if kind: 472 self._match_texts(("INDEX", "KEY")) 473 474 this = self._parse_id_var(any_token=False) 475 index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text 476 expressions = self._parse_wrapped_csv(self._parse_ordered) 477 478 options = [] 479 while True: 480 if self._match_text_seq("KEY_BLOCK_SIZE"): 481 self._match(TokenType.EQ) 482 opt = exp.IndexConstraintOption(key_block_size=self._parse_number()) 483 elif self._match(TokenType.USING): 484 opt = exp.IndexConstraintOption(using=self._advance_any() and self._prev.text) 485 elif self._match_text_seq("WITH", "PARSER"): 486 opt = exp.IndexConstraintOption(parser=self._parse_var(any_token=True)) 487 elif self._match(TokenType.COMMENT): 488 opt = exp.IndexConstraintOption(comment=self._parse_string()) 489 elif self._match_text_seq("VISIBLE"): 490 opt = exp.IndexConstraintOption(visible=True) 491 elif self._match_text_seq("INVISIBLE"): 492 opt = exp.IndexConstraintOption(visible=False) 493 elif self._match_text_seq("ENGINE_ATTRIBUTE"): 494 self._match(TokenType.EQ) 495 opt = exp.IndexConstraintOption(engine_attr=self._parse_string()) 496 elif self._match_text_seq("SECONDARY_ENGINE_ATTRIBUTE"): 497 self._match(TokenType.EQ) 498 opt = exp.IndexConstraintOption(secondary_engine_attr=self._parse_string()) 499 else: 500 opt = None 501 502 if not opt: 503 break 504 505 options.append(opt) 506 507 return self.expression( 508 exp.IndexColumnConstraint, 509 this=this, 510 expressions=expressions, 511 kind=kind, 512 index_type=index_type, 513 options=options, 514 ) 515 516 def _parse_show_mysql( 517 self, 518 this: str, 519 target: bool | str = False, 520 full: t.Optional[bool] = None, 521 global_: t.Optional[bool] = None, 522 ) -> exp.Show: 523 if target: 524 if isinstance(target, str): 525 self._match_text_seq(target) 526 target_id = self._parse_id_var() 527 else: 528 target_id = None 529 530 log = self._parse_string() if self._match_text_seq("IN") else None 531 532 if this in ("BINLOG EVENTS", "RELAYLOG EVENTS"): 533 position = self._parse_number() if self._match_text_seq("FROM") else None 534 db = None 535 else: 536 position = None 537 db = None 538 539 if self._match(TokenType.FROM): 540 db = self._parse_id_var() 541 elif self._match(TokenType.DOT): 542 db = target_id 543 target_id = self._parse_id_var() 544 545 channel = self._parse_id_var() if self._match_text_seq("FOR", "CHANNEL") else None 546 547 like = self._parse_string() if self._match_text_seq("LIKE") else None 548 where = self._parse_where() 549 550 if this == "PROFILE": 551 types = self._parse_csv(lambda: self._parse_var_from_options(self.PROFILE_TYPES)) 552 query = self._parse_number() if self._match_text_seq("FOR", "QUERY") else None 553 offset = self._parse_number() if self._match_text_seq("OFFSET") else None 554 limit = self._parse_number() if self._match_text_seq("LIMIT") else None 555 else: 556 types, query = None, None 557 offset, limit = self._parse_oldstyle_limit() 558 559 mutex = True if self._match_text_seq("MUTEX") else None 560 mutex = False if self._match_text_seq("STATUS") else mutex 561 562 return self.expression( 563 exp.Show, 564 this=this, 565 target=target_id, 566 full=full, 567 log=log, 568 position=position, 569 db=db, 570 channel=channel, 571 like=like, 572 where=where, 573 types=types, 574 query=query, 575 offset=offset, 576 limit=limit, 577 mutex=mutex, 578 **{"global": global_}, # type: ignore 579 ) 580 581 def _parse_oldstyle_limit( 582 self, 583 ) -> t.Tuple[t.Optional[exp.Expression], t.Optional[exp.Expression]]: 584 limit = None 585 offset = None 586 if self._match_text_seq("LIMIT"): 587 parts = self._parse_csv(self._parse_number) 588 if len(parts) == 1: 589 limit = parts[0] 590 elif len(parts) == 2: 591 limit = parts[1] 592 offset = parts[0] 593 594 return offset, limit 595 596 def _parse_set_item_charset(self, kind: str) -> exp.Expression: 597 this = self._parse_string() or self._parse_unquoted_field() 598 return self.expression(exp.SetItem, this=this, kind=kind) 599 600 def _parse_set_item_names(self) -> exp.Expression: 601 charset = self._parse_string() or self._parse_unquoted_field() 602 if self._match_text_seq("COLLATE"): 603 collate = self._parse_string() or self._parse_unquoted_field() 604 else: 605 collate = None 606 607 return self.expression(exp.SetItem, this=charset, collate=collate, kind="NAMES") 608 609 def _parse_type( 610 self, parse_interval: bool = True, fallback_to_identifier: bool = False 611 ) -> t.Optional[exp.Expression]: 612 # mysql binary is special and can work anywhere, even in order by operations 613 # it operates like a no paren func 614 if self._match(TokenType.BINARY, advance=False): 615 data_type = self._parse_types(check_func=True, allow_identifiers=False) 616 617 if isinstance(data_type, exp.DataType): 618 return self.expression(exp.Cast, this=self._parse_column(), to=data_type) 619 620 return super()._parse_type( 621 parse_interval=parse_interval, fallback_to_identifier=fallback_to_identifier 622 ) 623 624 def _parse_chr(self) -> t.Optional[exp.Expression]: 625 expressions = self._parse_csv(self._parse_assignment) 626 kwargs: t.Dict[str, t.Any] = {"this": seq_get(expressions, 0)} 627 628 if len(expressions) > 1: 629 kwargs["expressions"] = expressions[1:] 630 631 if self._match(TokenType.USING): 632 kwargs["charset"] = self._parse_var() 633 634 return self.expression(exp.Chr, **kwargs) 635 636 def _parse_group_concat(self) -> t.Optional[exp.Expression]: 637 def concat_exprs( 638 node: t.Optional[exp.Expression], exprs: t.List[exp.Expression] 639 ) -> exp.Expression: 640 if isinstance(node, exp.Distinct) and len(node.expressions) > 1: 641 concat_exprs = [ 642 self.expression(exp.Concat, expressions=node.expressions, safe=True) 643 ] 644 node.set("expressions", concat_exprs) 645 return node 646 if len(exprs) == 1: 647 return exprs[0] 648 return self.expression(exp.Concat, expressions=args, safe=True) 649 650 args = self._parse_csv(self._parse_lambda) 651 652 if args: 653 order = args[-1] if isinstance(args[-1], exp.Order) else None 654 655 if order: 656 # Order By is the last (or only) expression in the list and has consumed the 'expr' before it, 657 # remove 'expr' from exp.Order and add it back to args 658 args[-1] = order.this 659 order.set("this", concat_exprs(order.this, args)) 660 661 this = order or concat_exprs(args[0], args) 662 else: 663 this = None 664 665 separator = self._parse_field() if self._match(TokenType.SEPARATOR) else None 666 667 return self.expression(exp.GroupConcat, this=this, separator=separator) 668 669 def _parse_json_value(self) -> exp.JSONValue: 670 this = self._parse_bitwise() 671 self._match(TokenType.COMMA) 672 path = self._parse_bitwise() 673 674 returning = self._match(TokenType.RETURNING) and self._parse_type() 675 676 return self.expression( 677 exp.JSONValue, 678 this=this, 679 path=self.dialect.to_json_path(path), 680 returning=returning, 681 on_condition=self._parse_on_condition(), 682 )
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.NULLABLE: 'NULLABLE'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.INT256: 'INT256'>, <TokenType.RANGE: 'RANGE'>, <TokenType.BINARY: 'BINARY'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.DATE: 'DATE'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.INT: 'INT'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.MAP: 'MAP'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.UUID: 'UUID'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.ILIKE: 'ILIKE'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.LEFT: 'LEFT'>, <TokenType.INDEX: 'INDEX'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.INET: 'INET'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.UINT: 'UINT'>, <TokenType.JSON: 'JSON'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.NAME: 'NAME'>, <TokenType.BIT: 'BIT'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.LIST: 'LIST'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.XOR: 'XOR'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.UINT128: 'UINT128'>, <TokenType.TABLE: 'TABLE'>, <TokenType.ANY: 'ANY'>, <TokenType.CHAR: 'CHAR'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.XML: 'XML'>, <TokenType.IPV4: 'IPV4'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.NESTED: 'NESTED'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.ENUM: 'ENUM'>, <TokenType.VALUES: 'VALUES'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.SOME: 'SOME'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.INT128: 'INT128'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.RLIKE: 'RLIKE'>, <TokenType.TIME: 'TIME'>, <TokenType.DATE32: 'DATE32'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.YEAR: 'YEAR'>, <TokenType.PRIMARY_KEY: 'PRIMARY_KEY'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.ALL: 'ALL'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.UINT256: 'UINT256'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.SUPER: 'SUPER'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.FILTER: 'FILTER'>, <TokenType.GLOB: 'GLOB'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.JSONB: 'JSONB'>, <TokenType.ROW: 'ROW'>, <TokenType.NULL: 'NULL'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.LIKE: 'LIKE'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.MERGE: 'MERGE'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.IPV6: 'IPV6'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.VAR: 'VAR'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.INSERT: 'INSERT'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.TEXT: 'TEXT'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.FIRST: 'FIRST'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.MONEY: 'MONEY'>, <TokenType.IMAGE: 'IMAGE'>}
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.NULLABLE: 'NULLABLE'>, <TokenType.DIV: 'DIV'>, <TokenType.INT256: 'INT256'>, <TokenType.BINARY: 'BINARY'>, <TokenType.RANGE: 'RANGE'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.DATE: 'DATE'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.RENAME: 'RENAME'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.INT: 'INT'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.MAP: 'MAP'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.UUID: 'UUID'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.NEXT: 'NEXT'>, <TokenType.INDEX: 'INDEX'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.INET: 'INET'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.DELETE: 'DELETE'>, <TokenType.UINT: 'UINT'>, <TokenType.JSON: 'JSON'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.KILL: 'KILL'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.NAME: 'NAME'>, <TokenType.BIT: 'BIT'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.LIST: 'LIST'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.UINT128: 'UINT128'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.TABLE: 'TABLE'>, <TokenType.SET: 'SET'>, <TokenType.ANY: 'ANY'>, <TokenType.ANTI: 'ANTI'>, <TokenType.ASC: 'ASC'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.CHAR: 'CHAR'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.FINAL: 'FINAL'>, <TokenType.DESC: 'DESC'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.CASE: 'CASE'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.XML: 'XML'>, <TokenType.IPV4: 'IPV4'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.NESTED: 'NESTED'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.ENUM: 'ENUM'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.SOME: 'SOME'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.INT128: 'INT128'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.SHOW: 'SHOW'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.TIME: 'TIME'>, <TokenType.IS: 'IS'>, <TokenType.DATE32: 'DATE32'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.CACHE: 'CACHE'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.YEAR: 'YEAR'>, <TokenType.CUBE: 'CUBE'>, <TokenType.VIEW: 'VIEW'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.ALL: 'ALL'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.UINT256: 'UINT256'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.COPY: 'COPY'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.TAG: 'TAG'>, <TokenType.SEMI: 'SEMI'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.FALSE: 'FALSE'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.KEEP: 'KEEP'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.SUPER: 'SUPER'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.FILTER: 'FILTER'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.JSONB: 'JSONB'>, <TokenType.ROW: 'ROW'>, <TokenType.TOP: 'TOP'>, <TokenType.NULL: 'NULL'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.END: 'END'>, <TokenType.MERGE: 'MERGE'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.IPV6: 'IPV6'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.ROWS: 'ROWS'>, <TokenType.VAR: 'VAR'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.TEXT: 'TEXT'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.MODEL: 'MODEL'>, <TokenType.FIRST: 'FIRST'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.MONEY: 'MONEY'>, <TokenType.LOAD: 'LOAD'>, <TokenType.TRUE: 'TRUE'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.IMAGE: 'IMAGE'>}
RANGE_PARSERS =
{<TokenType.BETWEEN: 'BETWEEN'>: <function Parser.<lambda>>, <TokenType.GLOB: 'GLOB'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ILIKE: 'ILIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IN: 'IN'>: <function Parser.<lambda>>, <TokenType.IRLIKE: 'IRLIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IS: 'IS'>: <function Parser.<lambda>>, <TokenType.LIKE: 'LIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.OVERLAPS: 'OVERLAPS'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.RLIKE: 'RLIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.SIMILAR_TO: 'SIMILAR_TO'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.FOR: 'FOR'>: <function Parser.<lambda>>, <TokenType.MEMBER_OF: 'MEMBER_OF'>: <function MySQL.Parser.<lambda>>}
FUNCTIONS =
{'ABS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Abs'>>, 'ADD_MONTHS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AddMonths'>>, 'ANONYMOUS_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AnonymousAggFunc'>>, 'ANY_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AnyValue'>>, 'APPROX_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxDistinct'>>, 'APPROX_COUNT_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxDistinct'>>, 'APPROX_QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxQuantile'>>, 'APPROX_TOP_K': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxTopK'>>, 'ARG_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'ARGMAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'MAX_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'ARG_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'ARGMIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'MIN_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'ARRAY': <function Parser.<lambda>>, 'ARRAY_AGG': <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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Chr'>>, 'CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Chr'>>, 'COALESCE': <function build_coalesce>, 'IFNULL': <function build_coalesce>, 'NVL': <function build_coalesce>, 'COLLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Collate'>>, 'COMBINED_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CombinedAggFunc'>>, 'COMBINED_PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CombinedParameterizedAgg'>>, 'CONCAT': <function Parser.<lambda>>, 'CONCAT_WS': <function Parser.<lambda>>, 'CONNECT_BY_ROOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ConnectByRoot'>>, 'CONVERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Convert'>>, 'CONVERT_TIMEZONE': <function build_convert_timezone>, 'CORR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Corr'>>, 'COUNT': <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'>>, 'PAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pad'>>, 'PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParameterizedAgg'>>, 'PARSE_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseJSON'>>, 'JSON_PARSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseJSON'>>, 'PERCENTILE_CONT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PercentileCont'>>, 'PERCENTILE_DISC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PercentileDisc'>>, 'POSEXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Posexplode'>>, 'POSEXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PosexplodeOuter'>>, 'POWER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pow'>>, 'POW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pow'>>, 'PREDICT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Predict'>>, 'QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Quantile'>>, 'QUARTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Quarter'>>, 'RAND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rand'>>, 'RANDOM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rand'>>, 'RANDN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Randn'>>, 'RANGE_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RangeN'>>, 'READ_CSV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ReadCSV'>>, 'REDUCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Reduce'>>, 'REGEXP_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpExtract'>>, 'REGEXP_I_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpILike'>>, 'REGEXP_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpLike'>>, 'REGEXP_REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpReplace'>>, 'REGEXP_SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpSplit'>>, 'REPEAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Repeat'>>, 'RIGHT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Right'>>, 'ROUND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Round'>>, 'ROW_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RowNumber'>>, 'SHA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA2'>>, 'SAFE_DIVIDE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeDivide'>>, 'SIGN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SIGNUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SORT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SortArray'>>, 'SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Split'>>, 'SQRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sqrt'>>, 'STANDARD_HASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StandardHash'>>, 'STAR_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StarMap'>>, 'STARTS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STARTSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STDDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDDEV_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevPop'>>, 'STDDEV_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevSamp'>>, 'STR_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrPosition'>>, 'STR_TO_DATE': <function _str_to_date>, 'STR_TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToMap'>>, 'STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToTime'>>, 'STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToUnix'>>, 'STRING_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'SPLIT_BY_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'STRUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Struct'>>, 'STRUCT_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StructExtract'>>, 'STUFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'SUBSTRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Substring'>>, 'SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sum'>>, 'TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Time'>>, 'TIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeAdd'>>, 'TIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeDiff'>>, 'TIME_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'TIMEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'TIME_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToDate'>>, 'TIME_STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToTime'>>, 'TIME_STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToUnix'>>, 'TIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeSub'>>, 'TIME_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeToStr'>>, 'TIME_TO_TIME_STR': <function Parser.<lambda>>, 'TIME_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeToUnix'>>, 'TIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeTrunc'>>, 'TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Timestamp'>>, 'TIMESTAMP_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampAdd'>>, 'TIMESTAMPDIFF': <function build_date_delta.<locals>._builder>, 'TIMESTAMP_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampDiff'>>, 'TIMESTAMP_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampFromParts'>>, 'TIMESTAMPFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampFromParts'>>, 'TIMESTAMP_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampSub'>>, 'TIMESTAMP_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampTrunc'>>, 'TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToArray'>>, 'TO_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToBase64'>>, 'TO_CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToChar'>>, 'TO_DAYS': <function MySQL.Parser.<lambda>>, 'TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToMap'>>, 'TO_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToNumber'>>, 'TRANSFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Transform'>>, 'TRIM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Trim'>>, 'TRY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Try'>>, 'TRY_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryCast'>>, 'TS_OR_DI_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDiToDi'>>, 'TS_OR_DS_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsAdd'>>, 'TS_OR_DS_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsDiff'>>, 'TS_OR_DS_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToDate'>>, 'TS_OR_DS_TO_DATE_STR': <function Parser.<lambda>>, 'TS_OR_DS_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToTime'>>, 'TS_OR_DS_TO_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToTimestamp'>>, 'UNHEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Unhex'>>, 'UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixDate'>>, 'UNIX_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToStr'>>, 'UNIX_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToTime'>>, 'UNIX_TO_TIME_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToTimeStr'>>, 'UNNEST': <function Parser.<lambda>>, 'UPPER': <function build_upper>, 'UCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Upper'>>, 'VAR_MAP': <function build_var_map>, 'VARIANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VARIANCE_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VARIANCE_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VariancePop'>>, 'VAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VariancePop'>>, 'WEEK': <function MySQL.Parser.<lambda>>, 'WEEK_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.WeekOfYear'>>, 'WEEKOFYEAR': <function MySQL.Parser.<lambda>>, 'WHEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.When'>>, 'X_M_L_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.XMLTable'>>, 'XOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Xor'>>, 'YEAR': <function MySQL.Parser.<lambda>>, 'ARRAYAGG': <function Parser.<lambda>>, 'GLOB': <function Parser.<lambda>>, 'JSON_EXTRACT_PATH_TEXT': <function build_extract_json_with_path.<locals>._builder>, 'LIKE': <function build_like>, 'LOG2': <function Parser.<lambda>>, 'LOG10': <function Parser.<lambda>>, 'LPAD': <function Parser.<lambda>>, 'LEFTPAD': <function Parser.<lambda>>, 'LTRIM': <function Parser.<lambda>>, 'MOD': <function build_mod>, 'RIGHTPAD': <function Parser.<lambda>>, 'RPAD': <function Parser.<lambda>>, 'RTRIM': <function Parser.<lambda>>, 'SCOPE_RESOLUTION': <function Parser.<lambda>>, 'TO_HEX': <function build_hex>, 'CONVERT_TZ': <function MySQL.Parser.<lambda>>, 'DATE_FORMAT': <function build_formatted_time.<locals>._builder>, 'INSTR': <function MySQL.Parser.<lambda>>, 'FROM_UNIXTIME': <function build_formatted_time.<locals>._builder>, 'ISNULL': <function isnull_to_is_null>, 'LOCATE': <function locate_to_strposition>, 'MAKETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'MONTHNAME': <function MySQL.Parser.<lambda>>}
FUNCTION_PARSERS =
{'CAST': <function Parser.<lambda>>, 'CONVERT': <function Parser.<lambda>>, 'DECODE': <function Parser.<lambda>>, 'EXTRACT': <function Parser.<lambda>>, 'GAP_FILL': <function Parser.<lambda>>, 'JSON_OBJECT': <function Parser.<lambda>>, 'JSON_OBJECTAGG': <function Parser.<lambda>>, 'JSON_TABLE': <function Parser.<lambda>>, 'MATCH': <function Parser.<lambda>>, 'NORMALIZE': <function Parser.<lambda>>, 'OPENJSON': <function Parser.<lambda>>, 'POSITION': <function Parser.<lambda>>, 'PREDICT': <function Parser.<lambda>>, 'SAFE_CAST': <function Parser.<lambda>>, 'STRING_AGG': <function Parser.<lambda>>, 'SUBSTRING': <function Parser.<lambda>>, 'TRIM': <function Parser.<lambda>>, 'TRY_CAST': <function Parser.<lambda>>, 'TRY_CONVERT': <function Parser.<lambda>>, 'CHAR': <function MySQL.Parser.<lambda>>, 'GROUP_CONCAT': <function MySQL.Parser.<lambda>>, 'VALUES': <function MySQL.Parser.<lambda>>, '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.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', 'CHECK', 'INDEX', 'KEY', 'LIKE', 'PRIMARY KEY', 'FULLTEXT', 'SPATIAL', 'FOREIGN KEY', 'EXCLUDE', 'UNIQUE'}
PROFILE_TYPES: Dict[str, Sequence[Union[Sequence[str], str]]] =
{'ALL': (), 'CPU': (), 'IPC': (), 'MEMORY': (), 'SOURCE': (), 'SWAPS': (), 'BLOCK': ('IO',), 'CONTEXT': ('SWITCHES',), 'PAGE': ('FAULTS',)}
TYPE_TOKENS =
{<TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.INT256: 'INT256'>, <TokenType.BINARY: 'BINARY'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.YEAR: 'YEAR'>, <TokenType.DATE: 'DATE'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.INT: 'INT'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.MAP: 'MAP'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.UUID: 'UUID'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.UINT256: 'UINT256'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.INET: 'INET'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.UINT: 'UINT'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.JSON: 'JSON'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.SUPER: 'SUPER'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.JSONB: 'JSONB'>, <TokenType.NAME: 'NAME'>, <TokenType.BIT: 'BIT'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.NULL: 'NULL'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.LIST: 'LIST'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.UINT128: 'UINT128'>, <TokenType.SET: 'SET'>, <TokenType.IPV6: 'IPV6'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.CHAR: 'CHAR'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.XML: 'XML'>, <TokenType.IPV4: 'IPV4'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.NESTED: 'NESTED'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.TEXT: 'TEXT'>, <TokenType.ENUM: 'ENUM'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.INT128: 'INT128'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.MONEY: 'MONEY'>, <TokenType.TIME: 'TIME'>, <TokenType.DATE32: 'DATE32'>, <TokenType.IMAGE: 'IMAGE'>}
ENUM_TYPE_TOKENS =
{<TokenType.ENUM8: 'ENUM8'>, <TokenType.SET: 'SET'>, <TokenType.ENUM: 'ENUM'>, <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
- 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
684 class Generator(generator.Generator): 685 INTERVAL_ALLOWS_PLURAL_FORM = False 686 LOCKING_READS_SUPPORTED = True 687 NULL_ORDERING_SUPPORTED = None 688 JOIN_HINTS = False 689 TABLE_HINTS = True 690 DUPLICATE_KEY_UPDATE_WITH_SET = False 691 QUERY_HINT_SEP = " " 692 VALUES_AS_TABLE = False 693 NVL2_SUPPORTED = False 694 LAST_DAY_SUPPORTS_DATE_PART = False 695 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 696 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 697 JSON_KEY_VALUE_PAIR_SEP = "," 698 SUPPORTS_TO_NUMBER = False 699 PARSE_JSON_NAME: t.Optional[str] = None 700 PAD_FILL_PATTERN_IS_REQUIRED = True 701 WRAP_DERIVED_VALUES = False 702 703 TRANSFORMS = { 704 **generator.Generator.TRANSFORMS, 705 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 706 exp.CurrentDate: no_paren_current_date_sql, 707 exp.DateDiff: _remove_ts_or_ds_to_date( 708 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 709 ), 710 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 711 exp.DateStrToDate: datestrtodate_sql, 712 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 713 exp.DateTrunc: _date_trunc_sql, 714 exp.Day: _remove_ts_or_ds_to_date(), 715 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 716 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 717 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 718 exp.GroupConcat: lambda self, 719 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 720 exp.ILike: no_ilike_sql, 721 exp.JSONExtractScalar: arrow_json_extract_sql, 722 exp.Max: max_or_greatest, 723 exp.Min: min_or_least, 724 exp.Month: _remove_ts_or_ds_to_date(), 725 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 726 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 727 exp.Pivot: no_pivot_sql, 728 exp.Select: transforms.preprocess( 729 [ 730 transforms.eliminate_distinct_on, 731 transforms.eliminate_semi_and_anti_joins, 732 transforms.eliminate_qualify, 733 transforms.eliminate_full_outer_join, 734 transforms.unnest_generate_date_array_using_recursive_cte, 735 ] 736 ), 737 exp.StrPosition: strposition_to_locate_sql, 738 exp.StrToDate: _str_to_date_sql, 739 exp.StrToTime: _str_to_date_sql, 740 exp.Stuff: rename_func("INSERT"), 741 exp.TableSample: no_tablesample_sql, 742 exp.TimeFromParts: rename_func("MAKETIME"), 743 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 744 exp.TimestampDiff: lambda self, e: self.func( 745 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 746 ), 747 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 748 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 749 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 750 self, 751 e, 752 include_precision=not e.args.get("zone"), 753 ), 754 exp.TimeToStr: _remove_ts_or_ds_to_date( 755 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 756 ), 757 exp.Trim: trim_sql, 758 exp.TryCast: no_trycast_sql, 759 exp.TsOrDsAdd: date_add_sql("ADD"), 760 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 761 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 762 exp.UnixToTime: _unix_to_time_sql, 763 exp.Week: _remove_ts_or_ds_to_date(), 764 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 765 exp.Year: _remove_ts_or_ds_to_date(), 766 } 767 768 UNSIGNED_TYPE_MAPPING = { 769 exp.DataType.Type.UBIGINT: "BIGINT", 770 exp.DataType.Type.UINT: "INT", 771 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 772 exp.DataType.Type.USMALLINT: "SMALLINT", 773 exp.DataType.Type.UTINYINT: "TINYINT", 774 exp.DataType.Type.UDECIMAL: "DECIMAL", 775 } 776 777 TIMESTAMP_TYPE_MAPPING = { 778 exp.DataType.Type.TIMESTAMP: "DATETIME", 779 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 780 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 781 } 782 783 TYPE_MAPPING = { 784 **generator.Generator.TYPE_MAPPING, 785 **UNSIGNED_TYPE_MAPPING, 786 **TIMESTAMP_TYPE_MAPPING, 787 } 788 789 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 790 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 791 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 792 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 793 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 794 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 795 796 PROPERTIES_LOCATION = { 797 **generator.Generator.PROPERTIES_LOCATION, 798 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 799 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 800 } 801 802 LIMIT_FETCH = "LIMIT" 803 804 LIMIT_ONLY_LITERALS = True 805 806 CHAR_CAST_MAPPING = dict.fromkeys( 807 ( 808 exp.DataType.Type.LONGTEXT, 809 exp.DataType.Type.LONGBLOB, 810 exp.DataType.Type.MEDIUMBLOB, 811 exp.DataType.Type.MEDIUMTEXT, 812 exp.DataType.Type.TEXT, 813 exp.DataType.Type.TINYBLOB, 814 exp.DataType.Type.TINYTEXT, 815 exp.DataType.Type.VARCHAR, 816 ), 817 "CHAR", 818 ) 819 SIGNED_CAST_MAPPING = dict.fromkeys( 820 ( 821 exp.DataType.Type.BIGINT, 822 exp.DataType.Type.BOOLEAN, 823 exp.DataType.Type.INT, 824 exp.DataType.Type.SMALLINT, 825 exp.DataType.Type.TINYINT, 826 exp.DataType.Type.MEDIUMINT, 827 ), 828 "SIGNED", 829 ) 830 831 # MySQL doesn't support many datatypes in cast. 832 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 833 CAST_MAPPING = { 834 **CHAR_CAST_MAPPING, 835 **SIGNED_CAST_MAPPING, 836 exp.DataType.Type.UBIGINT: "UNSIGNED", 837 } 838 839 TIMESTAMP_FUNC_TYPES = { 840 exp.DataType.Type.TIMESTAMPTZ, 841 exp.DataType.Type.TIMESTAMPLTZ, 842 } 843 844 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 845 RESERVED_KEYWORDS = { 846 "accessible", 847 "add", 848 "all", 849 "alter", 850 "analyze", 851 "and", 852 "as", 853 "asc", 854 "asensitive", 855 "before", 856 "between", 857 "bigint", 858 "binary", 859 "blob", 860 "both", 861 "by", 862 "call", 863 "cascade", 864 "case", 865 "change", 866 "char", 867 "character", 868 "check", 869 "collate", 870 "column", 871 "condition", 872 "constraint", 873 "continue", 874 "convert", 875 "create", 876 "cross", 877 "cube", 878 "cume_dist", 879 "current_date", 880 "current_time", 881 "current_timestamp", 882 "current_user", 883 "cursor", 884 "database", 885 "databases", 886 "day_hour", 887 "day_microsecond", 888 "day_minute", 889 "day_second", 890 "dec", 891 "decimal", 892 "declare", 893 "default", 894 "delayed", 895 "delete", 896 "dense_rank", 897 "desc", 898 "describe", 899 "deterministic", 900 "distinct", 901 "distinctrow", 902 "div", 903 "double", 904 "drop", 905 "dual", 906 "each", 907 "else", 908 "elseif", 909 "empty", 910 "enclosed", 911 "escaped", 912 "except", 913 "exists", 914 "exit", 915 "explain", 916 "false", 917 "fetch", 918 "first_value", 919 "float", 920 "float4", 921 "float8", 922 "for", 923 "force", 924 "foreign", 925 "from", 926 "fulltext", 927 "function", 928 "generated", 929 "get", 930 "grant", 931 "group", 932 "grouping", 933 "groups", 934 "having", 935 "high_priority", 936 "hour_microsecond", 937 "hour_minute", 938 "hour_second", 939 "if", 940 "ignore", 941 "in", 942 "index", 943 "infile", 944 "inner", 945 "inout", 946 "insensitive", 947 "insert", 948 "int", 949 "int1", 950 "int2", 951 "int3", 952 "int4", 953 "int8", 954 "integer", 955 "intersect", 956 "interval", 957 "into", 958 "io_after_gtids", 959 "io_before_gtids", 960 "is", 961 "iterate", 962 "join", 963 "json_table", 964 "key", 965 "keys", 966 "kill", 967 "lag", 968 "last_value", 969 "lateral", 970 "lead", 971 "leading", 972 "leave", 973 "left", 974 "like", 975 "limit", 976 "linear", 977 "lines", 978 "load", 979 "localtime", 980 "localtimestamp", 981 "lock", 982 "long", 983 "longblob", 984 "longtext", 985 "loop", 986 "low_priority", 987 "master_bind", 988 "master_ssl_verify_server_cert", 989 "match", 990 "maxvalue", 991 "mediumblob", 992 "mediumint", 993 "mediumtext", 994 "middleint", 995 "minute_microsecond", 996 "minute_second", 997 "mod", 998 "modifies", 999 "natural", 1000 "not", 1001 "no_write_to_binlog", 1002 "nth_value", 1003 "ntile", 1004 "null", 1005 "numeric", 1006 "of", 1007 "on", 1008 "optimize", 1009 "optimizer_costs", 1010 "option", 1011 "optionally", 1012 "or", 1013 "order", 1014 "out", 1015 "outer", 1016 "outfile", 1017 "over", 1018 "partition", 1019 "percent_rank", 1020 "precision", 1021 "primary", 1022 "procedure", 1023 "purge", 1024 "range", 1025 "rank", 1026 "read", 1027 "reads", 1028 "read_write", 1029 "real", 1030 "recursive", 1031 "references", 1032 "regexp", 1033 "release", 1034 "rename", 1035 "repeat", 1036 "replace", 1037 "require", 1038 "resignal", 1039 "restrict", 1040 "return", 1041 "revoke", 1042 "right", 1043 "rlike", 1044 "row", 1045 "rows", 1046 "row_number", 1047 "schema", 1048 "schemas", 1049 "second_microsecond", 1050 "select", 1051 "sensitive", 1052 "separator", 1053 "set", 1054 "show", 1055 "signal", 1056 "smallint", 1057 "spatial", 1058 "specific", 1059 "sql", 1060 "sqlexception", 1061 "sqlstate", 1062 "sqlwarning", 1063 "sql_big_result", 1064 "sql_calc_found_rows", 1065 "sql_small_result", 1066 "ssl", 1067 "starting", 1068 "stored", 1069 "straight_join", 1070 "system", 1071 "table", 1072 "terminated", 1073 "then", 1074 "tinyblob", 1075 "tinyint", 1076 "tinytext", 1077 "to", 1078 "trailing", 1079 "trigger", 1080 "true", 1081 "undo", 1082 "union", 1083 "unique", 1084 "unlock", 1085 "unsigned", 1086 "update", 1087 "usage", 1088 "use", 1089 "using", 1090 "utc_date", 1091 "utc_time", 1092 "utc_timestamp", 1093 "values", 1094 "varbinary", 1095 "varchar", 1096 "varcharacter", 1097 "varying", 1098 "virtual", 1099 "when", 1100 "where", 1101 "while", 1102 "window", 1103 "with", 1104 "write", 1105 "xor", 1106 "year_month", 1107 "zerofill", 1108 } 1109 1110 def array_sql(self, expression: exp.Array) -> str: 1111 self.unsupported("Arrays are not supported by MySQL") 1112 return self.function_fallback_sql(expression) 1113 1114 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1115 self.unsupported("Array operations are not supported by MySQL") 1116 return self.function_fallback_sql(expression) 1117 1118 def dpipe_sql(self, expression: exp.DPipe) -> str: 1119 return self.func("CONCAT", *expression.flatten()) 1120 1121 def extract_sql(self, expression: exp.Extract) -> str: 1122 unit = expression.name 1123 if unit and unit.lower() == "epoch": 1124 return self.func("UNIX_TIMESTAMP", expression.expression) 1125 1126 return super().extract_sql(expression) 1127 1128 def datatype_sql(self, expression: exp.DataType) -> str: 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 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)
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.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 =
{'io_after_gtids', 'limit', 'day_minute', 'repeat', 'ntile', 'day_hour', 'set', 'dense_rank', 'asensitive', 'databases', 'hour_minute', 'describe', 'float4', 'while', 'partition', 'unsigned', 'natural', 'trigger', 'purge', 'float8', 'io_before_gtids', 'sensitive', 'hour_microsecond', 'optimizer_costs', 'groups', 'precision', 'asc', 'mod', 'cume_dist', 'unlock', 'get', 'day_second', 'where', 'reads', 'cube', 'ssl', 'double', 'localtimestamp', 'int3', 'current_timestamp', 'distinct', 'interval', 'and', 'enclosed', 'zerofill', 'div', 'left', 'xor', 'cascade', 'return', 'dec', 'sqlexception', 'references', 'generated', 'rename', 'before', 'exit', 'group', 'procedure', 'char', 'int', 'fetch', 'nth_value', 'lag', 'union', 'index', 'accessible', 'ignore', 'alter', 'outfile', 'float', 'low_priority', 'modifies', 'both', 'not', 'varcharacter', 'foreign', 'revoke', 'optionally', 'current_time', 'int1', 'key', 'join', 'numeric', 'when', 'separator', 'desc', 'option', 'replace', 'analyze', 'current_date', 'column', 'by', 'constraint', 'right', 'values', 'cursor', 'explain', 'year_month', 'false', 'range', 'binary', 'signal', 'having', 'sqlwarning', 'for', 'high_priority', 'inner', 'int2', 'blob', 'change', 'elseif', 'real', 'grouping', 'percent_rank', 'utc_time', 'minute_second', 'decimal', 'schema', 'each', 'row', 'leading', 'like', 'utc_date', 'load', 'on', 'master_ssl_verify_server_cert', 'out', 'usage', 'with', 'distinctrow', 'if', 'case', 'resignal', 'sql_big_result', 'long', 'integer', 'restrict', 'null', 'linear', 'insert', 'primary', 'show', 'int4', 'system', 'sql', 'hour_second', 'json_table', 'convert', 'empty', 'varchar', 'rows', 'check', 'require', 'int8', 'straight_join', 'master_bind', 'then', 'sqlstate', 'delayed', 'tinyint', 'over', 'day_microsecond', 'lines', 'deterministic', 'create', 'localtime', 'dual', 'regexp', 'terminated', 'update', 'true', 'as', 'lock', 'leave', 'select', 'collate', 'database', 'tinytext', 'longblob', 'unique', 'no_write_to_binlog', 'maxvalue', 'varying', 'varbinary', 'all', 'use', 'rlike', 'release', 'second_microsecond', 'starting', 'middleint', 'schemas', 'declare', 'order', 'longtext', 'read', 'write', 'window', 'spatial', 'utc_timestamp', 'inout', 'lateral', 'keys', 'mediumtext', 'force', 'virtual', 'loop', 'using', 'fulltext', 'into', 'delete', 'table', 'continue', 'drop', 'tinyblob', 'mediumint', 'insensitive', 'iterate', 'match', 'call', 'current_user', 'minute_microsecond', 'optimize', 'of', 'row_number', 'condition', 'default', 'mediumblob', 'sql_small_result', 'in', 'from', 'cross', 'read_write', 'or', 'first_value', 'to', 'trailing', 'exists', 'function', 'recursive', 'except', 'sql_calc_found_rows', 'stored', 'infile', 'bigint', 'is', 'character', 'outer', 'add', 'last_value', 'else', 'escaped', 'undo', 'intersect', 'lead', 'kill', 'between', 'specific', 'grant', 'smallint', 'rank'}
def
cast_sql( self, expression: sqlglot.expressions.Cast, safe_prefix: Optional[str] = None) -> str:
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)
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}"
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)
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