From 67c28dbe67209effad83d93b850caba5ee1e20e3 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 3 May 2023 11:12:28 +0200 Subject: Merging upstream version 11.7.1. Signed-off-by: Daniel Baumann --- sqlglot/dialects/mysql.py | 63 +++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 32 deletions(-) (limited to 'sqlglot/dialects/mysql.py') diff --git a/sqlglot/dialects/mysql.py b/sqlglot/dialects/mysql.py index d64efbf..666e740 100644 --- a/sqlglot/dialects/mysql.py +++ b/sqlglot/dialects/mysql.py @@ -4,6 +4,8 @@ from sqlglot import exp, generator, parser, tokens from sqlglot.dialects.dialect import ( Dialect, arrow_json_extract_scalar_sql, + datestrtodate_sql, + format_time_lambda, locate_to_strposition, max_or_greatest, min_or_least, @@ -11,6 +13,7 @@ from sqlglot.dialects.dialect import ( no_paren_current_date_sql, no_tablesample_sql, no_trycast_sql, + parse_date_delta_with_interval, rename_func, strposition_to_locate_sql, ) @@ -76,18 +79,6 @@ def _trim_sql(self, expression): return f"TRIM({trim_type}{remove_chars}{from_part}{target})" -def _date_add(expression_class): - def func(args): - interval = seq_get(args, 1) - return expression_class( - this=seq_get(args, 0), - expression=interval.this, - unit=exp.Literal.string(interval.text("unit").lower()), - ) - - return func - - def _date_add_sql(kind): def func(self, expression): this = self.sql(expression, "this") @@ -115,6 +106,7 @@ class MySQL(Dialect): "%k": "%-H", "%l": "%-I", "%T": "%H:%M:%S", + "%W": "%a", } class Tokenizer(tokens.Tokenizer): @@ -127,12 +119,13 @@ class MySQL(Dialect): KEYWORDS = { **tokens.Tokenizer.KEYWORDS, - "MEDIUMTEXT": TokenType.MEDIUMTEXT, + "CHARSET": TokenType.CHARACTER_SET, + "LONGBLOB": TokenType.LONGBLOB, "LONGTEXT": TokenType.LONGTEXT, "MEDIUMBLOB": TokenType.MEDIUMBLOB, - "LONGBLOB": TokenType.LONGBLOB, - "START": TokenType.BEGIN, + "MEDIUMTEXT": TokenType.MEDIUMTEXT, "SEPARATOR": TokenType.SEPARATOR, + "START": TokenType.BEGIN, "_ARMSCII8": TokenType.INTRODUCER, "_ASCII": TokenType.INTRODUCER, "_BIG5": TokenType.INTRODUCER, @@ -186,14 +179,15 @@ class MySQL(Dialect): FUNCTIONS = { **parser.Parser.FUNCTIONS, # type: ignore - "DATE_ADD": _date_add(exp.DateAdd), - "DATE_SUB": _date_add(exp.DateSub), - "STR_TO_DATE": _str_to_date, - "LOCATE": locate_to_strposition, + "DATE_ADD": parse_date_delta_with_interval(exp.DateAdd), + "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)), "LEFT": lambda args: exp.Substring( this=seq_get(args, 0), start=exp.Literal.number(1), length=seq_get(args, 1) ), + "LOCATE": locate_to_strposition, + "STR_TO_DATE": _str_to_date, } FUNCTION_PARSERS = { @@ -388,32 +382,36 @@ class MySQL(Dialect): class Generator(generator.Generator): LOCKING_READS_SUPPORTED = True NULL_ORDERING_SUPPORTED = False + JOIN_HINTS = False + TABLE_HINTS = False TRANSFORMS = { **generator.Generator.TRANSFORMS, # type: ignore exp.CurrentDate: no_paren_current_date_sql, - exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", - exp.ILike: no_ilike_sql, - exp.JSONExtractScalar: arrow_json_extract_scalar_sql, - exp.Max: max_or_greatest, - exp.Min: min_or_least, - exp.TableSample: no_tablesample_sql, - exp.TryCast: no_trycast_sql, + exp.DateDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression), exp.DateAdd: _date_add_sql("ADD"), - exp.DateDiff: lambda self, e: f"DATEDIFF({self.format_args(e.this, e.expression)})", + exp.DateStrToDate: datestrtodate_sql, exp.DateSub: _date_add_sql("SUB"), exp.DateTrunc: _date_trunc_sql, - exp.DayOfWeek: rename_func("DAYOFWEEK"), exp.DayOfMonth: rename_func("DAYOFMONTH"), + exp.DayOfWeek: rename_func("DAYOFWEEK"), exp.DayOfYear: rename_func("DAYOFYEAR"), - exp.WeekOfYear: rename_func("WEEKOFYEAR"), exp.GroupConcat: lambda self, e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""", - exp.StrToDate: _str_to_date_sql, - exp.StrToTime: _str_to_date_sql, - exp.Trim: _trim_sql, + exp.ILike: no_ilike_sql, + exp.JSONExtractScalar: arrow_json_extract_scalar_sql, + exp.Max: max_or_greatest, + exp.Min: min_or_least, exp.NullSafeEQ: lambda self, e: self.binary(e, "<=>"), exp.NullSafeNEQ: lambda self, e: self.not_sql(self.binary(e, "<=>")), exp.StrPosition: strposition_to_locate_sql, + exp.StrToDate: _str_to_date_sql, + exp.StrToTime: _str_to_date_sql, + exp.TableSample: no_tablesample_sql, + exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), + exp.TimeToStr: lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)), + exp.Trim: _trim_sql, + exp.TryCast: no_trycast_sql, + exp.WeekOfYear: rename_func("WEEKOFYEAR"), } TYPE_MAPPING = generator.Generator.TYPE_MAPPING.copy() @@ -425,6 +423,7 @@ class MySQL(Dialect): PROPERTIES_LOCATION = { **generator.Generator.PROPERTIES_LOCATION, # type: ignore exp.TransientProperty: exp.Properties.Location.UNSUPPORTED, + exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, } LIMIT_FETCH = "LIMIT" -- cgit v1.2.3