diff options
Diffstat (limited to 'sqlglot/dialects/tsql.py')
-rw-r--r-- | sqlglot/dialects/tsql.py | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/sqlglot/dialects/tsql.py b/sqlglot/dialects/tsql.py index 0f93c75..a233d4b 100644 --- a/sqlglot/dialects/tsql.py +++ b/sqlglot/dialects/tsql.py @@ -1,15 +1,22 @@ +from __future__ import annotations + import re -from sqlglot import exp +from sqlglot import exp, generator, parser, tokens from sqlglot.dialects.dialect import Dialect, parse_date_delta, rename_func from sqlglot.expressions import DataType -from sqlglot.generator import Generator -from sqlglot.helper import list_get -from sqlglot.parser import Parser +from sqlglot.helper import seq_get from sqlglot.time import format_time -from sqlglot.tokens import Tokenizer, TokenType +from sqlglot.tokens import TokenType -FULL_FORMAT_TIME_MAPPING = {"weekday": "%A", "dw": "%A", "w": "%A", "month": "%B", "mm": "%B", "m": "%B"} +FULL_FORMAT_TIME_MAPPING = { + "weekday": "%A", + "dw": "%A", + "w": "%A", + "month": "%B", + "mm": "%B", + "m": "%B", +} DATE_DELTA_INTERVAL = { "year": "year", "yyyy": "year", @@ -37,11 +44,13 @@ TRANSPILE_SAFE_NUMBER_FMT = {"N", "C"} def tsql_format_time_lambda(exp_class, full_format_mapping=None, default=None): def _format_time(args): return exp_class( - this=list_get(args, 1), + this=seq_get(args, 1), format=exp.Literal.string( format_time( - list_get(args, 0).name or (TSQL.time_format if default is True else default), - {**TSQL.time_mapping, **FULL_FORMAT_TIME_MAPPING} if full_format_mapping else TSQL.time_mapping, + seq_get(args, 0).name or (TSQL.time_format if default is True else default), + {**TSQL.time_mapping, **FULL_FORMAT_TIME_MAPPING} + if full_format_mapping + else TSQL.time_mapping, ) ), ) @@ -50,12 +59,12 @@ def tsql_format_time_lambda(exp_class, full_format_mapping=None, default=None): def parse_format(args): - fmt = list_get(args, 1) + fmt = seq_get(args, 1) number_fmt = fmt.name in TRANSPILE_SAFE_NUMBER_FMT or not DATE_FMT_RE.search(fmt.this) if number_fmt: - return exp.NumberToStr(this=list_get(args, 0), format=fmt) + return exp.NumberToStr(this=seq_get(args, 0), format=fmt) return exp.TimeToStr( - this=list_get(args, 0), + this=seq_get(args, 0), format=exp.Literal.string( format_time(fmt.name, TSQL.format_time_mapping) if len(fmt.name) == 1 @@ -188,11 +197,11 @@ class TSQL(Dialect): "Y": "%a %Y", } - class Tokenizer(Tokenizer): + class Tokenizer(tokens.Tokenizer): IDENTIFIERS = ['"', ("[", "]")] KEYWORDS = { - **Tokenizer.KEYWORDS, + **tokens.Tokenizer.KEYWORDS, "BIT": TokenType.BOOLEAN, "REAL": TokenType.FLOAT, "NTEXT": TokenType.TEXT, @@ -200,7 +209,6 @@ class TSQL(Dialect): "DATETIME2": TokenType.DATETIME, "DATETIMEOFFSET": TokenType.TIMESTAMPTZ, "TIME": TokenType.TIMESTAMP, - "VARBINARY": TokenType.BINARY, "IMAGE": TokenType.IMAGE, "MONEY": TokenType.MONEY, "SMALLMONEY": TokenType.SMALLMONEY, @@ -213,9 +221,9 @@ class TSQL(Dialect): "TOP": TokenType.TOP, } - class Parser(Parser): + class Parser(parser.Parser): FUNCTIONS = { - **Parser.FUNCTIONS, + **parser.Parser.FUNCTIONS, "CHARINDEX": exp.StrPosition.from_arg_list, "ISNULL": exp.Coalesce.from_arg_list, "DATEADD": parse_date_delta(exp.DateAdd, unit_mapping=DATE_DELTA_INTERVAL), @@ -243,14 +251,16 @@ class TSQL(Dialect): this = self._parse_column() # Retrieve length of datatype and override to default if not specified - if list_get(to.expressions, 0) is None and to.this in self.VAR_LENGTH_DATATYPES: + if seq_get(to.expressions, 0) is None and to.this in self.VAR_LENGTH_DATATYPES: to = exp.DataType.build(to.this, expressions=[exp.Literal.number(30)], nested=False) # Check whether a conversion with format is applicable if self._match(TokenType.COMMA): format_val = self._parse_number().name if format_val not in TSQL.convert_format_mapping: - raise ValueError(f"CONVERT function at T-SQL does not support format style {format_val}") + raise ValueError( + f"CONVERT function at T-SQL does not support format style {format_val}" + ) format_norm = exp.Literal.string(TSQL.convert_format_mapping[format_val]) # Check whether the convert entails a string to date format @@ -272,9 +282,9 @@ class TSQL(Dialect): # Entails a simple cast without any format requirement return self.expression(exp.Cast if strict else exp.TryCast, this=this, to=to) - class Generator(Generator): + class Generator(generator.Generator): TYPE_MAPPING = { - **Generator.TYPE_MAPPING, + **generator.Generator.TYPE_MAPPING, exp.DataType.Type.BOOLEAN: "BIT", exp.DataType.Type.INT: "INTEGER", exp.DataType.Type.DECIMAL: "NUMERIC", @@ -283,7 +293,7 @@ class TSQL(Dialect): } TRANSFORMS = { - **Generator.TRANSFORMS, + **generator.Generator.TRANSFORMS, # type: ignore exp.DateAdd: generate_date_delta_with_unit_sql, exp.DateDiff: generate_date_delta_with_unit_sql, exp.CurrentDate: rename_func("GETDATE"), |