From 98d5537435b2951b36c45f1fda667fa27c165794 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 3 May 2023 11:12:24 +0200 Subject: Adding upstream version 11.7.1. Signed-off-by: Daniel Baumann --- sqlglot/dialects/tsql.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'sqlglot/dialects/tsql.py') diff --git a/sqlglot/dialects/tsql.py b/sqlglot/dialects/tsql.py index b8a227b..9cf56e1 100644 --- a/sqlglot/dialects/tsql.py +++ b/sqlglot/dialects/tsql.py @@ -96,6 +96,23 @@ def _parse_eomonth(args): return exp.LastDateOfMonth(this=exp.DateAdd(this=date, expression=month_lag, unit=unit)) +def _parse_hashbytes(args): + kind, data = args + kind = kind.name.upper() if kind.is_string else "" + + if kind == "MD5": + args.pop(0) + return exp.MD5(this=data) + if kind in ("SHA", "SHA1"): + args.pop(0) + return exp.SHA(this=data) + if kind == "SHA2_256": + return exp.SHA2(this=data, length=exp.Literal.number(256)) + if kind == "SHA2_512": + return exp.SHA2(this=data, length=exp.Literal.number(512)) + return exp.func("HASHBYTES", *args) + + def generate_date_delta_with_unit_sql(self, e): func = "DATEADD" if isinstance(e, exp.DateAdd) else "DATEDIFF" return self.func(func, e.text("unit"), e.expression, e.this) @@ -266,6 +283,7 @@ class TSQL(Dialect): "UNIQUEIDENTIFIER": TokenType.UNIQUEIDENTIFIER, "VARCHAR(MAX)": TokenType.TEXT, "XML": TokenType.XML, + "SYSTEM_USER": TokenType.CURRENT_USER, } # TSQL allows @, # to appear as a variable/identifier prefix @@ -287,6 +305,7 @@ class TSQL(Dialect): "EOMONTH": _parse_eomonth, "FORMAT": _parse_format, "GETDATE": exp.CurrentTimestamp.from_arg_list, + "HASHBYTES": _parse_hashbytes, "IIF": exp.If.from_arg_list, "ISNULL": exp.Coalesce.from_arg_list, "JSON_VALUE": exp.JSONExtractScalar.from_arg_list, @@ -296,6 +315,14 @@ class TSQL(Dialect): "SYSDATETIME": exp.CurrentTimestamp.from_arg_list, "SUSER_NAME": exp.CurrentUser.from_arg_list, "SUSER_SNAME": exp.CurrentUser.from_arg_list, + "SYSTEM_USER": exp.CurrentUser.from_arg_list, + } + + JOIN_HINTS = { + "LOOP", + "HASH", + "MERGE", + "REMOTE", } VAR_LENGTH_DATATYPES = { @@ -441,11 +468,21 @@ class TSQL(Dialect): exp.TimeToStr: _format_sql, exp.GroupConcat: _string_agg_sql, exp.Max: max_or_greatest, + exp.MD5: lambda self, e: self.func("HASHBYTES", exp.Literal.string("MD5"), e.this), exp.Min: min_or_least, + exp.SHA: lambda self, e: self.func("HASHBYTES", exp.Literal.string("SHA1"), e.this), + exp.SHA2: lambda self, e: self.func( + "HASHBYTES", exp.Literal.string(f"SHA2_{e.args.get('length', 256)}"), e.this + ), } TRANSFORMS.pop(exp.ReturnsProperty) + PROPERTIES_LOCATION = { + **generator.Generator.PROPERTIES_LOCATION, # type: ignore + exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, + } + LIMIT_FETCH = "FETCH" def offset_sql(self, expression: exp.Offset) -> str: -- cgit v1.2.3