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 CONCAT_WS_COALESCE = True 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
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 CONCAT_WS_COALESCE = True 31 SUPPORTS_USER_DEFINED_TYPES = False 32 SAFE_DIVISION = True 33 SAFE_TO_ELIMINATE_DOUBLE_NEGATION = False 34 LEAST_GREATEST_IGNORES_NULLS = False 35 36 EXPRESSION_METADATA = EXPRESSION_METADATA.copy() 37 38 # https://prestodb.io/docs/current/functions/datetime.html#mysql-date-functions 39 TIME_MAPPING = { 40 "%M": "%B", 41 "%c": "%-m", 42 "%e": "%-d", 43 "%h": "%I", 44 "%i": "%M", 45 "%s": "%S", 46 "%u": "%W", 47 "%k": "%-H", 48 "%l": "%-I", 49 "%r": "%I:%M:%S %p", 50 "%T": "%H:%M:%S", 51 "%W": "%A", 52 "%x": "%G", 53 # %v (ISO week) is unmapped due to collision with %V (roundtrip issue) 54 } 55 56 VALID_INTERVAL_UNITS = { 57 *Dialect.VALID_INTERVAL_UNITS, 58 "SECOND_MICROSECOND", 59 "MINUTE_MICROSECOND", 60 "MINUTE_SECOND", 61 "HOUR_MICROSECOND", 62 "HOUR_SECOND", 63 "HOUR_MINUTE", 64 "DAY_MICROSECOND", 65 "DAY_SECOND", 66 "DAY_MINUTE", 67 "DAY_HOUR", 68 "YEAR_MONTH", 69 } 70 71 class Tokenizer(tokens.Tokenizer): 72 QUOTES = ["'", '"'] 73 COMMENTS = ["--", "#", ("/*", "*/")] 74 IDENTIFIERS = ["`"] 75 STRING_ESCAPES = ["'", '"', "\\"] 76 BIT_STRINGS = [("b'", "'"), ("B'", "'"), ("0b", "")] 77 HEX_STRINGS = [("x'", "'"), ("X'", "'"), ("0x", "")] 78 # https://dev.mysql.com/doc/refman/8.4/en/string-literals.html 79 ESCAPE_FOLLOW_CHARS = ["0", "b", "n", "r", "t", "Z", "%", "_"] 80 81 NESTED_COMMENTS = False 82 83 KEYWORDS = { 84 **tokens.Tokenizer.KEYWORDS, 85 "BLOB": TokenType.BLOB, 86 "CHARSET": TokenType.CHARACTER_SET, 87 "DISTINCTROW": TokenType.DISTINCT, 88 "EXPLAIN": TokenType.DESCRIBE, 89 "FORCE": TokenType.FORCE, 90 "IGNORE": TokenType.IGNORE, 91 "KEY": TokenType.KEY, 92 "LOCK TABLES": TokenType.COMMAND, 93 "LONGBLOB": TokenType.LONGBLOB, 94 "LONGTEXT": TokenType.LONGTEXT, 95 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 96 "MEDIUMINT": TokenType.MEDIUMINT, 97 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 98 "MEMBER OF": TokenType.MEMBER_OF, 99 "MOD": TokenType.MOD, 100 "SEPARATOR": TokenType.SEPARATOR, 101 "SERIAL": TokenType.SERIAL, 102 "SIGNED": TokenType.BIGINT, 103 "SIGNED INTEGER": TokenType.BIGINT, 104 "START": TokenType.BEGIN, 105 "TIMESTAMP": TokenType.TIMESTAMPTZ, 106 "TINYBLOB": TokenType.TINYBLOB, 107 "TINYTEXT": TokenType.TINYTEXT, 108 "UNLOCK TABLES": TokenType.COMMAND, 109 "UNSIGNED": TokenType.UBIGINT, 110 "UNSIGNED INTEGER": TokenType.UBIGINT, 111 "YEAR": TokenType.YEAR, 112 "_ARMSCII8": TokenType.INTRODUCER, 113 "_ASCII": TokenType.INTRODUCER, 114 "_BIG5": TokenType.INTRODUCER, 115 "_BINARY": TokenType.INTRODUCER, 116 "_CP1250": TokenType.INTRODUCER, 117 "_CP1251": TokenType.INTRODUCER, 118 "_CP1256": TokenType.INTRODUCER, 119 "_CP1257": TokenType.INTRODUCER, 120 "_CP850": TokenType.INTRODUCER, 121 "_CP852": TokenType.INTRODUCER, 122 "_CP866": TokenType.INTRODUCER, 123 "_CP932": TokenType.INTRODUCER, 124 "_DEC8": TokenType.INTRODUCER, 125 "_EUCJPMS": TokenType.INTRODUCER, 126 "_EUCKR": TokenType.INTRODUCER, 127 "_GB18030": TokenType.INTRODUCER, 128 "_GB2312": TokenType.INTRODUCER, 129 "_GBK": TokenType.INTRODUCER, 130 "_GEOSTD8": TokenType.INTRODUCER, 131 "_GREEK": TokenType.INTRODUCER, 132 "_HEBREW": TokenType.INTRODUCER, 133 "_HP8": TokenType.INTRODUCER, 134 "_KEYBCS2": TokenType.INTRODUCER, 135 "_KOI8R": TokenType.INTRODUCER, 136 "_KOI8U": TokenType.INTRODUCER, 137 "_LATIN1": TokenType.INTRODUCER, 138 "_LATIN2": TokenType.INTRODUCER, 139 "_LATIN5": TokenType.INTRODUCER, 140 "_LATIN7": TokenType.INTRODUCER, 141 "_MACCE": TokenType.INTRODUCER, 142 "_MACROMAN": TokenType.INTRODUCER, 143 "_SJIS": TokenType.INTRODUCER, 144 "_SWE7": TokenType.INTRODUCER, 145 "_TIS620": TokenType.INTRODUCER, 146 "_UCS2": TokenType.INTRODUCER, 147 "_UJIS": TokenType.INTRODUCER, 148 # https://dev.mysql.com/doc/refman/8.0/en/string-literals.html 149 "_UTF8": TokenType.INTRODUCER, 150 "_UTF16": TokenType.INTRODUCER, 151 "_UTF16LE": TokenType.INTRODUCER, 152 "_UTF32": TokenType.INTRODUCER, 153 "_UTF8MB3": TokenType.INTRODUCER, 154 "_UTF8MB4": TokenType.INTRODUCER, 155 "@@": TokenType.SESSION_PARAMETER, 156 } 157 158 COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.REPLACE} - {TokenType.SHOW} 159 160 Parser = MySQLParser 161 162 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.
A NULL arg in CONCAT_WS yields NULL by default, but in some dialects it is skipped.
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.
71 class Tokenizer(tokens.Tokenizer): 72 QUOTES = ["'", '"'] 73 COMMENTS = ["--", "#", ("/*", "*/")] 74 IDENTIFIERS = ["`"] 75 STRING_ESCAPES = ["'", '"', "\\"] 76 BIT_STRINGS = [("b'", "'"), ("B'", "'"), ("0b", "")] 77 HEX_STRINGS = [("x'", "'"), ("X'", "'"), ("0x", "")] 78 # https://dev.mysql.com/doc/refman/8.4/en/string-literals.html 79 ESCAPE_FOLLOW_CHARS = ["0", "b", "n", "r", "t", "Z", "%", "_"] 80 81 NESTED_COMMENTS = False 82 83 KEYWORDS = { 84 **tokens.Tokenizer.KEYWORDS, 85 "BLOB": TokenType.BLOB, 86 "CHARSET": TokenType.CHARACTER_SET, 87 "DISTINCTROW": TokenType.DISTINCT, 88 "EXPLAIN": TokenType.DESCRIBE, 89 "FORCE": TokenType.FORCE, 90 "IGNORE": TokenType.IGNORE, 91 "KEY": TokenType.KEY, 92 "LOCK TABLES": TokenType.COMMAND, 93 "LONGBLOB": TokenType.LONGBLOB, 94 "LONGTEXT": TokenType.LONGTEXT, 95 "MEDIUMBLOB": TokenType.MEDIUMBLOB, 96 "MEDIUMINT": TokenType.MEDIUMINT, 97 "MEDIUMTEXT": TokenType.MEDIUMTEXT, 98 "MEMBER OF": TokenType.MEMBER_OF, 99 "MOD": TokenType.MOD, 100 "SEPARATOR": TokenType.SEPARATOR, 101 "SERIAL": TokenType.SERIAL, 102 "SIGNED": TokenType.BIGINT, 103 "SIGNED INTEGER": TokenType.BIGINT, 104 "START": TokenType.BEGIN, 105 "TIMESTAMP": TokenType.TIMESTAMPTZ, 106 "TINYBLOB": TokenType.TINYBLOB, 107 "TINYTEXT": TokenType.TINYTEXT, 108 "UNLOCK TABLES": TokenType.COMMAND, 109 "UNSIGNED": TokenType.UBIGINT, 110 "UNSIGNED INTEGER": TokenType.UBIGINT, 111 "YEAR": TokenType.YEAR, 112 "_ARMSCII8": TokenType.INTRODUCER, 113 "_ASCII": TokenType.INTRODUCER, 114 "_BIG5": TokenType.INTRODUCER, 115 "_BINARY": TokenType.INTRODUCER, 116 "_CP1250": TokenType.INTRODUCER, 117 "_CP1251": TokenType.INTRODUCER, 118 "_CP1256": TokenType.INTRODUCER, 119 "_CP1257": TokenType.INTRODUCER, 120 "_CP850": TokenType.INTRODUCER, 121 "_CP852": TokenType.INTRODUCER, 122 "_CP866": TokenType.INTRODUCER, 123 "_CP932": TokenType.INTRODUCER, 124 "_DEC8": TokenType.INTRODUCER, 125 "_EUCJPMS": TokenType.INTRODUCER, 126 "_EUCKR": TokenType.INTRODUCER, 127 "_GB18030": TokenType.INTRODUCER, 128 "_GB2312": TokenType.INTRODUCER, 129 "_GBK": TokenType.INTRODUCER, 130 "_GEOSTD8": TokenType.INTRODUCER, 131 "_GREEK": TokenType.INTRODUCER, 132 "_HEBREW": TokenType.INTRODUCER, 133 "_HP8": TokenType.INTRODUCER, 134 "_KEYBCS2": TokenType.INTRODUCER, 135 "_KOI8R": TokenType.INTRODUCER, 136 "_KOI8U": TokenType.INTRODUCER, 137 "_LATIN1": TokenType.INTRODUCER, 138 "_LATIN2": TokenType.INTRODUCER, 139 "_LATIN5": TokenType.INTRODUCER, 140 "_LATIN7": TokenType.INTRODUCER, 141 "_MACCE": TokenType.INTRODUCER, 142 "_MACROMAN": TokenType.INTRODUCER, 143 "_SJIS": TokenType.INTRODUCER, 144 "_SWE7": TokenType.INTRODUCER, 145 "_TIS620": TokenType.INTRODUCER, 146 "_UCS2": TokenType.INTRODUCER, 147 "_UJIS": TokenType.INTRODUCER, 148 # https://dev.mysql.com/doc/refman/8.0/en/string-literals.html 149 "_UTF8": TokenType.INTRODUCER, 150 "_UTF16": TokenType.INTRODUCER, 151 "_UTF16LE": TokenType.INTRODUCER, 152 "_UTF32": TokenType.INTRODUCER, 153 "_UTF8MB3": TokenType.INTRODUCER, 154 "_UTF8MB4": TokenType.INTRODUCER, 155 "@@": TokenType.SESSION_PARAMETER, 156 } 157 158 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
- NUMERIC_ESCAPES
- DROP_UNKNOWN_ESCAPES
- HINT_START
- TOKENS_PRECEDING_HINT
- COMMAND_PREFIX_TOKENS
- NUMERIC_LITERALS
- NUMBERS_CAN_HAVE_DECIMALS
- dialect
- tokenize
- sql
- size
- tokens