sqlglot.dialects.mysql
1from __future__ import annotations 2 3from sqlglot import tokens 4from sqlglot.dialects.dialect import ( 5 Dialect, 6 NormalizationStrategy, 7) 8from sqlglot.generators.mysql import MySQLGenerator 9from sqlglot.parsers.mysql import MySQLParser 10from sqlglot.tokens import TokenType 11from sqlglot.typing.mysql import EXPRESSION_METADATA 12 13 14class MySQL(Dialect): 15 PROMOTE_TO_INFERRED_DATETIME_TYPE = True 16 17 # https://dev.mysql.com/doc/refman/8.0/en/identifiers.html 18 IDENTIFIERS_CAN_START_WITH_DIGIT = True 19 20 # We default to treating all identifiers as case-sensitive, since it matches MySQL's 21 # behavior on Linux systems. For MacOS and Windows systems, one can override this 22 # setting by specifying `dialect="mysql, normalization_strategy = lowercase"`. 23 # 24 # See also https://dev.mysql.com/doc/refman/8.2/en/identifier-case-sensitivity.html 25 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_SENSITIVE 26 27 TIME_FORMAT = "'%Y-%m-%d %T'" 28 DPIPE_IS_STRING_CONCAT = False 29 SUPPORTS_USER_DEFINED_TYPES = False 30 SAFE_DIVISION = True 31 SAFE_TO_ELIMINATE_DOUBLE_NEGATION = False 32 LEAST_GREATEST_IGNORES_NULLS = False 33 34 EXPRESSION_METADATA = EXPRESSION_METADATA.copy() 35 36 # https://prestodb.io/docs/current/functions/datetime.html#mysql-date-functions 37 TIME_MAPPING = { 38 "%M": "%B", 39 "%c": "%-m", 40 "%e": "%-d", 41 "%h": "%I", 42 "%i": "%M", 43 "%s": "%S", 44 "%u": "%W", 45 "%k": "%-H", 46 "%l": "%-I", 47 "%r": "%I:%M:%S %p", 48 "%T": "%H:%M:%S", 49 "%W": "%A", 50 "%x": "%G", 51 # %v (ISO week) is unmapped due to collision with %V (roundtrip issue) 52 } 53 54 VALID_INTERVAL_UNITS = { 55 *Dialect.VALID_INTERVAL_UNITS, 56 "SECOND_MICROSECOND", 57 "MINUTE_MICROSECOND", 58 "MINUTE_SECOND", 59 "HOUR_MICROSECOND", 60 "HOUR_SECOND", 61 "HOUR_MINUTE", 62 "DAY_MICROSECOND", 63 "DAY_SECOND", 64 "DAY_MINUTE", 65 "DAY_HOUR", 66 "YEAR_MONTH", 67 } 68 69 class Tokenizer(tokens.Tokenizer): 70 QUOTES = ["'", '"'] 71 COMMENTS = ["--", "#", ("/*", "*/")] 72 IDENTIFIERS = ["`"] 73 STRING_ESCAPES = ["'", '"', "\\"] 74 BIT_STRINGS = [("b'", "'"), ("B'", "'"), ("0b", "")] 75 HEX_STRINGS = [("x'", "'"), ("X'", "'"), ("0x", "")] 76 # https://dev.mysql.com/doc/refman/8.4/en/string-literals.html 77 ESCAPE_FOLLOW_CHARS = ["0", "b", "n", "r", "t", "Z", "%", "_"] 78 79 NESTED_COMMENTS = False 80 81 KEYWORDS = { 82 **tokens.Tokenizer.KEYWORDS, 83 "BLOB": TokenType.BLOB, 84 "CHARSET": TokenType.CHARACTER_SET, 85 "DISTINCTROW": TokenType.DISTINCT, 86 "EXPLAIN": TokenType.DESCRIBE, 87 "FORCE": TokenType.FORCE, 88 "IGNORE": TokenType.IGNORE, 89 "KEY": TokenType.KEY, 90 "LOCK TABLES": TokenType.COMMAND, 91 "LONGBLOB": TokenType.LONGBLOB, 92 "LONGTEXT": TokenType.LONGTEXT, 93 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 94 "MEDIUMINT": TokenType.MEDIUMINT, 95 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 96 "MEMBER OF": TokenType.MEMBER_OF, 97 "MOD": TokenType.MOD, 98 "SEPARATOR": TokenType.SEPARATOR, 99 "SERIAL": TokenType.SERIAL, 100 "SIGNED": TokenType.BIGINT, 101 "SIGNED INTEGER": TokenType.BIGINT, 102 "START": TokenType.BEGIN, 103 "TIMESTAMP": TokenType.TIMESTAMPTZ, 104 "TINYBLOB": TokenType.TINYBLOB, 105 "TINYTEXT": TokenType.TINYTEXT, 106 "UNLOCK TABLES": TokenType.COMMAND, 107 "UNSIGNED": TokenType.UBIGINT, 108 "UNSIGNED INTEGER": TokenType.UBIGINT, 109 "YEAR": TokenType.YEAR, 110 "_ARMSCII8": TokenType.INTRODUCER, 111 "_ASCII": TokenType.INTRODUCER, 112 "_BIG5": TokenType.INTRODUCER, 113 "_BINARY": TokenType.INTRODUCER, 114 "_CP1250": TokenType.INTRODUCER, 115 "_CP1251": TokenType.INTRODUCER, 116 "_CP1256": TokenType.INTRODUCER, 117 "_CP1257": TokenType.INTRODUCER, 118 "_CP850": TokenType.INTRODUCER, 119 "_CP852": TokenType.INTRODUCER, 120 "_CP866": TokenType.INTRODUCER, 121 "_CP932": TokenType.INTRODUCER, 122 "_DEC8": TokenType.INTRODUCER, 123 "_EUCJPMS": TokenType.INTRODUCER, 124 "_EUCKR": TokenType.INTRODUCER, 125 "_GB18030": TokenType.INTRODUCER, 126 "_GB2312": TokenType.INTRODUCER, 127 "_GBK": TokenType.INTRODUCER, 128 "_GEOSTD8": TokenType.INTRODUCER, 129 "_GREEK": TokenType.INTRODUCER, 130 "_HEBREW": TokenType.INTRODUCER, 131 "_HP8": TokenType.INTRODUCER, 132 "_KEYBCS2": TokenType.INTRODUCER, 133 "_KOI8R": TokenType.INTRODUCER, 134 "_KOI8U": TokenType.INTRODUCER, 135 "_LATIN1": TokenType.INTRODUCER, 136 "_LATIN2": TokenType.INTRODUCER, 137 "_LATIN5": TokenType.INTRODUCER, 138 "_LATIN7": TokenType.INTRODUCER, 139 "_MACCE": TokenType.INTRODUCER, 140 "_MACROMAN": TokenType.INTRODUCER, 141 "_SJIS": TokenType.INTRODUCER, 142 "_SWE7": TokenType.INTRODUCER, 143 "_TIS620": TokenType.INTRODUCER, 144 "_UCS2": TokenType.INTRODUCER, 145 "_UJIS": TokenType.INTRODUCER, 146 # https://dev.mysql.com/doc/refman/8.0/en/string-literals.html 147 "_UTF8": TokenType.INTRODUCER, 148 "_UTF16": TokenType.INTRODUCER, 149 "_UTF16LE": TokenType.INTRODUCER, 150 "_UTF32": TokenType.INTRODUCER, 151 "_UTF8MB3": TokenType.INTRODUCER, 152 "_UTF8MB4": TokenType.INTRODUCER, 153 "@@": TokenType.SESSION_PARAMETER, 154 } 155 156 COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.REPLACE} - {TokenType.SHOW} 157 158 Parser = MySQLParser 159 160 Generator = MySQLGenerator
15class MySQL(Dialect): 16 PROMOTE_TO_INFERRED_DATETIME_TYPE = True 17 18 # https://dev.mysql.com/doc/refman/8.0/en/identifiers.html 19 IDENTIFIERS_CAN_START_WITH_DIGIT = True 20 21 # We default to treating all identifiers as case-sensitive, since it matches MySQL's 22 # behavior on Linux systems. For MacOS and Windows systems, one can override this 23 # setting by specifying `dialect="mysql, normalization_strategy = lowercase"`. 24 # 25 # See also https://dev.mysql.com/doc/refman/8.2/en/identifier-case-sensitivity.html 26 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_SENSITIVE 27 28 TIME_FORMAT = "'%Y-%m-%d %T'" 29 DPIPE_IS_STRING_CONCAT = False 30 SUPPORTS_USER_DEFINED_TYPES = False 31 SAFE_DIVISION = True 32 SAFE_TO_ELIMINATE_DOUBLE_NEGATION = False 33 LEAST_GREATEST_IGNORES_NULLS = False 34 35 EXPRESSION_METADATA = EXPRESSION_METADATA.copy() 36 37 # https://prestodb.io/docs/current/functions/datetime.html#mysql-date-functions 38 TIME_MAPPING = { 39 "%M": "%B", 40 "%c": "%-m", 41 "%e": "%-d", 42 "%h": "%I", 43 "%i": "%M", 44 "%s": "%S", 45 "%u": "%W", 46 "%k": "%-H", 47 "%l": "%-I", 48 "%r": "%I:%M:%S %p", 49 "%T": "%H:%M:%S", 50 "%W": "%A", 51 "%x": "%G", 52 # %v (ISO week) is unmapped due to collision with %V (roundtrip issue) 53 } 54 55 VALID_INTERVAL_UNITS = { 56 *Dialect.VALID_INTERVAL_UNITS, 57 "SECOND_MICROSECOND", 58 "MINUTE_MICROSECOND", 59 "MINUTE_SECOND", 60 "HOUR_MICROSECOND", 61 "HOUR_SECOND", 62 "HOUR_MINUTE", 63 "DAY_MICROSECOND", 64 "DAY_SECOND", 65 "DAY_MINUTE", 66 "DAY_HOUR", 67 "YEAR_MONTH", 68 } 69 70 class Tokenizer(tokens.Tokenizer): 71 QUOTES = ["'", '"'] 72 COMMENTS = ["--", "#", ("/*", "*/")] 73 IDENTIFIERS = ["`"] 74 STRING_ESCAPES = ["'", '"', "\\"] 75 BIT_STRINGS = [("b'", "'"), ("B'", "'"), ("0b", "")] 76 HEX_STRINGS = [("x'", "'"), ("X'", "'"), ("0x", "")] 77 # https://dev.mysql.com/doc/refman/8.4/en/string-literals.html 78 ESCAPE_FOLLOW_CHARS = ["0", "b", "n", "r", "t", "Z", "%", "_"] 79 80 NESTED_COMMENTS = False 81 82 KEYWORDS = { 83 **tokens.Tokenizer.KEYWORDS, 84 "BLOB": TokenType.BLOB, 85 "CHARSET": TokenType.CHARACTER_SET, 86 "DISTINCTROW": TokenType.DISTINCT, 87 "EXPLAIN": TokenType.DESCRIBE, 88 "FORCE": TokenType.FORCE, 89 "IGNORE": TokenType.IGNORE, 90 "KEY": TokenType.KEY, 91 "LOCK TABLES": TokenType.COMMAND, 92 "LONGBLOB": TokenType.LONGBLOB, 93 "LONGTEXT": TokenType.LONGTEXT, 94 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 95 "MEDIUMINT": TokenType.MEDIUMINT, 96 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 97 "MEMBER OF": TokenType.MEMBER_OF, 98 "MOD": TokenType.MOD, 99 "SEPARATOR": TokenType.SEPARATOR, 100 "SERIAL": TokenType.SERIAL, 101 "SIGNED": TokenType.BIGINT, 102 "SIGNED INTEGER": TokenType.BIGINT, 103 "START": TokenType.BEGIN, 104 "TIMESTAMP": TokenType.TIMESTAMPTZ, 105 "TINYBLOB": TokenType.TINYBLOB, 106 "TINYTEXT": TokenType.TINYTEXT, 107 "UNLOCK TABLES": TokenType.COMMAND, 108 "UNSIGNED": TokenType.UBIGINT, 109 "UNSIGNED INTEGER": TokenType.UBIGINT, 110 "YEAR": TokenType.YEAR, 111 "_ARMSCII8": TokenType.INTRODUCER, 112 "_ASCII": TokenType.INTRODUCER, 113 "_BIG5": TokenType.INTRODUCER, 114 "_BINARY": TokenType.INTRODUCER, 115 "_CP1250": TokenType.INTRODUCER, 116 "_CP1251": TokenType.INTRODUCER, 117 "_CP1256": TokenType.INTRODUCER, 118 "_CP1257": TokenType.INTRODUCER, 119 "_CP850": TokenType.INTRODUCER, 120 "_CP852": TokenType.INTRODUCER, 121 "_CP866": TokenType.INTRODUCER, 122 "_CP932": TokenType.INTRODUCER, 123 "_DEC8": TokenType.INTRODUCER, 124 "_EUCJPMS": TokenType.INTRODUCER, 125 "_EUCKR": TokenType.INTRODUCER, 126 "_GB18030": TokenType.INTRODUCER, 127 "_GB2312": TokenType.INTRODUCER, 128 "_GBK": TokenType.INTRODUCER, 129 "_GEOSTD8": TokenType.INTRODUCER, 130 "_GREEK": TokenType.INTRODUCER, 131 "_HEBREW": TokenType.INTRODUCER, 132 "_HP8": TokenType.INTRODUCER, 133 "_KEYBCS2": TokenType.INTRODUCER, 134 "_KOI8R": TokenType.INTRODUCER, 135 "_KOI8U": TokenType.INTRODUCER, 136 "_LATIN1": TokenType.INTRODUCER, 137 "_LATIN2": TokenType.INTRODUCER, 138 "_LATIN5": TokenType.INTRODUCER, 139 "_LATIN7": TokenType.INTRODUCER, 140 "_MACCE": TokenType.INTRODUCER, 141 "_MACROMAN": TokenType.INTRODUCER, 142 "_SJIS": TokenType.INTRODUCER, 143 "_SWE7": TokenType.INTRODUCER, 144 "_TIS620": TokenType.INTRODUCER, 145 "_UCS2": TokenType.INTRODUCER, 146 "_UJIS": TokenType.INTRODUCER, 147 # https://dev.mysql.com/doc/refman/8.0/en/string-literals.html 148 "_UTF8": TokenType.INTRODUCER, 149 "_UTF16": TokenType.INTRODUCER, 150 "_UTF16LE": TokenType.INTRODUCER, 151 "_UTF32": TokenType.INTRODUCER, 152 "_UTF8MB3": TokenType.INTRODUCER, 153 "_UTF8MB4": TokenType.INTRODUCER, 154 "@@": TokenType.SESSION_PARAMETER, 155 } 156 157 COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.REPLACE} - {TokenType.SHOW} 158 159 Parser = MySQLParser 160 161 Generator = MySQLGenerator
This flag is used in the optimizer's canonicalize rule and determines whether x will be promoted to the literal's type in x::DATE < '2020-01-01 12:05:03' (i.e., DATETIME). When false, the literal is cast to x's type to match it instead.
Specifies the strategy according to which identifiers should be normalized.
Whether LEAST/GREATEST functions ignore NULL values, e.g:
- BigQuery, Snowflake, MySQL, Presto/Trino: LEAST(1, NULL, 2) -> NULL
- Spark, Postgres, DuckDB, TSQL: LEAST(1, NULL, 2) -> 1
Associates this dialect's time formats with their equivalent Python strftime formats.
Mapping of an escaped sequence (\n) to its unescaped version (
).
Whether string literals support escape sequences (e.g. \n). Set by the metaclass based on the tokenizer's STRING_ESCAPES.
Whether byte string literals support escape sequences. Set by the metaclass based on the tokenizer's BYTE_STRING_ESCAPES.
70 class Tokenizer(tokens.Tokenizer): 71 QUOTES = ["'", '"'] 72 COMMENTS = ["--", "#", ("/*", "*/")] 73 IDENTIFIERS = ["`"] 74 STRING_ESCAPES = ["'", '"', "\\"] 75 BIT_STRINGS = [("b'", "'"), ("B'", "'"), ("0b", "")] 76 HEX_STRINGS = [("x'", "'"), ("X'", "'"), ("0x", "")] 77 # https://dev.mysql.com/doc/refman/8.4/en/string-literals.html 78 ESCAPE_FOLLOW_CHARS = ["0", "b", "n", "r", "t", "Z", "%", "_"] 79 80 NESTED_COMMENTS = False 81 82 KEYWORDS = { 83 **tokens.Tokenizer.KEYWORDS, 84 "BLOB": TokenType.BLOB, 85 "CHARSET": TokenType.CHARACTER_SET, 86 "DISTINCTROW": TokenType.DISTINCT, 87 "EXPLAIN": TokenType.DESCRIBE, 88 "FORCE": TokenType.FORCE, 89 "IGNORE": TokenType.IGNORE, 90 "KEY": TokenType.KEY, 91 "LOCK TABLES": TokenType.COMMAND, 92 "LONGBLOB": TokenType.LONGBLOB, 93 "LONGTEXT": TokenType.LONGTEXT, 94 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 95 "MEDIUMINT": TokenType.MEDIUMINT, 96 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 97 "MEMBER OF": TokenType.MEMBER_OF, 98 "MOD": TokenType.MOD, 99 "SEPARATOR": TokenType.SEPARATOR, 100 "SERIAL": TokenType.SERIAL, 101 "SIGNED": TokenType.BIGINT, 102 "SIGNED INTEGER": TokenType.BIGINT, 103 "START": TokenType.BEGIN, 104 "TIMESTAMP": TokenType.TIMESTAMPTZ, 105 "TINYBLOB": TokenType.TINYBLOB, 106 "TINYTEXT": TokenType.TINYTEXT, 107 "UNLOCK TABLES": TokenType.COMMAND, 108 "UNSIGNED": TokenType.UBIGINT, 109 "UNSIGNED INTEGER": TokenType.UBIGINT, 110 "YEAR": TokenType.YEAR, 111 "_ARMSCII8": TokenType.INTRODUCER, 112 "_ASCII": TokenType.INTRODUCER, 113 "_BIG5": TokenType.INTRODUCER, 114 "_BINARY": TokenType.INTRODUCER, 115 "_CP1250": TokenType.INTRODUCER, 116 "_CP1251": TokenType.INTRODUCER, 117 "_CP1256": TokenType.INTRODUCER, 118 "_CP1257": TokenType.INTRODUCER, 119 "_CP850": TokenType.INTRODUCER, 120 "_CP852": TokenType.INTRODUCER, 121 "_CP866": TokenType.INTRODUCER, 122 "_CP932": TokenType.INTRODUCER, 123 "_DEC8": TokenType.INTRODUCER, 124 "_EUCJPMS": TokenType.INTRODUCER, 125 "_EUCKR": TokenType.INTRODUCER, 126 "_GB18030": TokenType.INTRODUCER, 127 "_GB2312": TokenType.INTRODUCER, 128 "_GBK": TokenType.INTRODUCER, 129 "_GEOSTD8": TokenType.INTRODUCER, 130 "_GREEK": TokenType.INTRODUCER, 131 "_HEBREW": TokenType.INTRODUCER, 132 "_HP8": TokenType.INTRODUCER, 133 "_KEYBCS2": TokenType.INTRODUCER, 134 "_KOI8R": TokenType.INTRODUCER, 135 "_KOI8U": TokenType.INTRODUCER, 136 "_LATIN1": TokenType.INTRODUCER, 137 "_LATIN2": TokenType.INTRODUCER, 138 "_LATIN5": TokenType.INTRODUCER, 139 "_LATIN7": TokenType.INTRODUCER, 140 "_MACCE": TokenType.INTRODUCER, 141 "_MACROMAN": TokenType.INTRODUCER, 142 "_SJIS": TokenType.INTRODUCER, 143 "_SWE7": TokenType.INTRODUCER, 144 "_TIS620": TokenType.INTRODUCER, 145 "_UCS2": TokenType.INTRODUCER, 146 "_UJIS": TokenType.INTRODUCER, 147 # https://dev.mysql.com/doc/refman/8.0/en/string-literals.html 148 "_UTF8": TokenType.INTRODUCER, 149 "_UTF16": TokenType.INTRODUCER, 150 "_UTF16LE": TokenType.INTRODUCER, 151 "_UTF32": TokenType.INTRODUCER, 152 "_UTF8MB3": TokenType.INTRODUCER, 153 "_UTF8MB4": TokenType.INTRODUCER, 154 "@@": TokenType.SESSION_PARAMETER, 155 } 156 157 COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.REPLACE} - {TokenType.SHOW}
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- SINGLE_TOKENS
- BYTE_STRINGS
- RAW_STRINGS
- HEREDOC_STRINGS
- UNICODE_STRINGS
- VAR_SINGLE_TOKENS
- IDENTIFIER_ESCAPES
- HEREDOC_TAG_IS_IDENTIFIER
- HEREDOC_STRING_ALTERNATIVE
- STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS
- HINT_START
- TOKENS_PRECEDING_HINT
- COMMAND_PREFIX_TOKENS
- NUMERIC_LITERALS
- NUMBERS_CAN_HAVE_DECIMALS
- dialect
- tokenize
- sql
- size
- tokens