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 def _parse_on_options() -> t.Optional[exp.Expression] | str: 670 if self._match_texts(("NULL", "ERROR")): 671 value = self._prev.text.upper() 672 else: 673 value = self._match(TokenType.DEFAULT) and self._parse_bitwise() 674 675 self._match_text_seq("ON") 676 self._match_texts(("EMPTY", "ERROR")) 677 678 return value 679 680 this = self._parse_bitwise() 681 self._match(TokenType.COMMA) 682 path = self._parse_bitwise() 683 684 returning = self._match(TokenType.RETURNING) and self._parse_type() 685 686 return self.expression( 687 exp.JSONValue, 688 this=this, 689 path=self.dialect.to_json_path(path), 690 returning=returning, 691 on_error=_parse_on_options(), 692 on_empty=_parse_on_options(), 693 ) 694 695 class Generator(generator.Generator): 696 INTERVAL_ALLOWS_PLURAL_FORM = False 697 LOCKING_READS_SUPPORTED = True 698 NULL_ORDERING_SUPPORTED = None 699 JOIN_HINTS = False 700 TABLE_HINTS = True 701 DUPLICATE_KEY_UPDATE_WITH_SET = False 702 QUERY_HINT_SEP = " " 703 VALUES_AS_TABLE = False 704 NVL2_SUPPORTED = False 705 LAST_DAY_SUPPORTS_DATE_PART = False 706 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 707 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 708 JSON_KEY_VALUE_PAIR_SEP = "," 709 SUPPORTS_TO_NUMBER = False 710 PARSE_JSON_NAME = None 711 PAD_FILL_PATTERN_IS_REQUIRED = True 712 WRAP_DERIVED_VALUES = False 713 714 TRANSFORMS = { 715 **generator.Generator.TRANSFORMS, 716 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 717 exp.CurrentDate: no_paren_current_date_sql, 718 exp.DateDiff: _remove_ts_or_ds_to_date( 719 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 720 ), 721 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 722 exp.DateStrToDate: datestrtodate_sql, 723 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 724 exp.DateTrunc: _date_trunc_sql, 725 exp.Day: _remove_ts_or_ds_to_date(), 726 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 727 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 728 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 729 exp.GroupConcat: lambda self, 730 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 731 exp.ILike: no_ilike_sql, 732 exp.JSONExtractScalar: arrow_json_extract_sql, 733 exp.Max: max_or_greatest, 734 exp.Min: min_or_least, 735 exp.Month: _remove_ts_or_ds_to_date(), 736 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 737 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 738 exp.Pivot: no_pivot_sql, 739 exp.Select: transforms.preprocess( 740 [ 741 transforms.eliminate_distinct_on, 742 transforms.eliminate_semi_and_anti_joins, 743 transforms.eliminate_qualify, 744 transforms.eliminate_full_outer_join, 745 transforms.unnest_generate_date_array_using_recursive_cte, 746 ] 747 ), 748 exp.StrPosition: strposition_to_locate_sql, 749 exp.StrToDate: _str_to_date_sql, 750 exp.StrToTime: _str_to_date_sql, 751 exp.Stuff: rename_func("INSERT"), 752 exp.TableSample: no_tablesample_sql, 753 exp.TimeFromParts: rename_func("MAKETIME"), 754 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 755 exp.TimestampDiff: lambda self, e: self.func( 756 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 757 ), 758 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 759 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 760 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 761 self, 762 e, 763 include_precision=not e.args.get("zone"), 764 ), 765 exp.TimeToStr: _remove_ts_or_ds_to_date( 766 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 767 ), 768 exp.Trim: trim_sql, 769 exp.TryCast: no_trycast_sql, 770 exp.TsOrDsAdd: date_add_sql("ADD"), 771 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 772 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 773 exp.UnixToTime: _unix_to_time_sql, 774 exp.Week: _remove_ts_or_ds_to_date(), 775 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 776 exp.Year: _remove_ts_or_ds_to_date(), 777 } 778 779 UNSIGNED_TYPE_MAPPING = { 780 exp.DataType.Type.UBIGINT: "BIGINT", 781 exp.DataType.Type.UINT: "INT", 782 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 783 exp.DataType.Type.USMALLINT: "SMALLINT", 784 exp.DataType.Type.UTINYINT: "TINYINT", 785 exp.DataType.Type.UDECIMAL: "DECIMAL", 786 } 787 788 TIMESTAMP_TYPE_MAPPING = { 789 exp.DataType.Type.TIMESTAMP: "DATETIME", 790 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 791 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 792 } 793 794 TYPE_MAPPING = { 795 **generator.Generator.TYPE_MAPPING, 796 **UNSIGNED_TYPE_MAPPING, 797 **TIMESTAMP_TYPE_MAPPING, 798 } 799 800 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 801 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 802 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 803 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 804 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 805 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 806 807 PROPERTIES_LOCATION = { 808 **generator.Generator.PROPERTIES_LOCATION, 809 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 810 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 811 } 812 813 LIMIT_FETCH = "LIMIT" 814 815 LIMIT_ONLY_LITERALS = True 816 817 CHAR_CAST_MAPPING = dict.fromkeys( 818 ( 819 exp.DataType.Type.LONGTEXT, 820 exp.DataType.Type.LONGBLOB, 821 exp.DataType.Type.MEDIUMBLOB, 822 exp.DataType.Type.MEDIUMTEXT, 823 exp.DataType.Type.TEXT, 824 exp.DataType.Type.TINYBLOB, 825 exp.DataType.Type.TINYTEXT, 826 exp.DataType.Type.VARCHAR, 827 ), 828 "CHAR", 829 ) 830 SIGNED_CAST_MAPPING = dict.fromkeys( 831 ( 832 exp.DataType.Type.BIGINT, 833 exp.DataType.Type.BOOLEAN, 834 exp.DataType.Type.INT, 835 exp.DataType.Type.SMALLINT, 836 exp.DataType.Type.TINYINT, 837 exp.DataType.Type.MEDIUMINT, 838 ), 839 "SIGNED", 840 ) 841 842 # MySQL doesn't support many datatypes in cast. 843 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 844 CAST_MAPPING = { 845 **CHAR_CAST_MAPPING, 846 **SIGNED_CAST_MAPPING, 847 exp.DataType.Type.UBIGINT: "UNSIGNED", 848 } 849 850 TIMESTAMP_FUNC_TYPES = { 851 exp.DataType.Type.TIMESTAMPTZ, 852 exp.DataType.Type.TIMESTAMPLTZ, 853 } 854 855 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 856 RESERVED_KEYWORDS = { 857 "accessible", 858 "add", 859 "all", 860 "alter", 861 "analyze", 862 "and", 863 "as", 864 "asc", 865 "asensitive", 866 "before", 867 "between", 868 "bigint", 869 "binary", 870 "blob", 871 "both", 872 "by", 873 "call", 874 "cascade", 875 "case", 876 "change", 877 "char", 878 "character", 879 "check", 880 "collate", 881 "column", 882 "condition", 883 "constraint", 884 "continue", 885 "convert", 886 "create", 887 "cross", 888 "cube", 889 "cume_dist", 890 "current_date", 891 "current_time", 892 "current_timestamp", 893 "current_user", 894 "cursor", 895 "database", 896 "databases", 897 "day_hour", 898 "day_microsecond", 899 "day_minute", 900 "day_second", 901 "dec", 902 "decimal", 903 "declare", 904 "default", 905 "delayed", 906 "delete", 907 "dense_rank", 908 "desc", 909 "describe", 910 "deterministic", 911 "distinct", 912 "distinctrow", 913 "div", 914 "double", 915 "drop", 916 "dual", 917 "each", 918 "else", 919 "elseif", 920 "empty", 921 "enclosed", 922 "escaped", 923 "except", 924 "exists", 925 "exit", 926 "explain", 927 "false", 928 "fetch", 929 "first_value", 930 "float", 931 "float4", 932 "float8", 933 "for", 934 "force", 935 "foreign", 936 "from", 937 "fulltext", 938 "function", 939 "generated", 940 "get", 941 "grant", 942 "group", 943 "grouping", 944 "groups", 945 "having", 946 "high_priority", 947 "hour_microsecond", 948 "hour_minute", 949 "hour_second", 950 "if", 951 "ignore", 952 "in", 953 "index", 954 "infile", 955 "inner", 956 "inout", 957 "insensitive", 958 "insert", 959 "int", 960 "int1", 961 "int2", 962 "int3", 963 "int4", 964 "int8", 965 "integer", 966 "intersect", 967 "interval", 968 "into", 969 "io_after_gtids", 970 "io_before_gtids", 971 "is", 972 "iterate", 973 "join", 974 "json_table", 975 "key", 976 "keys", 977 "kill", 978 "lag", 979 "last_value", 980 "lateral", 981 "lead", 982 "leading", 983 "leave", 984 "left", 985 "like", 986 "limit", 987 "linear", 988 "lines", 989 "load", 990 "localtime", 991 "localtimestamp", 992 "lock", 993 "long", 994 "longblob", 995 "longtext", 996 "loop", 997 "low_priority", 998 "master_bind", 999 "master_ssl_verify_server_cert", 1000 "match", 1001 "maxvalue", 1002 "mediumblob", 1003 "mediumint", 1004 "mediumtext", 1005 "middleint", 1006 "minute_microsecond", 1007 "minute_second", 1008 "mod", 1009 "modifies", 1010 "natural", 1011 "not", 1012 "no_write_to_binlog", 1013 "nth_value", 1014 "ntile", 1015 "null", 1016 "numeric", 1017 "of", 1018 "on", 1019 "optimize", 1020 "optimizer_costs", 1021 "option", 1022 "optionally", 1023 "or", 1024 "order", 1025 "out", 1026 "outer", 1027 "outfile", 1028 "over", 1029 "partition", 1030 "percent_rank", 1031 "precision", 1032 "primary", 1033 "procedure", 1034 "purge", 1035 "range", 1036 "rank", 1037 "read", 1038 "reads", 1039 "read_write", 1040 "real", 1041 "recursive", 1042 "references", 1043 "regexp", 1044 "release", 1045 "rename", 1046 "repeat", 1047 "replace", 1048 "require", 1049 "resignal", 1050 "restrict", 1051 "return", 1052 "revoke", 1053 "right", 1054 "rlike", 1055 "row", 1056 "rows", 1057 "row_number", 1058 "schema", 1059 "schemas", 1060 "second_microsecond", 1061 "select", 1062 "sensitive", 1063 "separator", 1064 "set", 1065 "show", 1066 "signal", 1067 "smallint", 1068 "spatial", 1069 "specific", 1070 "sql", 1071 "sqlexception", 1072 "sqlstate", 1073 "sqlwarning", 1074 "sql_big_result", 1075 "sql_calc_found_rows", 1076 "sql_small_result", 1077 "ssl", 1078 "starting", 1079 "stored", 1080 "straight_join", 1081 "system", 1082 "table", 1083 "terminated", 1084 "then", 1085 "tinyblob", 1086 "tinyint", 1087 "tinytext", 1088 "to", 1089 "trailing", 1090 "trigger", 1091 "true", 1092 "undo", 1093 "union", 1094 "unique", 1095 "unlock", 1096 "unsigned", 1097 "update", 1098 "usage", 1099 "use", 1100 "using", 1101 "utc_date", 1102 "utc_time", 1103 "utc_timestamp", 1104 "values", 1105 "varbinary", 1106 "varchar", 1107 "varcharacter", 1108 "varying", 1109 "virtual", 1110 "when", 1111 "where", 1112 "while", 1113 "window", 1114 "with", 1115 "write", 1116 "xor", 1117 "year_month", 1118 "zerofill", 1119 } 1120 1121 def array_sql(self, expression: exp.Array) -> str: 1122 self.unsupported("Arrays are not supported by MySQL") 1123 return self.function_fallback_sql(expression) 1124 1125 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1126 self.unsupported("Array operations are not supported by MySQL") 1127 return self.function_fallback_sql(expression) 1128 1129 def dpipe_sql(self, expression: exp.DPipe) -> str: 1130 return self.func("CONCAT", *expression.flatten()) 1131 1132 def extract_sql(self, expression: exp.Extract) -> str: 1133 unit = expression.name 1134 if unit and unit.lower() == "epoch": 1135 return self.func("UNIX_TIMESTAMP", expression.expression) 1136 1137 return super().extract_sql(expression) 1138 1139 def datatype_sql(self, expression: exp.DataType) -> str: 1140 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1141 result = super().datatype_sql(expression) 1142 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1143 result = f"{result} UNSIGNED" 1144 return result 1145 1146 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1147 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1148 1149 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1150 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1151 return self.func("TIMESTAMP", expression.this) 1152 1153 to = self.CAST_MAPPING.get(expression.to.this) 1154 1155 if to: 1156 expression.to.set("this", to) 1157 return super().cast_sql(expression) 1158 1159 def show_sql(self, expression: exp.Show) -> str: 1160 this = f" {expression.name}" 1161 full = " FULL" if expression.args.get("full") else "" 1162 global_ = " GLOBAL" if expression.args.get("global") else "" 1163 1164 target = self.sql(expression, "target") 1165 target = f" {target}" if target else "" 1166 if expression.name in ("COLUMNS", "INDEX"): 1167 target = f" FROM{target}" 1168 elif expression.name == "GRANTS": 1169 target = f" FOR{target}" 1170 1171 db = self._prefixed_sql("FROM", expression, "db") 1172 1173 like = self._prefixed_sql("LIKE", expression, "like") 1174 where = self.sql(expression, "where") 1175 1176 types = self.expressions(expression, key="types") 1177 types = f" {types}" if types else types 1178 query = self._prefixed_sql("FOR QUERY", expression, "query") 1179 1180 if expression.name == "PROFILE": 1181 offset = self._prefixed_sql("OFFSET", expression, "offset") 1182 limit = self._prefixed_sql("LIMIT", expression, "limit") 1183 else: 1184 offset = "" 1185 limit = self._oldstyle_limit_sql(expression) 1186 1187 log = self._prefixed_sql("IN", expression, "log") 1188 position = self._prefixed_sql("FROM", expression, "position") 1189 1190 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1191 1192 if expression.name == "ENGINE": 1193 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1194 else: 1195 mutex_or_status = "" 1196 1197 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1198 1199 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1200 dtype = self.sql(expression, "dtype") 1201 if not dtype: 1202 return super().altercolumn_sql(expression) 1203 1204 this = self.sql(expression, "this") 1205 return f"MODIFY COLUMN {this} {dtype}" 1206 1207 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1208 sql = self.sql(expression, arg) 1209 return f" {prefix} {sql}" if sql else "" 1210 1211 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1212 limit = self.sql(expression, "limit") 1213 offset = self.sql(expression, "offset") 1214 if limit: 1215 limit_offset = f"{offset}, {limit}" if offset else limit 1216 return f" LIMIT {limit_offset}" 1217 return "" 1218 1219 def chr_sql(self, expression: exp.Chr) -> str: 1220 this = self.expressions(sqls=[expression.this] + expression.expressions) 1221 charset = expression.args.get("charset") 1222 using = f" USING {self.sql(charset)}" if charset else "" 1223 return f"CHAR({this}{using})" 1224 1225 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1226 unit = expression.args.get("unit") 1227 1228 # Pick an old-enough date to avoid negative timestamp diffs 1229 start_ts = "'0000-01-01 00:00:00'" 1230 1231 # Source: https://stackoverflow.com/a/32955740 1232 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1233 interval = exp.Interval(this=timestamp_diff, unit=unit) 1234 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1235 1236 return self.sql(dateadd) 1237 1238 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1239 from_tz = expression.args.get("source_tz") 1240 to_tz = expression.args.get("target_tz") 1241 dt = expression.args.get("timestamp") 1242 1243 return self.func("CONVERT_TZ", dt, from_tz, to_tz) 1244 1245 def attimezone_sql(self, expression: exp.AtTimeZone) -> str: 1246 self.unsupported("AT TIME ZONE is not supported by MySQL") 1247 return self.sql(expression.this)
TIME_SPECIFIERS =
{'S', 'r', 'T', 's', 'h', 'l', 'k', 'i', 'p', 'H', 'I', 'f'}
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 def _parse_on_options() -> t.Optional[exp.Expression] | str: 671 if self._match_texts(("NULL", "ERROR")): 672 value = self._prev.text.upper() 673 else: 674 value = self._match(TokenType.DEFAULT) and self._parse_bitwise() 675 676 self._match_text_seq("ON") 677 self._match_texts(("EMPTY", "ERROR")) 678 679 return value 680 681 this = self._parse_bitwise() 682 self._match(TokenType.COMMA) 683 path = self._parse_bitwise() 684 685 returning = self._match(TokenType.RETURNING) and self._parse_type() 686 687 return self.expression( 688 exp.JSONValue, 689 this=this, 690 path=self.dialect.to_json_path(path), 691 returning=returning, 692 on_error=_parse_on_options(), 693 on_empty=_parse_on_options(), 694 ) 695 696 class Generator(generator.Generator): 697 INTERVAL_ALLOWS_PLURAL_FORM = False 698 LOCKING_READS_SUPPORTED = True 699 NULL_ORDERING_SUPPORTED = None 700 JOIN_HINTS = False 701 TABLE_HINTS = True 702 DUPLICATE_KEY_UPDATE_WITH_SET = False 703 QUERY_HINT_SEP = " " 704 VALUES_AS_TABLE = False 705 NVL2_SUPPORTED = False 706 LAST_DAY_SUPPORTS_DATE_PART = False 707 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 708 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 709 JSON_KEY_VALUE_PAIR_SEP = "," 710 SUPPORTS_TO_NUMBER = False 711 PARSE_JSON_NAME = None 712 PAD_FILL_PATTERN_IS_REQUIRED = True 713 WRAP_DERIVED_VALUES = False 714 715 TRANSFORMS = { 716 **generator.Generator.TRANSFORMS, 717 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 718 exp.CurrentDate: no_paren_current_date_sql, 719 exp.DateDiff: _remove_ts_or_ds_to_date( 720 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 721 ), 722 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 723 exp.DateStrToDate: datestrtodate_sql, 724 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 725 exp.DateTrunc: _date_trunc_sql, 726 exp.Day: _remove_ts_or_ds_to_date(), 727 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 728 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 729 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 730 exp.GroupConcat: lambda self, 731 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 732 exp.ILike: no_ilike_sql, 733 exp.JSONExtractScalar: arrow_json_extract_sql, 734 exp.Max: max_or_greatest, 735 exp.Min: min_or_least, 736 exp.Month: _remove_ts_or_ds_to_date(), 737 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 738 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 739 exp.Pivot: no_pivot_sql, 740 exp.Select: transforms.preprocess( 741 [ 742 transforms.eliminate_distinct_on, 743 transforms.eliminate_semi_and_anti_joins, 744 transforms.eliminate_qualify, 745 transforms.eliminate_full_outer_join, 746 transforms.unnest_generate_date_array_using_recursive_cte, 747 ] 748 ), 749 exp.StrPosition: strposition_to_locate_sql, 750 exp.StrToDate: _str_to_date_sql, 751 exp.StrToTime: _str_to_date_sql, 752 exp.Stuff: rename_func("INSERT"), 753 exp.TableSample: no_tablesample_sql, 754 exp.TimeFromParts: rename_func("MAKETIME"), 755 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 756 exp.TimestampDiff: lambda self, e: self.func( 757 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 758 ), 759 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 760 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 761 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 762 self, 763 e, 764 include_precision=not e.args.get("zone"), 765 ), 766 exp.TimeToStr: _remove_ts_or_ds_to_date( 767 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 768 ), 769 exp.Trim: trim_sql, 770 exp.TryCast: no_trycast_sql, 771 exp.TsOrDsAdd: date_add_sql("ADD"), 772 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 773 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 774 exp.UnixToTime: _unix_to_time_sql, 775 exp.Week: _remove_ts_or_ds_to_date(), 776 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 777 exp.Year: _remove_ts_or_ds_to_date(), 778 } 779 780 UNSIGNED_TYPE_MAPPING = { 781 exp.DataType.Type.UBIGINT: "BIGINT", 782 exp.DataType.Type.UINT: "INT", 783 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 784 exp.DataType.Type.USMALLINT: "SMALLINT", 785 exp.DataType.Type.UTINYINT: "TINYINT", 786 exp.DataType.Type.UDECIMAL: "DECIMAL", 787 } 788 789 TIMESTAMP_TYPE_MAPPING = { 790 exp.DataType.Type.TIMESTAMP: "DATETIME", 791 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 792 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 793 } 794 795 TYPE_MAPPING = { 796 **generator.Generator.TYPE_MAPPING, 797 **UNSIGNED_TYPE_MAPPING, 798 **TIMESTAMP_TYPE_MAPPING, 799 } 800 801 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 802 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 803 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 804 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 805 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 806 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 807 808 PROPERTIES_LOCATION = { 809 **generator.Generator.PROPERTIES_LOCATION, 810 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 811 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 812 } 813 814 LIMIT_FETCH = "LIMIT" 815 816 LIMIT_ONLY_LITERALS = True 817 818 CHAR_CAST_MAPPING = dict.fromkeys( 819 ( 820 exp.DataType.Type.LONGTEXT, 821 exp.DataType.Type.LONGBLOB, 822 exp.DataType.Type.MEDIUMBLOB, 823 exp.DataType.Type.MEDIUMTEXT, 824 exp.DataType.Type.TEXT, 825 exp.DataType.Type.TINYBLOB, 826 exp.DataType.Type.TINYTEXT, 827 exp.DataType.Type.VARCHAR, 828 ), 829 "CHAR", 830 ) 831 SIGNED_CAST_MAPPING = dict.fromkeys( 832 ( 833 exp.DataType.Type.BIGINT, 834 exp.DataType.Type.BOOLEAN, 835 exp.DataType.Type.INT, 836 exp.DataType.Type.SMALLINT, 837 exp.DataType.Type.TINYINT, 838 exp.DataType.Type.MEDIUMINT, 839 ), 840 "SIGNED", 841 ) 842 843 # MySQL doesn't support many datatypes in cast. 844 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 845 CAST_MAPPING = { 846 **CHAR_CAST_MAPPING, 847 **SIGNED_CAST_MAPPING, 848 exp.DataType.Type.UBIGINT: "UNSIGNED", 849 } 850 851 TIMESTAMP_FUNC_TYPES = { 852 exp.DataType.Type.TIMESTAMPTZ, 853 exp.DataType.Type.TIMESTAMPLTZ, 854 } 855 856 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 857 RESERVED_KEYWORDS = { 858 "accessible", 859 "add", 860 "all", 861 "alter", 862 "analyze", 863 "and", 864 "as", 865 "asc", 866 "asensitive", 867 "before", 868 "between", 869 "bigint", 870 "binary", 871 "blob", 872 "both", 873 "by", 874 "call", 875 "cascade", 876 "case", 877 "change", 878 "char", 879 "character", 880 "check", 881 "collate", 882 "column", 883 "condition", 884 "constraint", 885 "continue", 886 "convert", 887 "create", 888 "cross", 889 "cube", 890 "cume_dist", 891 "current_date", 892 "current_time", 893 "current_timestamp", 894 "current_user", 895 "cursor", 896 "database", 897 "databases", 898 "day_hour", 899 "day_microsecond", 900 "day_minute", 901 "day_second", 902 "dec", 903 "decimal", 904 "declare", 905 "default", 906 "delayed", 907 "delete", 908 "dense_rank", 909 "desc", 910 "describe", 911 "deterministic", 912 "distinct", 913 "distinctrow", 914 "div", 915 "double", 916 "drop", 917 "dual", 918 "each", 919 "else", 920 "elseif", 921 "empty", 922 "enclosed", 923 "escaped", 924 "except", 925 "exists", 926 "exit", 927 "explain", 928 "false", 929 "fetch", 930 "first_value", 931 "float", 932 "float4", 933 "float8", 934 "for", 935 "force", 936 "foreign", 937 "from", 938 "fulltext", 939 "function", 940 "generated", 941 "get", 942 "grant", 943 "group", 944 "grouping", 945 "groups", 946 "having", 947 "high_priority", 948 "hour_microsecond", 949 "hour_minute", 950 "hour_second", 951 "if", 952 "ignore", 953 "in", 954 "index", 955 "infile", 956 "inner", 957 "inout", 958 "insensitive", 959 "insert", 960 "int", 961 "int1", 962 "int2", 963 "int3", 964 "int4", 965 "int8", 966 "integer", 967 "intersect", 968 "interval", 969 "into", 970 "io_after_gtids", 971 "io_before_gtids", 972 "is", 973 "iterate", 974 "join", 975 "json_table", 976 "key", 977 "keys", 978 "kill", 979 "lag", 980 "last_value", 981 "lateral", 982 "lead", 983 "leading", 984 "leave", 985 "left", 986 "like", 987 "limit", 988 "linear", 989 "lines", 990 "load", 991 "localtime", 992 "localtimestamp", 993 "lock", 994 "long", 995 "longblob", 996 "longtext", 997 "loop", 998 "low_priority", 999 "master_bind", 1000 "master_ssl_verify_server_cert", 1001 "match", 1002 "maxvalue", 1003 "mediumblob", 1004 "mediumint", 1005 "mediumtext", 1006 "middleint", 1007 "minute_microsecond", 1008 "minute_second", 1009 "mod", 1010 "modifies", 1011 "natural", 1012 "not", 1013 "no_write_to_binlog", 1014 "nth_value", 1015 "ntile", 1016 "null", 1017 "numeric", 1018 "of", 1019 "on", 1020 "optimize", 1021 "optimizer_costs", 1022 "option", 1023 "optionally", 1024 "or", 1025 "order", 1026 "out", 1027 "outer", 1028 "outfile", 1029 "over", 1030 "partition", 1031 "percent_rank", 1032 "precision", 1033 "primary", 1034 "procedure", 1035 "purge", 1036 "range", 1037 "rank", 1038 "read", 1039 "reads", 1040 "read_write", 1041 "real", 1042 "recursive", 1043 "references", 1044 "regexp", 1045 "release", 1046 "rename", 1047 "repeat", 1048 "replace", 1049 "require", 1050 "resignal", 1051 "restrict", 1052 "return", 1053 "revoke", 1054 "right", 1055 "rlike", 1056 "row", 1057 "rows", 1058 "row_number", 1059 "schema", 1060 "schemas", 1061 "second_microsecond", 1062 "select", 1063 "sensitive", 1064 "separator", 1065 "set", 1066 "show", 1067 "signal", 1068 "smallint", 1069 "spatial", 1070 "specific", 1071 "sql", 1072 "sqlexception", 1073 "sqlstate", 1074 "sqlwarning", 1075 "sql_big_result", 1076 "sql_calc_found_rows", 1077 "sql_small_result", 1078 "ssl", 1079 "starting", 1080 "stored", 1081 "straight_join", 1082 "system", 1083 "table", 1084 "terminated", 1085 "then", 1086 "tinyblob", 1087 "tinyint", 1088 "tinytext", 1089 "to", 1090 "trailing", 1091 "trigger", 1092 "true", 1093 "undo", 1094 "union", 1095 "unique", 1096 "unlock", 1097 "unsigned", 1098 "update", 1099 "usage", 1100 "use", 1101 "using", 1102 "utc_date", 1103 "utc_time", 1104 "utc_timestamp", 1105 "values", 1106 "varbinary", 1107 "varchar", 1108 "varcharacter", 1109 "varying", 1110 "virtual", 1111 "when", 1112 "where", 1113 "while", 1114 "window", 1115 "with", 1116 "write", 1117 "xor", 1118 "year_month", 1119 "zerofill", 1120 } 1121 1122 def array_sql(self, expression: exp.Array) -> str: 1123 self.unsupported("Arrays are not supported by MySQL") 1124 return self.function_fallback_sql(expression) 1125 1126 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1127 self.unsupported("Array operations are not supported by MySQL") 1128 return self.function_fallback_sql(expression) 1129 1130 def dpipe_sql(self, expression: exp.DPipe) -> str: 1131 return self.func("CONCAT", *expression.flatten()) 1132 1133 def extract_sql(self, expression: exp.Extract) -> str: 1134 unit = expression.name 1135 if unit and unit.lower() == "epoch": 1136 return self.func("UNIX_TIMESTAMP", expression.expression) 1137 1138 return super().extract_sql(expression) 1139 1140 def datatype_sql(self, expression: exp.DataType) -> str: 1141 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1142 result = super().datatype_sql(expression) 1143 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1144 result = f"{result} UNSIGNED" 1145 return result 1146 1147 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1148 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1149 1150 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1151 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1152 return self.func("TIMESTAMP", expression.this) 1153 1154 to = self.CAST_MAPPING.get(expression.to.this) 1155 1156 if to: 1157 expression.to.set("this", to) 1158 return super().cast_sql(expression) 1159 1160 def show_sql(self, expression: exp.Show) -> str: 1161 this = f" {expression.name}" 1162 full = " FULL" if expression.args.get("full") else "" 1163 global_ = " GLOBAL" if expression.args.get("global") else "" 1164 1165 target = self.sql(expression, "target") 1166 target = f" {target}" if target else "" 1167 if expression.name in ("COLUMNS", "INDEX"): 1168 target = f" FROM{target}" 1169 elif expression.name == "GRANTS": 1170 target = f" FOR{target}" 1171 1172 db = self._prefixed_sql("FROM", expression, "db") 1173 1174 like = self._prefixed_sql("LIKE", expression, "like") 1175 where = self.sql(expression, "where") 1176 1177 types = self.expressions(expression, key="types") 1178 types = f" {types}" if types else types 1179 query = self._prefixed_sql("FOR QUERY", expression, "query") 1180 1181 if expression.name == "PROFILE": 1182 offset = self._prefixed_sql("OFFSET", expression, "offset") 1183 limit = self._prefixed_sql("LIMIT", expression, "limit") 1184 else: 1185 offset = "" 1186 limit = self._oldstyle_limit_sql(expression) 1187 1188 log = self._prefixed_sql("IN", expression, "log") 1189 position = self._prefixed_sql("FROM", expression, "position") 1190 1191 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1192 1193 if expression.name == "ENGINE": 1194 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1195 else: 1196 mutex_or_status = "" 1197 1198 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1199 1200 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1201 dtype = self.sql(expression, "dtype") 1202 if not dtype: 1203 return super().altercolumn_sql(expression) 1204 1205 this = self.sql(expression, "this") 1206 return f"MODIFY COLUMN {this} {dtype}" 1207 1208 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1209 sql = self.sql(expression, arg) 1210 return f" {prefix} {sql}" if sql else "" 1211 1212 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1213 limit = self.sql(expression, "limit") 1214 offset = self.sql(expression, "offset") 1215 if limit: 1216 limit_offset = f"{offset}, {limit}" if offset else limit 1217 return f" LIMIT {limit_offset}" 1218 return "" 1219 1220 def chr_sql(self, expression: exp.Chr) -> str: 1221 this = self.expressions(sqls=[expression.this] + expression.expressions) 1222 charset = expression.args.get("charset") 1223 using = f" USING {self.sql(charset)}" if charset else "" 1224 return f"CHAR({this}{using})" 1225 1226 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1227 unit = expression.args.get("unit") 1228 1229 # Pick an old-enough date to avoid negative timestamp diffs 1230 start_ts = "'0000-01-01 00:00:00'" 1231 1232 # Source: https://stackoverflow.com/a/32955740 1233 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1234 interval = exp.Interval(this=timestamp_diff, unit=unit) 1235 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1236 1237 return self.sql(dateadd) 1238 1239 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1240 from_tz = expression.args.get("source_tz") 1241 to_tz = expression.args.get("target_tz") 1242 dt = expression.args.get("timestamp") 1243 1244 return self.func("CONVERT_TZ", dt, from_tz, to_tz) 1245 1246 def attimezone_sql(self, expression: exp.AtTimeZone) -> str: 1247 self.unsupported("AT TIME ZONE is not supported by MySQL") 1248 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
- 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'>, '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.COMMAND: 'COMMAND'>, <TokenType.FETCH: 'FETCH'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.EXECUTE: 'EXECUTE'>, <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 def _parse_on_options() -> t.Optional[exp.Expression] | str: 671 if self._match_texts(("NULL", "ERROR")): 672 value = self._prev.text.upper() 673 else: 674 value = self._match(TokenType.DEFAULT) and self._parse_bitwise() 675 676 self._match_text_seq("ON") 677 self._match_texts(("EMPTY", "ERROR")) 678 679 return value 680 681 this = self._parse_bitwise() 682 self._match(TokenType.COMMA) 683 path = self._parse_bitwise() 684 685 returning = self._match(TokenType.RETURNING) and self._parse_type() 686 687 return self.expression( 688 exp.JSONValue, 689 this=this, 690 path=self.dialect.to_json_path(path), 691 returning=returning, 692 on_error=_parse_on_options(), 693 on_empty=_parse_on_options(), 694 )
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.DATE32: 'DATE32'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.ROW: 'ROW'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.NAME: 'NAME'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.ILIKE: 'ILIKE'>, <TokenType.INET: 'INET'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.UINT: 'UINT'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.NULL: 'NULL'>, <TokenType.RLIKE: 'RLIKE'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.LIKE: 'LIKE'>, <TokenType.UUID: 'UUID'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.GLOB: 'GLOB'>, <TokenType.XML: 'XML'>, <TokenType.BIT: 'BIT'>, <TokenType.VAR: 'VAR'>, <TokenType.TIME: 'TIME'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.ANY: 'ANY'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.MERGE: 'MERGE'>, <TokenType.RANGE: 'RANGE'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.ALL: 'ALL'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.UINT128: 'UINT128'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.IPV6: 'IPV6'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.MAP: 'MAP'>, <TokenType.FILTER: 'FILTER'>, <TokenType.INT128: 'INT128'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.JSONB: 'JSONB'>, <TokenType.FIRST: 'FIRST'>, <TokenType.ENUM: 'ENUM'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.DATE: 'DATE'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.YEAR: 'YEAR'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.TABLE: 'TABLE'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.PRIMARY_KEY: 'PRIMARY_KEY'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.VALUES: 'VALUES'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.INT256: 'INT256'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.BINARY: 'BINARY'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.INDEX: 'INDEX'>, <TokenType.INSERT: 'INSERT'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.INT: 'INT'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.IPV4: 'IPV4'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.LEFT: 'LEFT'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.LIST: 'LIST'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.CHAR: 'CHAR'>, <TokenType.UINT256: 'UINT256'>, <TokenType.TEXT: 'TEXT'>, <TokenType.JSON: 'JSON'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.XOR: 'XOR'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.MONEY: 'MONEY'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.SUPER: 'SUPER'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.SOME: 'SOME'>}
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.PROCEDURE: 'PROCEDURE'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.DATE32: 'DATE32'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.SET: 'SET'>, <TokenType.ROW: 'ROW'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.NAME: 'NAME'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.KILL: 'KILL'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.INET: 'INET'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.UINT: 'UINT'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.DESC: 'DESC'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.SEMI: 'SEMI'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.CACHE: 'CACHE'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.NULL: 'NULL'>, <TokenType.TOP: 'TOP'>, <TokenType.CASE: 'CASE'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.UUID: 'UUID'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.TRUE: 'TRUE'>, <TokenType.ROWS: 'ROWS'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.XML: 'XML'>, <TokenType.BIT: 'BIT'>, <TokenType.VAR: 'VAR'>, <TokenType.TIME: 'TIME'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.ANY: 'ANY'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.MERGE: 'MERGE'>, <TokenType.RANGE: 'RANGE'>, <TokenType.LOAD: 'LOAD'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.ALL: 'ALL'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.UINT128: 'UINT128'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.COPY: 'COPY'>, <TokenType.IPV6: 'IPV6'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.ASC: 'ASC'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.TAG: 'TAG'>, <TokenType.VIEW: 'VIEW'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.DIV: 'DIV'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.CUBE: 'CUBE'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.MAP: 'MAP'>, <TokenType.FILTER: 'FILTER'>, <TokenType.INT128: 'INT128'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.JSONB: 'JSONB'>, <TokenType.DELETE: 'DELETE'>, <TokenType.FIRST: 'FIRST'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.ENUM: 'ENUM'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.NEXT: 'NEXT'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.DATE: 'DATE'>, <TokenType.YEAR: 'YEAR'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.TABLE: 'TABLE'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.FINAL: 'FINAL'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.INT256: 'INT256'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.BINARY: 'BINARY'>, <TokenType.INDEX: 'INDEX'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.IS: 'IS'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.SHOW: 'SHOW'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.INT: 'INT'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.IPV4: 'IPV4'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.RENAME: 'RENAME'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.LIST: 'LIST'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.CHAR: 'CHAR'>, <TokenType.KEEP: 'KEEP'>, <TokenType.UINT256: 'UINT256'>, <TokenType.TEXT: 'TEXT'>, <TokenType.ANTI: 'ANTI'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.JSON: 'JSON'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.END: 'END'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.MODEL: 'MODEL'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.FALSE: 'FALSE'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.MONEY: 'MONEY'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.SUPER: 'SUPER'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.SOME: 'SOME'>}
RANGE_PARSERS =
{<TokenType.BETWEEN: 'BETWEEN'>: <function Parser.<lambda>>, <TokenType.GLOB: 'GLOB'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.ILIKE: 'ILIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IN: 'IN'>: <function Parser.<lambda>>, <TokenType.IRLIKE: 'IRLIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.IS: 'IS'>: <function Parser.<lambda>>, <TokenType.LIKE: 'LIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.OVERLAPS: 'OVERLAPS'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.RLIKE: 'RLIKE'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.SIMILAR_TO: 'SIMILAR_TO'>: <function binary_range_parser.<locals>._parse_binary_range>, <TokenType.FOR: 'FOR'>: <function Parser.<lambda>>, <TokenType.MEMBER_OF: 'MEMBER_OF'>: <function MySQL.Parser.<lambda>>}
FUNCTIONS =
{'ABS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Abs'>>, 'ADD_MONTHS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AddMonths'>>, 'ANONYMOUS_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AnonymousAggFunc'>>, 'ANY_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AnyValue'>>, 'APPROX_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxDistinct'>>, 'APPROX_COUNT_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxDistinct'>>, 'APPROX_QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxQuantile'>>, 'APPROX_TOP_K': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxTopK'>>, 'ARG_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'ARGMAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'MAX_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'ARG_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'ARGMIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'MIN_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'ARRAY': <function Parser.<lambda>>, 'ARRAY_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayAgg'>>, 'ARRAY_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayAll'>>, 'ARRAY_ANY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayAny'>>, 'ARRAY_CONCAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConcat'>>, 'ARRAY_CAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConcat'>>, 'ARRAY_CONSTRUCT_COMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConstructCompact'>>, 'ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContains'>>, 'ARRAY_HAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContains'>>, 'ARRAY_CONTAINS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContainsAll'>>, 'ARRAY_HAS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContainsAll'>>, 'FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayFilter'>>, 'ARRAY_FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayFilter'>>, 'ARRAY_OVERLAPS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayOverlaps'>>, 'ARRAY_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySize'>>, 'ARRAY_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySize'>>, 'ARRAY_SORT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySort'>>, 'ARRAY_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySum'>>, 'ARRAY_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayToString'>>, 'ARRAY_JOIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayToString'>>, 'ARRAY_UNION_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayUnionAgg'>>, 'ARRAY_UNIQUE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayUniqueAgg'>>, 'AVG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Avg'>>, 'CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Case'>>, 'CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cast'>>, 'CAST_TO_STR_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CastToStrType'>>, 'CBRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cbrt'>>, 'CEIL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ceil'>>, 'CEILING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ceil'>>, 'CHR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Chr'>>, 'CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Chr'>>, 'COALESCE': <function Parser.<lambda>>, 'IFNULL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Coalesce'>>, 'NVL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Coalesce'>>, 'COLLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Collate'>>, 'COMBINED_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CombinedAggFunc'>>, 'COMBINED_PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CombinedParameterizedAgg'>>, 'CONCAT': <function Parser.<lambda>>, 'CONCAT_WS': <function Parser.<lambda>>, 'CONNECT_BY_ROOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ConnectByRoot'>>, 'CONVERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Convert'>>, 'CONVERT_TIMEZONE': <function build_convert_timezone>, 'CORR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Corr'>>, 'COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Count'>>, 'COUNT_IF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CountIf'>>, 'COUNTIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CountIf'>>, 'COVAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CovarPop'>>, 'COVAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CovarSamp'>>, 'CURRENT_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentDate'>>, 'CURRENT_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentDatetime'>>, 'CURRENT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTime'>>, 'CURRENT_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTimestamp'>>, 'CURRENT_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentUser'>>, 'DATE': <function MySQL.Parser.<lambda>>, 'DATE_ADD': <function build_date_delta_with_interval.<locals>._builder>, 'DATEDIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateDiff'>>, 'DATE_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateDiff'>>, 'DATE_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromParts'>>, 'DATEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromParts'>>, 'DATE_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateStrToDate'>>, 'DATE_SUB': <function build_date_delta_with_interval.<locals>._builder>, 'DATE_TO_DATE_STR': <function Parser.<lambda>>, 'DATE_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateToDi'>>, 'DATE_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateTrunc'>>, 'DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Datetime'>>, 'DATETIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeAdd'>>, 'DATETIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeDiff'>>, 'DATETIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeSub'>>, 'DATETIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeTrunc'>>, 'DAY': <function MySQL.Parser.<lambda>>, 'DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfMonth'>>, 'DAYOFMONTH': <function MySQL.Parser.<lambda>>, 'DAY_OF_WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfWeek'>>, 'DAYOFWEEK': <function MySQL.Parser.<lambda>>, 'DAY_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfYear'>>, 'DAYOFYEAR': <function MySQL.Parser.<lambda>>, 'DECODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Decode'>>, 'DI_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DiToDate'>>, 'ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Encode'>>, 'EXP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Exp'>>, 'EXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Explode'>>, 'EXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ExplodeOuter'>>, 'EXPLODING_GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ExplodingGenerateSeries'>>, 'EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Extract'>>, 'FIRST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.First'>>, 'FIRST_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FirstValue'>>, 'FLATTEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Flatten'>>, 'FLOOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Floor'>>, 'FROM_BASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase'>>, 'FROM_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase64'>>, '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'>>, 'IS_INF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsInf'>>, 'ISINF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsInf'>>, 'IS_NAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsNan'>>, 'ISNAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsNan'>>, 'J_S_O_N_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArray'>>, 'J_S_O_N_ARRAY_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayAgg'>>, 'JSON_ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayContains'>>, 'JSONB_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBContains'>>, 'JSONB_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBExtract'>>, 'JSONB_EXTRACT_SCALAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBExtractScalar'>>, 'JSON_EXTRACT': <function build_extract_json_with_path.<locals>._builder>, 'JSON_EXTRACT_SCALAR': <function build_extract_json_with_path.<locals>._builder>, 'JSON_FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONFormat'>>, 'J_S_O_N_OBJECT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONObject'>>, 'J_S_O_N_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONObjectAgg'>>, 'J_S_O_N_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONTable'>>, 'LAG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lag'>>, 'LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Last'>>, 'LAST_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LastDay'>>, 'LAST_DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LastDay'>>, 'LAST_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LastValue'>>, 'LEAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lead'>>, 'LEAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Least'>>, 'LEFT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Left'>>, 'LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'LEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'LEVENSHTEIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Levenshtein'>>, 'LIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.List'>>, 'LN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ln'>>, 'LOG': <function build_logarithm>, 'LOGICAL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'BOOL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'BOOLAND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'LOGICAL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'BOOL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'BOOLOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'LOWER': <function build_lower>, 'LCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lower'>>, 'LOWER_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LowerHex'>>, 'MD5': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5'>>, 'MD5_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5Digest'>>, 'MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Map'>>, 'MAP_FROM_ENTRIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MapFromEntries'>>, 'MATCH_AGAINST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MatchAgainst'>>, 'MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Max'>>, 'MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Min'>>, 'MONTH': <function MySQL.Parser.<lambda>>, 'MONTHS_BETWEEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MonthsBetween'>>, 'NEXT_VALUE_FOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NextValueFor'>>, 'NTH_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NthValue'>>, 'NULLIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Nullif'>>, 'NUMBER_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NumberToStr'>>, 'NVL2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Nvl2'>>, 'OBJECT_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ObjectInsert'>>, 'OPEN_J_S_O_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.OpenJSON'>>, 'PAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pad'>>, 'PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParameterizedAgg'>>, 'PARSE_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseJSON'>>, 'JSON_PARSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseJSON'>>, 'PERCENTILE_CONT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PercentileCont'>>, 'PERCENTILE_DISC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PercentileDisc'>>, 'POSEXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Posexplode'>>, 'POSEXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PosexplodeOuter'>>, 'POWER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pow'>>, 'POW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pow'>>, 'PREDICT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Predict'>>, 'QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Quantile'>>, 'QUARTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Quarter'>>, 'RAND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rand'>>, 'RANDOM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rand'>>, 'RANDN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Randn'>>, 'RANGE_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RangeN'>>, 'READ_CSV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ReadCSV'>>, 'REDUCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Reduce'>>, 'REGEXP_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpExtract'>>, 'REGEXP_I_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpILike'>>, 'REGEXP_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpLike'>>, 'REGEXP_REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpReplace'>>, 'REGEXP_SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpSplit'>>, 'REPEAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Repeat'>>, 'RIGHT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Right'>>, 'ROUND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Round'>>, 'ROW_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RowNumber'>>, 'SHA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA2'>>, 'SAFE_DIVIDE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeDivide'>>, 'SIGN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SIGNUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SORT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SortArray'>>, 'SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Split'>>, 'SQRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sqrt'>>, 'STANDARD_HASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StandardHash'>>, 'STAR_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StarMap'>>, 'STARTS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STARTSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STDDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDDEV_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevPop'>>, 'STDDEV_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevSamp'>>, 'STR_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrPosition'>>, 'STR_TO_DATE': <function _str_to_date>, 'STR_TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToMap'>>, 'STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToTime'>>, 'STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToUnix'>>, 'STRING_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'SPLIT_BY_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'STRUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Struct'>>, 'STRUCT_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StructExtract'>>, 'STUFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'SUBSTRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Substring'>>, 'SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sum'>>, 'TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Time'>>, 'TIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeAdd'>>, 'TIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeDiff'>>, 'TIME_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'TIMEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'TIME_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToDate'>>, 'TIME_STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToTime'>>, 'TIME_STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToUnix'>>, 'TIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeSub'>>, 'TIME_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeToStr'>>, 'TIME_TO_TIME_STR': <function Parser.<lambda>>, 'TIME_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeToUnix'>>, 'TIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeTrunc'>>, 'TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Timestamp'>>, 'TIMESTAMP_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampAdd'>>, 'TIMESTAMPDIFF': <function build_date_delta.<locals>._builder>, 'TIMESTAMP_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampDiff'>>, 'TIMESTAMP_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampFromParts'>>, 'TIMESTAMPFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampFromParts'>>, 'TIMESTAMP_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampSub'>>, 'TIMESTAMP_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampTrunc'>>, 'TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToArray'>>, 'TO_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToBase64'>>, 'TO_CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToChar'>>, 'TO_DAYS': <function MySQL.Parser.<lambda>>, 'TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToMap'>>, 'TO_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToNumber'>>, 'TRANSFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Transform'>>, 'TRIM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Trim'>>, 'TRY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Try'>>, 'TRY_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryCast'>>, 'TS_OR_DI_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDiToDi'>>, 'TS_OR_DS_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsAdd'>>, 'TS_OR_DS_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsDiff'>>, 'TS_OR_DS_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToDate'>>, 'TS_OR_DS_TO_DATE_STR': <function Parser.<lambda>>, 'TS_OR_DS_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToTime'>>, 'TS_OR_DS_TO_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToTimestamp'>>, 'UNHEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Unhex'>>, 'UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixDate'>>, 'UNIX_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToStr'>>, 'UNIX_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToTime'>>, 'UNIX_TO_TIME_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToTimeStr'>>, 'UNNEST': <function Parser.<lambda>>, 'UPPER': <function build_upper>, 'UCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Upper'>>, 'VAR_MAP': <function build_var_map>, 'VARIANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VARIANCE_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VARIANCE_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VariancePop'>>, 'VAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VariancePop'>>, 'WEEK': <function MySQL.Parser.<lambda>>, 'WEEK_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.WeekOfYear'>>, 'WEEKOFYEAR': <function MySQL.Parser.<lambda>>, 'WHEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.When'>>, 'X_M_L_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.XMLTable'>>, 'XOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Xor'>>, 'YEAR': <function MySQL.Parser.<lambda>>, 'GLOB': <function Parser.<lambda>>, 'JSON_EXTRACT_PATH_TEXT': <function build_extract_json_with_path.<locals>._builder>, 'LIKE': <function build_like>, 'LOG2': <function Parser.<lambda>>, 'LOG10': <function Parser.<lambda>>, 'LPAD': <function Parser.<lambda>>, 'LEFTPAD': <function Parser.<lambda>>, '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>>, '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>>, 'DYNAMIC': <function Parser.<lambda>>, 'DISTKEY': <function Parser.<lambda>>, 'DISTSTYLE': <function Parser.<lambda>>, 'EMPTY': <function Parser.<lambda>>, 'ENGINE': <function Parser.<lambda>>, 'EXECUTE': <function Parser.<lambda>>, 'EXTERNAL': <function Parser.<lambda>>, 'FALLBACK': <function Parser.<lambda>>, 'FORMAT': <function Parser.<lambda>>, 'FREESPACE': <function Parser.<lambda>>, 'GLOBAL': <function Parser.<lambda>>, 'HEAP': <function Parser.<lambda>>, 'ICEBERG': <function Parser.<lambda>>, 'IMMUTABLE': <function Parser.<lambda>>, 'INHERITS': <function Parser.<lambda>>, 'INPUT': <function Parser.<lambda>>, 'JOURNAL': <function Parser.<lambda>>, 'LANGUAGE': <function Parser.<lambda>>, 'LAYOUT': <function Parser.<lambda>>, 'LIFETIME': <function Parser.<lambda>>, 'LIKE': <function Parser.<lambda>>, 'LOCATION': <function Parser.<lambda>>, 'LOCK': <function MySQL.Parser.<lambda>>, 'LOCKING': <function Parser.<lambda>>, 'LOG': <function Parser.<lambda>>, 'MATERIALIZED': <function Parser.<lambda>>, 'MERGEBLOCKRATIO': <function Parser.<lambda>>, 'MODIFIES': <function Parser.<lambda>>, 'MULTISET': <function Parser.<lambda>>, 'NO': <function Parser.<lambda>>, 'ON': <function Parser.<lambda>>, 'ORDER BY': <function Parser.<lambda>>, 'OUTPUT': <function Parser.<lambda>>, 'PARTITION': <function Parser.<lambda>>, 'PARTITION BY': <function Parser.<lambda>>, 'PARTITIONED BY': <function Parser.<lambda>>, 'PARTITIONED_BY': <function Parser.<lambda>>, 'PRIMARY KEY': <function Parser.<lambda>>, 'RANGE': <function Parser.<lambda>>, 'READS': <function Parser.<lambda>>, 'REMOTE': <function Parser.<lambda>>, 'RETURNS': <function Parser.<lambda>>, 'STRICT': <function Parser.<lambda>>, 'STREAMING': <function Parser.<lambda>>, 'ROW': <function Parser.<lambda>>, 'ROW_FORMAT': <function Parser.<lambda>>, 'SAMPLE': <function Parser.<lambda>>, 'SECURE': <function Parser.<lambda>>, 'SET': <function Parser.<lambda>>, 'SETTINGS': <function Parser.<lambda>>, 'SHARING': <function Parser.<lambda>>, 'SORTKEY': <function Parser.<lambda>>, 'SOURCE': <function Parser.<lambda>>, 'STABLE': <function Parser.<lambda>>, 'STORED': <function Parser.<lambda>>, 'SYSTEM_VERSIONING': <function Parser.<lambda>>, 'TBLPROPERTIES': <function Parser.<lambda>>, 'TEMP': <function Parser.<lambda>>, 'TEMPORARY': <function Parser.<lambda>>, 'TO': <function Parser.<lambda>>, 'TRANSIENT': <function Parser.<lambda>>, 'TRANSFORM': <function Parser.<lambda>>, 'TTL': <function Parser.<lambda>>, 'USING': <function Parser.<lambda>>, 'UNLOGGED': <function Parser.<lambda>>, 'VOLATILE': <function Parser.<lambda>>, 'WITH': <function Parser.<lambda>>}
SET_PARSERS =
{'GLOBAL': <function Parser.<lambda>>, 'LOCAL': <function Parser.<lambda>>, 'SESSION': <function Parser.<lambda>>, 'TRANSACTION': <function Parser.<lambda>>, 'PERSIST': <function MySQL.Parser.<lambda>>, 'PERSIST_ONLY': <function MySQL.Parser.<lambda>>, 'CHARACTER SET': <function MySQL.Parser.<lambda>>, 'CHARSET': <function MySQL.Parser.<lambda>>, 'NAMES': <function MySQL.Parser.<lambda>>}
CONSTRAINT_PARSERS =
{'AUTOINCREMENT': <function Parser.<lambda>>, 'AUTO_INCREMENT': <function Parser.<lambda>>, 'CASESPECIFIC': <function Parser.<lambda>>, 'CHARACTER SET': <function Parser.<lambda>>, 'CHECK': <function Parser.<lambda>>, 'COLLATE': <function Parser.<lambda>>, 'COMMENT': <function Parser.<lambda>>, 'COMPRESS': <function Parser.<lambda>>, 'CLUSTERED': <function Parser.<lambda>>, 'NONCLUSTERED': <function Parser.<lambda>>, 'DEFAULT': <function Parser.<lambda>>, 'ENCODE': <function Parser.<lambda>>, 'EPHEMERAL': <function Parser.<lambda>>, 'EXCLUDE': <function Parser.<lambda>>, 'FOREIGN KEY': <function Parser.<lambda>>, 'FORMAT': <function Parser.<lambda>>, 'GENERATED': <function Parser.<lambda>>, 'IDENTITY': <function Parser.<lambda>>, 'INLINE': <function Parser.<lambda>>, 'LIKE': <function Parser.<lambda>>, 'NOT': <function Parser.<lambda>>, 'NULL': <function Parser.<lambda>>, 'ON': <function Parser.<lambda>>, 'PATH': <function Parser.<lambda>>, 'PERIOD': <function Parser.<lambda>>, 'PRIMARY KEY': <function Parser.<lambda>>, 'REFERENCES': <function Parser.<lambda>>, 'TITLE': <function Parser.<lambda>>, 'TTL': <function Parser.<lambda>>, 'UNIQUE': <function Parser.<lambda>>, 'UPPERCASE': <function Parser.<lambda>>, 'WITH': <function Parser.<lambda>>, 'FULLTEXT': <function MySQL.Parser.<lambda>>, 'INDEX': <function MySQL.Parser.<lambda>>, 'KEY': <function MySQL.Parser.<lambda>>, 'SPATIAL': <function MySQL.Parser.<lambda>>}
ALTER_PARSERS =
{'ADD': <function Parser.<lambda>>, 'ALTER': <function Parser.<lambda>>, 'CLUSTER BY': <function Parser.<lambda>>, 'DELETE': <function Parser.<lambda>>, 'DROP': <function Parser.<lambda>>, 'RENAME': <function Parser.<lambda>>, 'SET': <function Parser.<lambda>>, 'AS': <function Parser.<lambda>>, 'MODIFY': <function MySQL.Parser.<lambda>>}
SCHEMA_UNNAMED_CONSTRAINTS =
{'INDEX', 'FOREIGN KEY', 'SPATIAL', 'FULLTEXT', 'PERIOD', 'KEY', 'CHECK', 'LIKE', 'UNIQUE', 'EXCLUDE', 'PRIMARY KEY'}
PROFILE_TYPES: Dict[str, Sequence[Union[Sequence[str], str]]] =
{'ALL': (), 'CPU': (), 'IPC': (), 'MEMORY': (), 'SOURCE': (), 'SWAPS': (), 'BLOCK': ('IO',), 'CONTEXT': ('SWITCHES',), 'PAGE': ('FAULTS',)}
TYPE_TOKENS =
{<TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.DATE32: 'DATE32'>, <TokenType.MAP: 'MAP'>, <TokenType.INT128: 'INT128'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.JSONB: 'JSONB'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.ENUM: 'ENUM'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.SET: 'SET'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.DATE: 'DATE'>, <TokenType.YEAR: 'YEAR'>, <TokenType.NAME: 'NAME'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.INET: 'INET'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.INT256: 'INT256'>, <TokenType.UINT: 'UINT'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.BINARY: 'BINARY'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.NULL: 'NULL'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.NESTED: 'NESTED'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.UUID: 'UUID'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.INT: 'INT'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.XML: 'XML'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.BIT: 'BIT'>, <TokenType.IPV4: 'IPV4'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.TIME: 'TIME'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.LIST: 'LIST'>, <TokenType.CHAR: 'CHAR'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.UINT256: 'UINT256'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.TEXT: 'TEXT'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.JSON: 'JSON'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.UINT128: 'UINT128'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.MONEY: 'MONEY'>, <TokenType.IPV6: 'IPV6'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.SUPER: 'SUPER'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.SERIAL: 'SERIAL'>}
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
- 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
696 class Generator(generator.Generator): 697 INTERVAL_ALLOWS_PLURAL_FORM = False 698 LOCKING_READS_SUPPORTED = True 699 NULL_ORDERING_SUPPORTED = None 700 JOIN_HINTS = False 701 TABLE_HINTS = True 702 DUPLICATE_KEY_UPDATE_WITH_SET = False 703 QUERY_HINT_SEP = " " 704 VALUES_AS_TABLE = False 705 NVL2_SUPPORTED = False 706 LAST_DAY_SUPPORTS_DATE_PART = False 707 JSON_TYPE_REQUIRED_FOR_EXTRACTION = True 708 JSON_PATH_BRACKETED_KEY_SUPPORTED = False 709 JSON_KEY_VALUE_PAIR_SEP = "," 710 SUPPORTS_TO_NUMBER = False 711 PARSE_JSON_NAME = None 712 PAD_FILL_PATTERN_IS_REQUIRED = True 713 WRAP_DERIVED_VALUES = False 714 715 TRANSFORMS = { 716 **generator.Generator.TRANSFORMS, 717 exp.ArrayAgg: rename_func("GROUP_CONCAT"), 718 exp.CurrentDate: no_paren_current_date_sql, 719 exp.DateDiff: _remove_ts_or_ds_to_date( 720 lambda self, e: self.func("DATEDIFF", e.this, e.expression), ("this", "expression") 721 ), 722 exp.DateAdd: _remove_ts_or_ds_to_date(date_add_sql("ADD")), 723 exp.DateStrToDate: datestrtodate_sql, 724 exp.DateSub: _remove_ts_or_ds_to_date(date_add_sql("SUB")), 725 exp.DateTrunc: _date_trunc_sql, 726 exp.Day: _remove_ts_or_ds_to_date(), 727 exp.DayOfMonth: _remove_ts_or_ds_to_date(rename_func("DAYOFMONTH")), 728 exp.DayOfWeek: _remove_ts_or_ds_to_date(rename_func("DAYOFWEEK")), 729 exp.DayOfYear: _remove_ts_or_ds_to_date(rename_func("DAYOFYEAR")), 730 exp.GroupConcat: lambda self, 731 e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", 732 exp.ILike: no_ilike_sql, 733 exp.JSONExtractScalar: arrow_json_extract_sql, 734 exp.Max: max_or_greatest, 735 exp.Min: min_or_least, 736 exp.Month: _remove_ts_or_ds_to_date(), 737 exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), 738 exp.NullSafeNEQ: lambda self, e: f"NOT {self.binary(e, '<=>')}", 739 exp.Pivot: no_pivot_sql, 740 exp.Select: transforms.preprocess( 741 [ 742 transforms.eliminate_distinct_on, 743 transforms.eliminate_semi_and_anti_joins, 744 transforms.eliminate_qualify, 745 transforms.eliminate_full_outer_join, 746 transforms.unnest_generate_date_array_using_recursive_cte, 747 ] 748 ), 749 exp.StrPosition: strposition_to_locate_sql, 750 exp.StrToDate: _str_to_date_sql, 751 exp.StrToTime: _str_to_date_sql, 752 exp.Stuff: rename_func("INSERT"), 753 exp.TableSample: no_tablesample_sql, 754 exp.TimeFromParts: rename_func("MAKETIME"), 755 exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), 756 exp.TimestampDiff: lambda self, e: self.func( 757 "TIMESTAMPDIFF", unit_to_var(e), e.expression, e.this 758 ), 759 exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), 760 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 761 exp.TimeStrToTime: lambda self, e: timestrtotime_sql( 762 self, 763 e, 764 include_precision=not e.args.get("zone"), 765 ), 766 exp.TimeToStr: _remove_ts_or_ds_to_date( 767 lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)) 768 ), 769 exp.Trim: trim_sql, 770 exp.TryCast: no_trycast_sql, 771 exp.TsOrDsAdd: date_add_sql("ADD"), 772 exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), 773 exp.TsOrDsToDate: _ts_or_ds_to_date_sql, 774 exp.UnixToTime: _unix_to_time_sql, 775 exp.Week: _remove_ts_or_ds_to_date(), 776 exp.WeekOfYear: _remove_ts_or_ds_to_date(rename_func("WEEKOFYEAR")), 777 exp.Year: _remove_ts_or_ds_to_date(), 778 } 779 780 UNSIGNED_TYPE_MAPPING = { 781 exp.DataType.Type.UBIGINT: "BIGINT", 782 exp.DataType.Type.UINT: "INT", 783 exp.DataType.Type.UMEDIUMINT: "MEDIUMINT", 784 exp.DataType.Type.USMALLINT: "SMALLINT", 785 exp.DataType.Type.UTINYINT: "TINYINT", 786 exp.DataType.Type.UDECIMAL: "DECIMAL", 787 } 788 789 TIMESTAMP_TYPE_MAPPING = { 790 exp.DataType.Type.TIMESTAMP: "DATETIME", 791 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 792 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", 793 } 794 795 TYPE_MAPPING = { 796 **generator.Generator.TYPE_MAPPING, 797 **UNSIGNED_TYPE_MAPPING, 798 **TIMESTAMP_TYPE_MAPPING, 799 } 800 801 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMTEXT) 802 TYPE_MAPPING.pop(exp.DataType.Type.LONGTEXT) 803 TYPE_MAPPING.pop(exp.DataType.Type.TINYTEXT) 804 TYPE_MAPPING.pop(exp.DataType.Type.MEDIUMBLOB) 805 TYPE_MAPPING.pop(exp.DataType.Type.LONGBLOB) 806 TYPE_MAPPING.pop(exp.DataType.Type.TINYBLOB) 807 808 PROPERTIES_LOCATION = { 809 **generator.Generator.PROPERTIES_LOCATION, 810 exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, 811 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 812 } 813 814 LIMIT_FETCH = "LIMIT" 815 816 LIMIT_ONLY_LITERALS = True 817 818 CHAR_CAST_MAPPING = dict.fromkeys( 819 ( 820 exp.DataType.Type.LONGTEXT, 821 exp.DataType.Type.LONGBLOB, 822 exp.DataType.Type.MEDIUMBLOB, 823 exp.DataType.Type.MEDIUMTEXT, 824 exp.DataType.Type.TEXT, 825 exp.DataType.Type.TINYBLOB, 826 exp.DataType.Type.TINYTEXT, 827 exp.DataType.Type.VARCHAR, 828 ), 829 "CHAR", 830 ) 831 SIGNED_CAST_MAPPING = dict.fromkeys( 832 ( 833 exp.DataType.Type.BIGINT, 834 exp.DataType.Type.BOOLEAN, 835 exp.DataType.Type.INT, 836 exp.DataType.Type.SMALLINT, 837 exp.DataType.Type.TINYINT, 838 exp.DataType.Type.MEDIUMINT, 839 ), 840 "SIGNED", 841 ) 842 843 # MySQL doesn't support many datatypes in cast. 844 # https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast 845 CAST_MAPPING = { 846 **CHAR_CAST_MAPPING, 847 **SIGNED_CAST_MAPPING, 848 exp.DataType.Type.UBIGINT: "UNSIGNED", 849 } 850 851 TIMESTAMP_FUNC_TYPES = { 852 exp.DataType.Type.TIMESTAMPTZ, 853 exp.DataType.Type.TIMESTAMPLTZ, 854 } 855 856 # https://dev.mysql.com/doc/refman/8.0/en/keywords.html 857 RESERVED_KEYWORDS = { 858 "accessible", 859 "add", 860 "all", 861 "alter", 862 "analyze", 863 "and", 864 "as", 865 "asc", 866 "asensitive", 867 "before", 868 "between", 869 "bigint", 870 "binary", 871 "blob", 872 "both", 873 "by", 874 "call", 875 "cascade", 876 "case", 877 "change", 878 "char", 879 "character", 880 "check", 881 "collate", 882 "column", 883 "condition", 884 "constraint", 885 "continue", 886 "convert", 887 "create", 888 "cross", 889 "cube", 890 "cume_dist", 891 "current_date", 892 "current_time", 893 "current_timestamp", 894 "current_user", 895 "cursor", 896 "database", 897 "databases", 898 "day_hour", 899 "day_microsecond", 900 "day_minute", 901 "day_second", 902 "dec", 903 "decimal", 904 "declare", 905 "default", 906 "delayed", 907 "delete", 908 "dense_rank", 909 "desc", 910 "describe", 911 "deterministic", 912 "distinct", 913 "distinctrow", 914 "div", 915 "double", 916 "drop", 917 "dual", 918 "each", 919 "else", 920 "elseif", 921 "empty", 922 "enclosed", 923 "escaped", 924 "except", 925 "exists", 926 "exit", 927 "explain", 928 "false", 929 "fetch", 930 "first_value", 931 "float", 932 "float4", 933 "float8", 934 "for", 935 "force", 936 "foreign", 937 "from", 938 "fulltext", 939 "function", 940 "generated", 941 "get", 942 "grant", 943 "group", 944 "grouping", 945 "groups", 946 "having", 947 "high_priority", 948 "hour_microsecond", 949 "hour_minute", 950 "hour_second", 951 "if", 952 "ignore", 953 "in", 954 "index", 955 "infile", 956 "inner", 957 "inout", 958 "insensitive", 959 "insert", 960 "int", 961 "int1", 962 "int2", 963 "int3", 964 "int4", 965 "int8", 966 "integer", 967 "intersect", 968 "interval", 969 "into", 970 "io_after_gtids", 971 "io_before_gtids", 972 "is", 973 "iterate", 974 "join", 975 "json_table", 976 "key", 977 "keys", 978 "kill", 979 "lag", 980 "last_value", 981 "lateral", 982 "lead", 983 "leading", 984 "leave", 985 "left", 986 "like", 987 "limit", 988 "linear", 989 "lines", 990 "load", 991 "localtime", 992 "localtimestamp", 993 "lock", 994 "long", 995 "longblob", 996 "longtext", 997 "loop", 998 "low_priority", 999 "master_bind", 1000 "master_ssl_verify_server_cert", 1001 "match", 1002 "maxvalue", 1003 "mediumblob", 1004 "mediumint", 1005 "mediumtext", 1006 "middleint", 1007 "minute_microsecond", 1008 "minute_second", 1009 "mod", 1010 "modifies", 1011 "natural", 1012 "not", 1013 "no_write_to_binlog", 1014 "nth_value", 1015 "ntile", 1016 "null", 1017 "numeric", 1018 "of", 1019 "on", 1020 "optimize", 1021 "optimizer_costs", 1022 "option", 1023 "optionally", 1024 "or", 1025 "order", 1026 "out", 1027 "outer", 1028 "outfile", 1029 "over", 1030 "partition", 1031 "percent_rank", 1032 "precision", 1033 "primary", 1034 "procedure", 1035 "purge", 1036 "range", 1037 "rank", 1038 "read", 1039 "reads", 1040 "read_write", 1041 "real", 1042 "recursive", 1043 "references", 1044 "regexp", 1045 "release", 1046 "rename", 1047 "repeat", 1048 "replace", 1049 "require", 1050 "resignal", 1051 "restrict", 1052 "return", 1053 "revoke", 1054 "right", 1055 "rlike", 1056 "row", 1057 "rows", 1058 "row_number", 1059 "schema", 1060 "schemas", 1061 "second_microsecond", 1062 "select", 1063 "sensitive", 1064 "separator", 1065 "set", 1066 "show", 1067 "signal", 1068 "smallint", 1069 "spatial", 1070 "specific", 1071 "sql", 1072 "sqlexception", 1073 "sqlstate", 1074 "sqlwarning", 1075 "sql_big_result", 1076 "sql_calc_found_rows", 1077 "sql_small_result", 1078 "ssl", 1079 "starting", 1080 "stored", 1081 "straight_join", 1082 "system", 1083 "table", 1084 "terminated", 1085 "then", 1086 "tinyblob", 1087 "tinyint", 1088 "tinytext", 1089 "to", 1090 "trailing", 1091 "trigger", 1092 "true", 1093 "undo", 1094 "union", 1095 "unique", 1096 "unlock", 1097 "unsigned", 1098 "update", 1099 "usage", 1100 "use", 1101 "using", 1102 "utc_date", 1103 "utc_time", 1104 "utc_timestamp", 1105 "values", 1106 "varbinary", 1107 "varchar", 1108 "varcharacter", 1109 "varying", 1110 "virtual", 1111 "when", 1112 "where", 1113 "while", 1114 "window", 1115 "with", 1116 "write", 1117 "xor", 1118 "year_month", 1119 "zerofill", 1120 } 1121 1122 def array_sql(self, expression: exp.Array) -> str: 1123 self.unsupported("Arrays are not supported by MySQL") 1124 return self.function_fallback_sql(expression) 1125 1126 def arraycontainsall_sql(self, expression: exp.ArrayContainsAll) -> str: 1127 self.unsupported("Array operations are not supported by MySQL") 1128 return self.function_fallback_sql(expression) 1129 1130 def dpipe_sql(self, expression: exp.DPipe) -> str: 1131 return self.func("CONCAT", *expression.flatten()) 1132 1133 def extract_sql(self, expression: exp.Extract) -> str: 1134 unit = expression.name 1135 if unit and unit.lower() == "epoch": 1136 return self.func("UNIX_TIMESTAMP", expression.expression) 1137 1138 return super().extract_sql(expression) 1139 1140 def datatype_sql(self, expression: exp.DataType) -> str: 1141 # https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html 1142 result = super().datatype_sql(expression) 1143 if expression.this in self.UNSIGNED_TYPE_MAPPING: 1144 result = f"{result} UNSIGNED" 1145 return result 1146 1147 def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: 1148 return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" 1149 1150 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1151 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1152 return self.func("TIMESTAMP", expression.this) 1153 1154 to = self.CAST_MAPPING.get(expression.to.this) 1155 1156 if to: 1157 expression.to.set("this", to) 1158 return super().cast_sql(expression) 1159 1160 def show_sql(self, expression: exp.Show) -> str: 1161 this = f" {expression.name}" 1162 full = " FULL" if expression.args.get("full") else "" 1163 global_ = " GLOBAL" if expression.args.get("global") else "" 1164 1165 target = self.sql(expression, "target") 1166 target = f" {target}" if target else "" 1167 if expression.name in ("COLUMNS", "INDEX"): 1168 target = f" FROM{target}" 1169 elif expression.name == "GRANTS": 1170 target = f" FOR{target}" 1171 1172 db = self._prefixed_sql("FROM", expression, "db") 1173 1174 like = self._prefixed_sql("LIKE", expression, "like") 1175 where = self.sql(expression, "where") 1176 1177 types = self.expressions(expression, key="types") 1178 types = f" {types}" if types else types 1179 query = self._prefixed_sql("FOR QUERY", expression, "query") 1180 1181 if expression.name == "PROFILE": 1182 offset = self._prefixed_sql("OFFSET", expression, "offset") 1183 limit = self._prefixed_sql("LIMIT", expression, "limit") 1184 else: 1185 offset = "" 1186 limit = self._oldstyle_limit_sql(expression) 1187 1188 log = self._prefixed_sql("IN", expression, "log") 1189 position = self._prefixed_sql("FROM", expression, "position") 1190 1191 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1192 1193 if expression.name == "ENGINE": 1194 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1195 else: 1196 mutex_or_status = "" 1197 1198 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}" 1199 1200 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 1201 dtype = self.sql(expression, "dtype") 1202 if not dtype: 1203 return super().altercolumn_sql(expression) 1204 1205 this = self.sql(expression, "this") 1206 return f"MODIFY COLUMN {this} {dtype}" 1207 1208 def _prefixed_sql(self, prefix: str, expression: exp.Expression, arg: str) -> str: 1209 sql = self.sql(expression, arg) 1210 return f" {prefix} {sql}" if sql else "" 1211 1212 def _oldstyle_limit_sql(self, expression: exp.Show) -> str: 1213 limit = self.sql(expression, "limit") 1214 offset = self.sql(expression, "offset") 1215 if limit: 1216 limit_offset = f"{offset}, {limit}" if offset else limit 1217 return f" LIMIT {limit_offset}" 1218 return "" 1219 1220 def chr_sql(self, expression: exp.Chr) -> str: 1221 this = self.expressions(sqls=[expression.this] + expression.expressions) 1222 charset = expression.args.get("charset") 1223 using = f" USING {self.sql(charset)}" if charset else "" 1224 return f"CHAR({this}{using})" 1225 1226 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1227 unit = expression.args.get("unit") 1228 1229 # Pick an old-enough date to avoid negative timestamp diffs 1230 start_ts = "'0000-01-01 00:00:00'" 1231 1232 # Source: https://stackoverflow.com/a/32955740 1233 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1234 interval = exp.Interval(this=timestamp_diff, unit=unit) 1235 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1236 1237 return self.sql(dateadd) 1238 1239 def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str: 1240 from_tz = expression.args.get("source_tz") 1241 to_tz = expression.args.get("target_tz") 1242 dt = expression.args.get("timestamp") 1243 1244 return self.func("CONVERT_TZ", dt, from_tz, to_tz) 1245 1246 def attimezone_sql(self, expression: exp.AtTimeZone) -> str: 1247 self.unsupported("AT TIME ZONE is not supported by MySQL") 1248 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.ExternalProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.GlobalProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.HeapProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.IcebergProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InheritsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InlineLengthColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InputModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.IntervalSpan'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LanguageProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LocationProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LogProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.MaterializedProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.NonClusteredColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.NoPrimaryIndexProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.NotForReplicationColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OnCommitProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OnProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OnUpdateColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.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.SetConfigProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SetProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SettingsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SharingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SqlReadWriteProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SqlSecurityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StabilityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Stream'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StreamingTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StrictProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TemporaryProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TagColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TitleColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ToMap'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ToTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TransformModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TransientProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UppercaseColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UnloggedProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.VarMap'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ViewAttributeProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.VolatileProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithJournalTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithSchemaBindingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithOperator'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ArrayAgg'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentDate'>: <function no_paren_current_date_sql>, <class 'sqlglot.expressions.DateDiff'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DateAdd'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DateStrToDate'>: <function datestrtodate_sql>, <class 'sqlglot.expressions.DateSub'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DateTrunc'>: <function _date_trunc_sql>, <class 'sqlglot.expressions.Day'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DayOfMonth'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DayOfWeek'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.DayOfYear'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.GroupConcat'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.ILike'>: <function no_ilike_sql>, <class 'sqlglot.expressions.JSONExtractScalar'>: <function arrow_json_extract_sql>, <class 'sqlglot.expressions.Max'>: <function max_or_greatest>, <class 'sqlglot.expressions.Min'>: <function min_or_least>, <class 'sqlglot.expressions.Month'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.NullSafeEQ'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.NullSafeNEQ'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.Pivot'>: <function no_pivot_sql>, <class 'sqlglot.expressions.Select'>: <function preprocess.<locals>._to_sql>, <class 'sqlglot.expressions.StrPosition'>: <function strposition_to_locate_sql>, <class 'sqlglot.expressions.StrToDate'>: <function _str_to_date_sql>, <class 'sqlglot.expressions.StrToTime'>: <function _str_to_date_sql>, <class 'sqlglot.expressions.Stuff'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TableSample'>: <function no_tablesample_sql>, <class 'sqlglot.expressions.TimeFromParts'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TimestampAdd'>: <function date_add_interval_sql.<locals>.func>, <class 'sqlglot.expressions.TimestampDiff'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.TimestampSub'>: <function date_add_interval_sql.<locals>.func>, <class 'sqlglot.expressions.TimeStrToUnix'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeStrToTime'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.TimeToStr'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.Trim'>: <function trim_sql>, <class 'sqlglot.expressions.TryCast'>: <function no_trycast_sql>, <class 'sqlglot.expressions.TsOrDsAdd'>: <function date_add_sql.<locals>.func>, <class 'sqlglot.expressions.TsOrDsDiff'>: <function MySQL.Generator.<lambda>>, <class 'sqlglot.expressions.TsOrDsToDate'>: <function _ts_or_ds_to_date_sql>, <class 'sqlglot.expressions.UnixToTime'>: <function _unix_to_time_sql>, <class 'sqlglot.expressions.Week'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.WeekOfYear'>: <function _remove_ts_or_ds_to_date.<locals>.func>, <class 'sqlglot.expressions.Year'>: <function _remove_ts_or_ds_to_date.<locals>.func>}
UNSIGNED_TYPE_MAPPING =
{<Type.UBIGINT: 'UBIGINT'>: 'BIGINT', <Type.UINT: 'UINT'>: 'INT', <Type.UMEDIUMINT: 'UMEDIUMINT'>: 'MEDIUMINT', <Type.USMALLINT: 'USMALLINT'>: 'SMALLINT', <Type.UTINYINT: 'UTINYINT'>: 'TINYINT', <Type.UDECIMAL: 'UDECIMAL'>: 'DECIMAL'}
TIMESTAMP_TYPE_MAPPING =
{<Type.TIMESTAMP: 'TIMESTAMP'>: 'DATETIME', <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>: 'TIMESTAMP', <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>: 'TIMESTAMP'}
TYPE_MAPPING =
{<Type.NCHAR: 'NCHAR'>: 'CHAR', <Type.NVARCHAR: 'NVARCHAR'>: 'VARCHAR', <Type.INET: 'INET'>: 'INET', <Type.ROWVERSION: 'ROWVERSION'>: 'VARBINARY', <Type.UBIGINT: 'UBIGINT'>: 'BIGINT', <Type.UINT: 'UINT'>: 'INT', <Type.UMEDIUMINT: 'UMEDIUMINT'>: 'MEDIUMINT', <Type.USMALLINT: 'USMALLINT'>: 'SMALLINT', <Type.UTINYINT: 'UTINYINT'>: 'TINYINT', <Type.UDECIMAL: 'UDECIMAL'>: 'DECIMAL', <Type.TIMESTAMP: 'TIMESTAMP'>: 'DATETIME', <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>: 'TIMESTAMP', <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>: 'TIMESTAMP'}
PROPERTIES_LOCATION =
{<class 'sqlglot.expressions.AllowedValuesProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.AlgorithmProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.AutoIncrementProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.AutoRefreshProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.BackupProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.BlockCompressionProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.CharacterSetProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ChecksumProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.CollateProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.CopyGrantsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Cluster'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ClusteredByProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DataBlocksizeProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.DataDeletionProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DefinerProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.DictRange'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DictProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DynamicProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.DistKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DistStyleProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EmptyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EngineProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ExecuteAsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ExternalProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.FallbackProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.FileFormatProperty'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.FreespaceProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.GlobalProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.HeapProperty'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.InheritsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.IcebergProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.InputModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.IsolatedLoadingProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.JournalProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.LanguageProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LikeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LocationProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LockProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LockingProperty'>: <Location.POST_ALIAS: 'POST_ALIAS'>, <class 'sqlglot.expressions.LogProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.MaterializedProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.MergeBlockRatioProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.NoPrimaryIndexProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.OnProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.OnCommitProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.Order'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.OutputModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PartitionedByProperty'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.PartitionedOfProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PrimaryKey'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Property'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.RemoteWithConnectionModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ReturnsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatDelimitedProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatSerdeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SampleProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SchemaCommentProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SecureProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.SerdeProperties'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Set'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SettingsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SetProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.SetConfigProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SharingProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.SequenceProperties'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.SortKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SqlReadWriteProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SqlSecurityProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.StabilityProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.StreamingTableProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.StrictProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.TemporaryProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.ToTableProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.TransientProperty'>: <Location.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.TransformModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.MergeTreeTTL'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.UnloggedProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.ViewAttributeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.VolatileProperty'>: <Location.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.WithDataProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.WithJournalTableProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.WithSchemaBindingProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.WithSystemVersioningProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>}
CHAR_CAST_MAPPING =
{<Type.LONGTEXT: 'LONGTEXT'>: 'CHAR', <Type.LONGBLOB: 'LONGBLOB'>: 'CHAR', <Type.MEDIUMBLOB: 'MEDIUMBLOB'>: 'CHAR', <Type.MEDIUMTEXT: 'MEDIUMTEXT'>: 'CHAR', <Type.TEXT: 'TEXT'>: 'CHAR', <Type.TINYBLOB: 'TINYBLOB'>: 'CHAR', <Type.TINYTEXT: 'TINYTEXT'>: 'CHAR', <Type.VARCHAR: 'VARCHAR'>: 'CHAR'}
SIGNED_CAST_MAPPING =
{<Type.BIGINT: 'BIGINT'>: 'SIGNED', <Type.BOOLEAN: 'BOOLEAN'>: 'SIGNED', <Type.INT: 'INT'>: 'SIGNED', <Type.SMALLINT: 'SMALLINT'>: 'SIGNED', <Type.TINYINT: 'TINYINT'>: 'SIGNED', <Type.MEDIUMINT: 'MEDIUMINT'>: 'SIGNED'}
CAST_MAPPING =
{<Type.LONGTEXT: 'LONGTEXT'>: 'CHAR', <Type.LONGBLOB: 'LONGBLOB'>: 'CHAR', <Type.MEDIUMBLOB: 'MEDIUMBLOB'>: 'CHAR', <Type.MEDIUMTEXT: 'MEDIUMTEXT'>: 'CHAR', <Type.TEXT: 'TEXT'>: 'CHAR', <Type.TINYBLOB: 'TINYBLOB'>: 'CHAR', <Type.TINYTEXT: 'TINYTEXT'>: 'CHAR', <Type.VARCHAR: 'VARCHAR'>: 'CHAR', <Type.BIGINT: 'BIGINT'>: 'SIGNED', <Type.BOOLEAN: 'BOOLEAN'>: 'SIGNED', <Type.INT: 'INT'>: 'SIGNED', <Type.SMALLINT: 'SMALLINT'>: 'SIGNED', <Type.TINYINT: 'TINYINT'>: 'SIGNED', <Type.MEDIUMINT: 'MEDIUMINT'>: 'SIGNED', <Type.UBIGINT: 'UBIGINT'>: 'UNSIGNED'}
RESERVED_KEYWORDS =
{'empty', 'sensitive', 'condition', 'alter', 'decimal', 'varying', 'load', 'localtimestamp', 'rank', 'mediumtext', 'before', 'drop', 'long', 'desc', 'left', 'table', 'create', 'ntile', 'int2', 'natural', 'fetch', 'deterministic', 'purge', 'to', 'into', 'enclosed', 'day_hour', 'cube', 'float', 'asc', 'repeat', 'int1', 'div', 'recursive', 'groups', 'mediumblob', 'intersect', 'exit', 'while', 'utc_time', 'low_priority', 'varcharacter', 'minute_second', 'rows', 'where', 'day_microsecond', 'having', 'replace', 'schema', 'lateral', 'io_before_gtids', 'row', 'current_date', 'middleint', 'unique', 'revoke', 'system', 'set', 'longblob', 'separator', 'get', 'from', 'inout', 'cross', 'tinyint', 'add', 'grant', 'master_ssl_verify_server_cert', 'last_value', 'delete', 'schemas', 'key', 'trigger', 'sqlstate', 'interval', 'else', 'return', 'range', 'accessible', 'delayed', 'integer', 'not', 'outfile', 'specific', 'read', 'mediumint', 'when', 'write', 'change', 'case', 'like', 'day_minute', 'inner', 'show', 'smallint', 'trailing', 'group', 'null', 'optimize', 'terminated', 'longtext', 'no_write_to_binlog', 'by', 'int3', 'localtime', 'read_write', 'double', 'row_number', 'lag', 'stored', 'true', 'analyze', 'window', 'binary', 'option', 'fulltext', 'insert', 'linear', 'lock', 'as', 'collate', 'character', 'straight_join', 'percent_rank', 'insensitive', 'current_user', 'index', 'numeric', 'bigint', 'sql_small_result', 'all', 'distinct', 'regexp', 'leave', 'order', 'describe', 'float4', 'utc_timestamp', 'virtual', 'partition', 'current_time', 'asensitive', 'lines', 'on', 'check', 'limit', 'foreign', 'of', 'explain', 'escaped', 'blob', 'tinyblob', 'call', 'primary', 'false', 'int', 'json_table', 'outer', 'signal', 'use', 'using', 'force', 'varchar', 'continue', 'resignal', 'int4', 'function', 'unlock', 'with', 'starting', 'dense_rank', 'rename', 'both', 'xor', 'cume_dist', 'modifies', 'release', 'high_priority', 'grouping', 'if', 'sqlwarning', 'precision', 'references', 'values', 'mod', 'default', 'keys', 'second_microsecond', 'generated', 'usage', 'declare', 'char', 'optionally', 'cursor', 'hour_microsecond', 'ssl', 'sql_calc_found_rows', 'day_second', 'then', 'out', 'varbinary', 'io_after_gtids', 'year_month', 'right', 'iterate', 'sql_big_result', 'except', 'infile', 'float8', 'convert', 'nth_value', 'sql', 'column', 'for', 'utc_date', 'sqlexception', 'join', 'cascade', 'each', 'require', 'spatial', 'in', 'select', 'distinctrow', 'procedure', 'master_bind', 'minute_microsecond', 'between', 'undo', 'unsigned', 'hour_minute', 'constraint', 'and', 'union', 'match', 'is', 'optimizer_costs', 'leading', 'loop', 'kill', 'int8', 'database', 'zerofill', 'first_value', 'or', 'dec', 'dual', 'tinytext', 'restrict', 'databases', 'current_timestamp', 'rlike', 'elseif', 'lead', 'exists', 'hour_second', 'maxvalue', 'update', 'real', 'over', 'reads', 'ignore'}
def
cast_sql( self, expression: sqlglot.expressions.Cast, safe_prefix: Optional[str] = None) -> str:
1150 def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: 1151 if expression.to.this in self.TIMESTAMP_FUNC_TYPES: 1152 return self.func("TIMESTAMP", expression.this) 1153 1154 to = self.CAST_MAPPING.get(expression.to.this) 1155 1156 if to: 1157 expression.to.set("this", to) 1158 return super().cast_sql(expression)
1160 def show_sql(self, expression: exp.Show) -> str: 1161 this = f" {expression.name}" 1162 full = " FULL" if expression.args.get("full") else "" 1163 global_ = " GLOBAL" if expression.args.get("global") else "" 1164 1165 target = self.sql(expression, "target") 1166 target = f" {target}" if target else "" 1167 if expression.name in ("COLUMNS", "INDEX"): 1168 target = f" FROM{target}" 1169 elif expression.name == "GRANTS": 1170 target = f" FOR{target}" 1171 1172 db = self._prefixed_sql("FROM", expression, "db") 1173 1174 like = self._prefixed_sql("LIKE", expression, "like") 1175 where = self.sql(expression, "where") 1176 1177 types = self.expressions(expression, key="types") 1178 types = f" {types}" if types else types 1179 query = self._prefixed_sql("FOR QUERY", expression, "query") 1180 1181 if expression.name == "PROFILE": 1182 offset = self._prefixed_sql("OFFSET", expression, "offset") 1183 limit = self._prefixed_sql("LIMIT", expression, "limit") 1184 else: 1185 offset = "" 1186 limit = self._oldstyle_limit_sql(expression) 1187 1188 log = self._prefixed_sql("IN", expression, "log") 1189 position = self._prefixed_sql("FROM", expression, "position") 1190 1191 channel = self._prefixed_sql("FOR CHANNEL", expression, "channel") 1192 1193 if expression.name == "ENGINE": 1194 mutex_or_status = " MUTEX" if expression.args.get("mutex") else " STATUS" 1195 else: 1196 mutex_or_status = "" 1197 1198 return f"SHOW{full}{global_}{this}{target}{types}{db}{query}{log}{position}{channel}{mutex_or_status}{like}{where}{offset}{limit}"
1226 def timestamptrunc_sql(self, expression: exp.TimestampTrunc) -> str: 1227 unit = expression.args.get("unit") 1228 1229 # Pick an old-enough date to avoid negative timestamp diffs 1230 start_ts = "'0000-01-01 00:00:00'" 1231 1232 # Source: https://stackoverflow.com/a/32955740 1233 timestamp_diff = build_date_delta(exp.TimestampDiff)([unit, start_ts, expression.this]) 1234 interval = exp.Interval(this=timestamp_diff, unit=unit) 1235 dateadd = build_date_delta_with_interval(exp.DateAdd)([start_ts, interval]) 1236 1237 return self.sql(dateadd)
AFTER_HAVING_MODIFIER_TRANSFORMS =
{'windows': <function Generator.<lambda>>, 'qualify': <function Generator.<lambda>>}
Inherited Members
- sqlglot.generator.Generator
- Generator
- IGNORE_NULLS_IN_FUNC
- EXPLICIT_SET_OP
- CREATE_FUNCTION_RETURN_AS
- MATCHED_BY_SOURCE
- SINGLE_STRING_INTERVAL
- RENAME_TABLE_WITH_DB
- GROUPINGS_SEP
- INDEX_ON
- QUERY_HINTS
- IS_BOOL_ALLOWED
- LIMIT_IS_TOP
- RETURNING_END
- EXTRACT_ALLOWS_QUOTES
- TZ_TO_WITH_TIME_ZONE
- ALTER_TABLE_INCLUDE_COLUMN_KEYWORD
- UNNEST_WITH_ORDINALITY
- AGGREGATE_FILTER_SUPPORTED
- SEMI_ANTI_JOIN_WITH_SIDE
- COMPUTED_COLUMN_WITH_TYPE
- SUPPORTS_TABLE_COPY
- TABLESAMPLE_REQUIRES_PARENS
- TABLESAMPLE_SIZE_IS_ROWS
- TABLESAMPLE_KEYWORDS
- TABLESAMPLE_WITH_METHOD
- TABLESAMPLE_SEED_KEYWORD
- COLLATE_IS_FUNC
- DATA_TYPE_SPECIFIERS_ALLOWED
- ENSURE_BOOLS
- CTE_RECURSIVE_KEYWORD_REQUIRED
- SUPPORTS_SINGLE_ARG_CONCAT
- SUPPORTS_TABLE_ALIAS_COLUMNS
- UNPIVOT_ALIASES_ARE_IDENTIFIERS
- INSERT_OVERWRITE
- SUPPORTS_SELECT_INTO
- SUPPORTS_UNLOGGED_TABLES
- SUPPORTS_CREATE_TABLE_LIKE
- LIKE_PROPERTY_INSIDE_SCHEMA
- MULTI_ARG_DISTINCT
- JSON_PATH_SINGLE_QUOTE_ESCAPE
- SUPPORTED_JSON_PATH_PARTS
- CAN_IMPLEMENT_ARRAY_ANY
- SET_OP_MODIFIERS
- COPY_PARAMS_ARE_WRAPPED
- COPY_PARAMS_EQ_REQUIRED
- COPY_HAS_INTO_KEYWORD
- STAR_EXCEPT
- HEX_FUNC
- WITH_PROPERTIES_PREFIX
- QUOTE_JSON_PATH
- SUPPORTS_EXPLODING_PROJECTIONS
- ARRAY_CONCAT_IS_VAR_LEN
- SUPPORTS_CONVERT_TIMEZONE
- TIME_PART_SINGULARS
- TOKEN_MAPPING
- STRUCT_DELIMITER
- PARAMETER_TOKEN
- NAMED_PLACEHOLDER_TOKEN
- WITH_SEPARATED_COMMENTS
- EXCLUDE_COMMENTS
- UNWRAPPED_INTERVAL_VALUES
- PARAMETERIZABLE_TEXT_TYPES
- EXPRESSIONS_WITHOUT_NESTED_CTES
- SENTINEL_LINE_BREAK
- pretty
- identify
- normalize
- pad
- unsupported_level
- max_unsupported
- leading_comma
- max_text_width
- comments
- dialect
- normalize_functions
- unsupported_messages
- generate
- preprocess
- unsupported
- sep
- seg
- pad_comment
- maybe_comment
- wrap
- no_identify
- normalize_func
- indent
- sql
- uncache_sql
- cache_sql
- characterset_sql
- column_parts
- column_sql
- columnposition_sql
- columndef_sql
- columnconstraint_sql
- computedcolumnconstraint_sql
- autoincrementcolumnconstraint_sql
- compresscolumnconstraint_sql
- generatedasidentitycolumnconstraint_sql
- generatedasrowcolumnconstraint_sql
- periodforsystemtimeconstraint_sql
- notnullcolumnconstraint_sql
- transformcolumnconstraint_sql
- primarykeycolumnconstraint_sql
- uniquecolumnconstraint_sql
- createable_sql
- create_sql
- sequenceproperties_sql
- clone_sql
- describe_sql
- heredoc_sql
- prepend_ctes
- with_sql
- cte_sql
- tablealias_sql
- bitstring_sql
- hexstring_sql
- bytestring_sql
- unicodestring_sql
- rawstring_sql
- datatypeparam_sql
- directory_sql
- delete_sql
- drop_sql
- except_sql
- except_op
- fetch_sql
- filter_sql
- hint_sql
- indexparameters_sql
- index_sql
- identifier_sql
- hex_sql
- lowerhex_sql
- inputoutputformat_sql
- national_sql
- partition_sql
- properties_sql
- root_properties
- properties
- with_properties
- locate_properties
- property_name
- property_sql
- likeproperty_sql
- fallbackproperty_sql
- journalproperty_sql
- freespaceproperty_sql
- checksumproperty_sql
- mergeblockratioproperty_sql
- datablocksizeproperty_sql
- blockcompressionproperty_sql
- isolatedloadingproperty_sql
- partitionboundspec_sql
- partitionedofproperty_sql
- lockingproperty_sql
- withdataproperty_sql
- withsystemversioningproperty_sql
- insert_sql
- intersect_sql
- intersect_op
- introducer_sql
- kill_sql
- pseudotype_sql
- objectidentifier_sql
- onconflict_sql
- returning_sql
- rowformatdelimitedproperty_sql
- withtablehint_sql
- indextablehint_sql
- historicaldata_sql
- table_parts
- table_sql
- tablesample_sql
- pivot_sql
- version_sql
- tuple_sql
- update_sql
- values_sql
- var_sql
- into_sql
- from_sql
- 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
- set_operations
- union_sql
- union_op
- unnest_sql
- prewhere_sql
- where_sql
- window_sql
- partition_by_sql
- windowspec_sql
- withingroup_sql
- between_sql
- bracket_offset_expressions
- bracket_sql
- all_sql
- any_sql
- exists_sql
- case_sql
- constraint_sql
- nextvaluefor_sql
- trim_sql
- convert_concat_args
- concat_sql
- concatws_sql
- check_sql
- foreignkey_sql
- primarykey_sql
- if_sql
- matchagainst_sql
- jsonkeyvalue_sql
- jsonpath_sql
- json_path_part
- formatjson_sql
- jsonobject_sql
- jsonobjectagg_sql
- jsonarray_sql
- jsonarrayagg_sql
- jsoncolumndef_sql
- jsonschema_sql
- jsontable_sql
- openjsoncolumndef_sql
- openjson_sql
- in_sql
- in_unnest_op
- interval_sql
- return_sql
- reference_sql
- anonymous_sql
- paren_sql
- neg_sql
- not_sql
- alias_sql
- pivotalias_sql
- aliases_sql
- atindex_sql
- fromtimezone_sql
- add_sql
- and_sql
- or_sql
- xor_sql
- connector_sql
- bitwiseand_sql
- bitwiseleftshift_sql
- bitwisenot_sql
- bitwiseor_sql
- bitwiserightshift_sql
- bitwisexor_sql
- currentdate_sql
- collate_sql
- command_sql
- comment_sql
- mergetreettlaction_sql
- mergetreettl_sql
- transaction_sql
- commit_sql
- rollback_sql
- alterdiststyle_sql
- altersortkey_sql
- renametable_sql
- renamecolumn_sql
- alterset_sql
- alter_sql
- add_column_sql
- droppartition_sql
- addconstraint_sql
- distinct_sql
- ignorenulls_sql
- respectnulls_sql
- havingmax_sql
- intdiv_sql
- div_sql
- overlaps_sql
- distance_sql
- dot_sql
- eq_sql
- propertyeq_sql
- escape_sql
- glob_sql
- gt_sql
- gte_sql
- ilike_sql
- ilikeany_sql
- is_sql
- like_sql
- likeany_sql
- similarto_sql
- lt_sql
- lte_sql
- mod_sql
- mul_sql
- neq_sql
- nullsafeeq_sql
- nullsafeneq_sql
- slice_sql
- sub_sql
- trycast_sql
- try_sql
- log_sql
- use_sql
- binary
- function_fallback_sql
- func
- format_args
- too_wide
- format_time
- expressions
- op_expressions
- naked_property
- tag_sql
- token_sql
- userdefinedfunction_sql
- joinhint_sql
- kwarg_sql
- when_sql
- merge_sql
- tochar_sql
- tonumber_sql
- dictproperty_sql
- dictrange_sql
- dictsubproperty_sql
- oncluster_sql
- clusteredbyproperty_sql
- anyvalue_sql
- querytransform_sql
- indexconstraintoption_sql
- checkcolumnconstraint_sql
- indexcolumnconstraint_sql
- nvl2_sql
- comprehension_sql
- columnprefix_sql
- opclass_sql
- predict_sql
- forin_sql
- refresh_sql
- 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