diff options
Diffstat (limited to 'sqlglot/dialects/mysql.py')
-rw-r--r-- | sqlglot/dialects/mysql.py | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/sqlglot/dialects/mysql.py b/sqlglot/dialects/mysql.py index 46e3f19..75660f8 100644 --- a/sqlglot/dialects/mysql.py +++ b/sqlglot/dialects/mysql.py @@ -6,8 +6,10 @@ from sqlglot import exp, generator, parser, tokens, transforms from sqlglot.dialects.dialect import ( Dialect, arrow_json_extract_scalar_sql, + date_add_interval_sql, datestrtodate_sql, format_time_lambda, + isnull_to_is_null, json_keyvalue_comma_sql, locate_to_strposition, max_or_greatest, @@ -99,6 +101,7 @@ class MySQL(Dialect): TIME_FORMAT = "'%Y-%m-%d %T'" DPIPE_IS_STRING_CONCAT = False + SUPPORTS_USER_DEFINED_TYPES = False # https://prestodb.io/docs/current/functions/datetime.html#mysql-date-functions TIME_MAPPING = { @@ -129,6 +132,7 @@ class MySQL(Dialect): "ENUM": TokenType.ENUM, "FORCE": TokenType.FORCE, "IGNORE": TokenType.IGNORE, + "LOCK TABLES": TokenType.COMMAND, "LONGBLOB": TokenType.LONGBLOB, "LONGTEXT": TokenType.LONGTEXT, "MEDIUMBLOB": TokenType.MEDIUMBLOB, @@ -141,6 +145,7 @@ class MySQL(Dialect): "START": TokenType.BEGIN, "SIGNED": TokenType.BIGINT, "SIGNED INTEGER": TokenType.BIGINT, + "UNLOCK TABLES": TokenType.COMMAND, "UNSIGNED": TokenType.UBIGINT, "UNSIGNED INTEGER": TokenType.UBIGINT, "YEAR": TokenType.YEAR, @@ -193,8 +198,6 @@ class MySQL(Dialect): COMMANDS = tokens.Tokenizer.COMMANDS - {TokenType.SHOW} class Parser(parser.Parser): - SUPPORTS_USER_DEFINED_TYPES = False - FUNC_TOKENS = { *parser.Parser.FUNC_TOKENS, TokenType.DATABASE, @@ -233,7 +236,12 @@ class MySQL(Dialect): "DATE_FORMAT": format_time_lambda(exp.TimeToStr, "mysql"), "DATE_SUB": parse_date_delta_with_interval(exp.DateSub), "INSTR": lambda args: exp.StrPosition(substr=seq_get(args, 1), this=seq_get(args, 0)), + "ISNULL": isnull_to_is_null, "LOCATE": locate_to_strposition, + "MONTHNAME": lambda args: exp.TimeToStr( + this=seq_get(args, 0), + format=exp.Literal.string("%B"), + ), "STR_TO_DATE": _str_to_date, } @@ -374,7 +382,7 @@ class MySQL(Dialect): self._match_texts({"INDEX", "KEY"}) this = self._parse_id_var(any_token=False) - type_ = self._match(TokenType.USING) and self._advance_any() and self._prev.text + index_type = self._match(TokenType.USING) and self._advance_any() and self._prev.text schema = self._parse_schema() options = [] @@ -414,7 +422,7 @@ class MySQL(Dialect): this=this, schema=schema, kind=kind, - type=type_, + index_type=index_type, options=options, ) @@ -558,6 +566,8 @@ class MySQL(Dialect): exp.StrToTime: _str_to_date_sql, exp.Stuff: rename_func("INSERT"), exp.TableSample: no_tablesample_sql, + exp.TimestampAdd: date_add_interval_sql("DATE", "ADD"), + exp.TimestampSub: date_add_interval_sql("DATE", "SUB"), exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), exp.TimeStrToTime: lambda self, e: self.sql(exp.cast(e.this, "datetime", copy=True)), exp.TimeToStr: lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)), |