diff options
Diffstat (limited to 'sqlglot/dialects/mysql.py')
-rw-r--r-- | sqlglot/dialects/mysql.py | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/sqlglot/dialects/mysql.py b/sqlglot/dialects/mysql.py index 5f743ee..bae0e50 100644 --- a/sqlglot/dialects/mysql.py +++ b/sqlglot/dialects/mysql.py @@ -123,14 +123,15 @@ class MySQL(Dialect): KEYWORDS = { **tokens.Tokenizer.KEYWORDS, "CHARSET": TokenType.CHARACTER_SET, + "ENUM": TokenType.ENUM, "FORCE": TokenType.FORCE, "IGNORE": TokenType.IGNORE, "LONGBLOB": TokenType.LONGBLOB, "LONGTEXT": TokenType.LONGTEXT, "MEDIUMBLOB": TokenType.MEDIUMBLOB, "MEDIUMTEXT": TokenType.MEDIUMTEXT, + "MEMBER OF": TokenType.MEMBER_OF, "SEPARATOR": TokenType.SEPARATOR, - "ENUM": TokenType.ENUM, "START": TokenType.BEGIN, "SIGNED": TokenType.BIGINT, "SIGNED INTEGER": TokenType.BIGINT, @@ -185,11 +186,26 @@ class MySQL(Dialect): COMMANDS = tokens.Tokenizer.COMMANDS - {TokenType.SHOW} class Parser(parser.Parser): - FUNC_TOKENS = {*parser.Parser.FUNC_TOKENS, TokenType.SCHEMA, TokenType.DATABASE} + FUNC_TOKENS = { + *parser.Parser.FUNC_TOKENS, + TokenType.DATABASE, + TokenType.SCHEMA, + TokenType.VALUES, + } + TABLE_ALIAS_TOKENS = ( parser.Parser.TABLE_ALIAS_TOKENS - parser.Parser.TABLE_INDEX_HINT_TOKENS ) + RANGE_PARSERS = { + **parser.Parser.RANGE_PARSERS, + TokenType.MEMBER_OF: lambda self, this: self.expression( + exp.JSONArrayContains, + this=this, + expression=self._parse_wrapped(self._parse_expression), + ), + } + FUNCTIONS = { **parser.Parser.FUNCTIONS, "DATE_ADD": parse_date_delta_with_interval(exp.DateAdd), @@ -207,6 +223,10 @@ class MySQL(Dialect): this=self._parse_lambda(), separator=self._match(TokenType.SEPARATOR) and self._parse_field(), ), + # https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values + "VALUES": lambda self: self.expression( + exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()] + ), } STATEMENT_PARSERS = { @@ -399,6 +419,8 @@ class MySQL(Dialect): NULL_ORDERING_SUPPORTED = False JOIN_HINTS = False TABLE_HINTS = True + DUPLICATE_KEY_UPDATE_WITH_SET = False + QUERY_HINT_SEP = " " TRANSFORMS = { **generator.Generator.TRANSFORMS, @@ -445,6 +467,9 @@ class MySQL(Dialect): LIMIT_FETCH = "LIMIT" + def jsonarraycontains_sql(self, expression: exp.JSONArrayContains) -> str: + return f"{self.sql(expression, 'this')} MEMBER OF({self.sql(expression, 'expression')})" + def cast_sql(self, expression: exp.Cast, safe_prefix: t.Optional[str] = None) -> str: """(U)BIGINT is not allowed in a CAST expression, so we use (UN)SIGNED instead.""" if expression.to.this == exp.DataType.Type.BIGINT: |