sqlglot.dialects.tsql
1from __future__ import annotations 2 3from sqlglot import tokens 4from sqlglot.dialects.dialect import ( 5 Dialect, 6 NormalizationStrategy, 7) 8from sqlglot.generators.tsql import TSQLGenerator 9from sqlglot.parsers.tsql import TSQLParser 10from sqlglot.tokens import TokenType 11from sqlglot.typing.tsql import EXPRESSION_METADATA 12 13 14class TSQL(Dialect): 15 # Week truncation follows @@DATEFIRST, which defaults to 7 (Sunday) 16 WEEK_OFFSET = -1 17 18 LOG_BASE_FIRST = False 19 TYPED_DIVISION = True 20 CONCAT_COALESCE = True 21 CONCAT_WS_COALESCE = True 22 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 23 ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMN = False 24 25 TIME_FORMAT = "'yyyy-mm-dd hh:mm:ss'" 26 27 EXPRESSION_METADATA = EXPRESSION_METADATA.copy() 28 29 DATE_PART_MAPPING = { 30 **Dialect.DATE_PART_MAPPING, 31 "QQ": "QUARTER", 32 "M": "MONTH", 33 "Y": "DAYOFYEAR", 34 "WW": "WEEK", 35 "N": "MINUTE", 36 "SS": "SECOND", 37 "MCS": "MICROSECOND", 38 "TZOFFSET": "TIMEZONE_MINUTE", 39 "TZ": "TIMEZONE_MINUTE", 40 "ISO_WEEK": "WEEKISO", 41 "ISOWK": "WEEKISO", 42 "ISOWW": "WEEKISO", 43 } 44 45 TIME_MAPPING = { 46 "year": "%Y", 47 "dayofyear": "%j", 48 "day": "%d", 49 "dy": "%d", 50 "y": "%Y", 51 "week": "%W", 52 "ww": "%W", 53 "wk": "%W", 54 "isowk": "%V", 55 "isoww": "%V", 56 "iso_week": "%V", 57 "hour": "%h", 58 "hh": "%I", 59 "minute": "%M", 60 "mi": "%M", 61 "n": "%M", 62 "second": "%S", 63 "ss": "%S", 64 "s": "%-S", 65 "millisecond": "%f", 66 "ms": "%f", 67 "weekday": "%w", 68 "dw": "%w", 69 "month": "%m", 70 "mm": "%M", 71 "m": "%-M", 72 "Y": "%Y", 73 "YYYY": "%Y", 74 "YY": "%y", 75 "MMMM": "%B", 76 "MMM": "%b", 77 "MM": "%m", 78 "M": "%-m", 79 "dddd": "%A", 80 "dd": "%d", 81 "d": "%-d", 82 "HH": "%H", 83 "H": "%-H", 84 "h": "%-I", 85 "ffffff": "%f", 86 "yyyy": "%Y", 87 "yy": "%y", 88 } 89 90 CONVERT_FORMAT_MAPPING = { 91 "0": "%b %d %Y %-I:%M%p", 92 "1": "%m/%d/%y", 93 "2": "%y.%m.%d", 94 "3": "%d/%m/%y", 95 "4": "%d.%m.%y", 96 "5": "%d-%m-%y", 97 "6": "%d %b %y", 98 "7": "%b %d, %y", 99 "8": "%H:%M:%S", 100 "9": "%b %d %Y %-I:%M:%S:%f%p", 101 "10": "mm-dd-yy", 102 "11": "yy/mm/dd", 103 "12": "yymmdd", 104 "13": "%d %b %Y %H:%M:ss:%f", 105 "14": "%H:%M:%S:%f", 106 "20": "%Y-%m-%d %H:%M:%S", 107 "21": "%Y-%m-%d %H:%M:%S.%f", 108 "22": "%m/%d/%y %-I:%M:%S %p", 109 "23": "%Y-%m-%d", 110 "24": "%H:%M:%S", 111 "25": "%Y-%m-%d %H:%M:%S.%f", 112 "100": "%b %d %Y %-I:%M%p", 113 "101": "%m/%d/%Y", 114 "102": "%Y.%m.%d", 115 "103": "%d/%m/%Y", 116 "104": "%d.%m.%Y", 117 "105": "%d-%m-%Y", 118 "106": "%d %b %Y", 119 "107": "%b %d, %Y", 120 "108": "%H:%M:%S", 121 "109": "%b %d %Y %-I:%M:%S:%f%p", 122 "110": "%m-%d-%Y", 123 "111": "%Y/%m/%d", 124 "112": "%Y%m%d", 125 "113": "%d %b %Y %H:%M:%S:%f", 126 "114": "%H:%M:%S:%f", 127 "120": "%Y-%m-%d %H:%M:%S", 128 "121": "%Y-%m-%d %H:%M:%S.%f", 129 "126": "%Y-%m-%dT%H:%M:%S.%f", 130 } 131 132 FORMAT_TIME_MAPPING = { 133 "y": "%B %Y", 134 "d": "%m/%d/%Y", 135 "H": "%-H", 136 "h": "%-I", 137 "s": "%Y-%m-%d %H:%M:%S", 138 "D": "%A,%B,%Y", 139 "f": "%A,%B,%Y %-I:%M %p", 140 "F": "%A,%B,%Y %-I:%M:%S %p", 141 "g": "%m/%d/%Y %-I:%M %p", 142 "G": "%m/%d/%Y %-I:%M:%S %p", 143 "M": "%B %-d", 144 "m": "%B %-d", 145 "O": "%Y-%m-%dT%H:%M:%S", 146 "u": "%Y-%M-%D %H:%M:%S%z", 147 "U": "%A, %B %D, %Y %H:%M:%S%z", 148 "T": "%-I:%M:%S %p", 149 "t": "%-I:%M", 150 "Y": "%a %Y", 151 } 152 153 class Tokenizer(tokens.Tokenizer): 154 IDENTIFIERS = [("[", "]"), '"'] 155 QUOTES = ["'", '"'] 156 HEX_STRINGS = [("0x", ""), ("0X", "")] 157 VAR_SINGLE_TOKENS = {"@", "$", "#"} 158 159 KEYWORDS = { 160 **tokens.Tokenizer.KEYWORDS, 161 "CLUSTERED INDEX": TokenType.INDEX, 162 "DATETIME2": TokenType.DATETIME2, 163 "DATETIMEOFFSET": TokenType.TIMESTAMPTZ, 164 "DECLARE": TokenType.DECLARE, 165 "EXEC": TokenType.EXECUTE, 166 "GO": TokenType.COMMAND, 167 "IMAGE": TokenType.IMAGE, 168 "MONEY": TokenType.MONEY, 169 "NONCLUSTERED INDEX": TokenType.INDEX, 170 "NTEXT": TokenType.TEXT, 171 "OPTION": TokenType.OPTION, 172 "OUTPUT": TokenType.RETURNING, 173 "PRINT": TokenType.COMMAND, 174 "PROC": TokenType.PROCEDURE, 175 "REAL": TokenType.FLOAT, 176 "ROWVERSION": TokenType.ROWVERSION, 177 "SMALLDATETIME": TokenType.SMALLDATETIME, 178 "SMALLMONEY": TokenType.SMALLMONEY, 179 "SQL_VARIANT": TokenType.VARIANT, 180 "SYSTEM_USER": TokenType.CURRENT_USER, 181 "TOP": TokenType.TOP, 182 "TIMESTAMP": TokenType.ROWVERSION, 183 "TINYINT": TokenType.UTINYINT, 184 "UNIQUEIDENTIFIER": TokenType.UUID, 185 "UPDATE STATISTICS": TokenType.COMMAND, 186 "XML": TokenType.XML, 187 } 188 KEYWORDS.pop("/*+") 189 190 COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.END} - {TokenType.EXECUTE} 191 192 Parser = TSQLParser 193 194 Generator = TSQLGenerator
15class TSQL(Dialect): 16 # Week truncation follows @@DATEFIRST, which defaults to 7 (Sunday) 17 WEEK_OFFSET = -1 18 19 LOG_BASE_FIRST = False 20 TYPED_DIVISION = True 21 CONCAT_COALESCE = True 22 CONCAT_WS_COALESCE = True 23 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 24 ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMN = False 25 26 TIME_FORMAT = "'yyyy-mm-dd hh:mm:ss'" 27 28 EXPRESSION_METADATA = EXPRESSION_METADATA.copy() 29 30 DATE_PART_MAPPING = { 31 **Dialect.DATE_PART_MAPPING, 32 "QQ": "QUARTER", 33 "M": "MONTH", 34 "Y": "DAYOFYEAR", 35 "WW": "WEEK", 36 "N": "MINUTE", 37 "SS": "SECOND", 38 "MCS": "MICROSECOND", 39 "TZOFFSET": "TIMEZONE_MINUTE", 40 "TZ": "TIMEZONE_MINUTE", 41 "ISO_WEEK": "WEEKISO", 42 "ISOWK": "WEEKISO", 43 "ISOWW": "WEEKISO", 44 } 45 46 TIME_MAPPING = { 47 "year": "%Y", 48 "dayofyear": "%j", 49 "day": "%d", 50 "dy": "%d", 51 "y": "%Y", 52 "week": "%W", 53 "ww": "%W", 54 "wk": "%W", 55 "isowk": "%V", 56 "isoww": "%V", 57 "iso_week": "%V", 58 "hour": "%h", 59 "hh": "%I", 60 "minute": "%M", 61 "mi": "%M", 62 "n": "%M", 63 "second": "%S", 64 "ss": "%S", 65 "s": "%-S", 66 "millisecond": "%f", 67 "ms": "%f", 68 "weekday": "%w", 69 "dw": "%w", 70 "month": "%m", 71 "mm": "%M", 72 "m": "%-M", 73 "Y": "%Y", 74 "YYYY": "%Y", 75 "YY": "%y", 76 "MMMM": "%B", 77 "MMM": "%b", 78 "MM": "%m", 79 "M": "%-m", 80 "dddd": "%A", 81 "dd": "%d", 82 "d": "%-d", 83 "HH": "%H", 84 "H": "%-H", 85 "h": "%-I", 86 "ffffff": "%f", 87 "yyyy": "%Y", 88 "yy": "%y", 89 } 90 91 CONVERT_FORMAT_MAPPING = { 92 "0": "%b %d %Y %-I:%M%p", 93 "1": "%m/%d/%y", 94 "2": "%y.%m.%d", 95 "3": "%d/%m/%y", 96 "4": "%d.%m.%y", 97 "5": "%d-%m-%y", 98 "6": "%d %b %y", 99 "7": "%b %d, %y", 100 "8": "%H:%M:%S", 101 "9": "%b %d %Y %-I:%M:%S:%f%p", 102 "10": "mm-dd-yy", 103 "11": "yy/mm/dd", 104 "12": "yymmdd", 105 "13": "%d %b %Y %H:%M:ss:%f", 106 "14": "%H:%M:%S:%f", 107 "20": "%Y-%m-%d %H:%M:%S", 108 "21": "%Y-%m-%d %H:%M:%S.%f", 109 "22": "%m/%d/%y %-I:%M:%S %p", 110 "23": "%Y-%m-%d", 111 "24": "%H:%M:%S", 112 "25": "%Y-%m-%d %H:%M:%S.%f", 113 "100": "%b %d %Y %-I:%M%p", 114 "101": "%m/%d/%Y", 115 "102": "%Y.%m.%d", 116 "103": "%d/%m/%Y", 117 "104": "%d.%m.%Y", 118 "105": "%d-%m-%Y", 119 "106": "%d %b %Y", 120 "107": "%b %d, %Y", 121 "108": "%H:%M:%S", 122 "109": "%b %d %Y %-I:%M:%S:%f%p", 123 "110": "%m-%d-%Y", 124 "111": "%Y/%m/%d", 125 "112": "%Y%m%d", 126 "113": "%d %b %Y %H:%M:%S:%f", 127 "114": "%H:%M:%S:%f", 128 "120": "%Y-%m-%d %H:%M:%S", 129 "121": "%Y-%m-%d %H:%M:%S.%f", 130 "126": "%Y-%m-%dT%H:%M:%S.%f", 131 } 132 133 FORMAT_TIME_MAPPING = { 134 "y": "%B %Y", 135 "d": "%m/%d/%Y", 136 "H": "%-H", 137 "h": "%-I", 138 "s": "%Y-%m-%d %H:%M:%S", 139 "D": "%A,%B,%Y", 140 "f": "%A,%B,%Y %-I:%M %p", 141 "F": "%A,%B,%Y %-I:%M:%S %p", 142 "g": "%m/%d/%Y %-I:%M %p", 143 "G": "%m/%d/%Y %-I:%M:%S %p", 144 "M": "%B %-d", 145 "m": "%B %-d", 146 "O": "%Y-%m-%dT%H:%M:%S", 147 "u": "%Y-%M-%D %H:%M:%S%z", 148 "U": "%A, %B %D, %Y %H:%M:%S%z", 149 "T": "%-I:%M:%S %p", 150 "t": "%-I:%M", 151 "Y": "%a %Y", 152 } 153 154 class Tokenizer(tokens.Tokenizer): 155 IDENTIFIERS = [("[", "]"), '"'] 156 QUOTES = ["'", '"'] 157 HEX_STRINGS = [("0x", ""), ("0X", "")] 158 VAR_SINGLE_TOKENS = {"@", "$", "#"} 159 160 KEYWORDS = { 161 **tokens.Tokenizer.KEYWORDS, 162 "CLUSTERED INDEX": TokenType.INDEX, 163 "DATETIME2": TokenType.DATETIME2, 164 "DATETIMEOFFSET": TokenType.TIMESTAMPTZ, 165 "DECLARE": TokenType.DECLARE, 166 "EXEC": TokenType.EXECUTE, 167 "GO": TokenType.COMMAND, 168 "IMAGE": TokenType.IMAGE, 169 "MONEY": TokenType.MONEY, 170 "NONCLUSTERED INDEX": TokenType.INDEX, 171 "NTEXT": TokenType.TEXT, 172 "OPTION": TokenType.OPTION, 173 "OUTPUT": TokenType.RETURNING, 174 "PRINT": TokenType.COMMAND, 175 "PROC": TokenType.PROCEDURE, 176 "REAL": TokenType.FLOAT, 177 "ROWVERSION": TokenType.ROWVERSION, 178 "SMALLDATETIME": TokenType.SMALLDATETIME, 179 "SMALLMONEY": TokenType.SMALLMONEY, 180 "SQL_VARIANT": TokenType.VARIANT, 181 "SYSTEM_USER": TokenType.CURRENT_USER, 182 "TOP": TokenType.TOP, 183 "TIMESTAMP": TokenType.ROWVERSION, 184 "TINYINT": TokenType.UTINYINT, 185 "UNIQUEIDENTIFIER": TokenType.UUID, 186 "UPDATE STATISTICS": TokenType.COMMAND, 187 "XML": TokenType.XML, 188 } 189 KEYWORDS.pop("/*+") 190 191 COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.END} - {TokenType.EXECUTE} 192 193 Parser = TSQLParser 194 195 Generator = TSQLGenerator
First day of the week in DATE_TRUNC(week). Defaults to 0 (Monday). -1 would be Sunday.
Whether the base comes first in the LOG function.
Possible values: True, False, None (two arguments are not supported by LOG)
Whether the behavior of a / b depends on the types of a and b.
False means a / b is always float division.
True means a / b is integer division if both a and b are integers.
A NULL arg in CONCAT yields NULL by default, but in some dialects it yields an empty string.
A NULL arg in CONCAT_WS yields NULL by default, but in some dialects it is skipped.
Specifies the strategy according to which identifiers should be normalized.
Associates this dialect's time formats with their equivalent Python strftime formats.
Whether string literals support escape sequences (e.g. \n). Set by the metaclass based on the tokenizer's STRING_ESCAPES.
Whether byte string literals support escape sequences. Set by the metaclass based on the tokenizer's BYTE_STRING_ESCAPES.
154 class Tokenizer(tokens.Tokenizer): 155 IDENTIFIERS = [("[", "]"), '"'] 156 QUOTES = ["'", '"'] 157 HEX_STRINGS = [("0x", ""), ("0X", "")] 158 VAR_SINGLE_TOKENS = {"@", "$", "#"} 159 160 KEYWORDS = { 161 **tokens.Tokenizer.KEYWORDS, 162 "CLUSTERED INDEX": TokenType.INDEX, 163 "DATETIME2": TokenType.DATETIME2, 164 "DATETIMEOFFSET": TokenType.TIMESTAMPTZ, 165 "DECLARE": TokenType.DECLARE, 166 "EXEC": TokenType.EXECUTE, 167 "GO": TokenType.COMMAND, 168 "IMAGE": TokenType.IMAGE, 169 "MONEY": TokenType.MONEY, 170 "NONCLUSTERED INDEX": TokenType.INDEX, 171 "NTEXT": TokenType.TEXT, 172 "OPTION": TokenType.OPTION, 173 "OUTPUT": TokenType.RETURNING, 174 "PRINT": TokenType.COMMAND, 175 "PROC": TokenType.PROCEDURE, 176 "REAL": TokenType.FLOAT, 177 "ROWVERSION": TokenType.ROWVERSION, 178 "SMALLDATETIME": TokenType.SMALLDATETIME, 179 "SMALLMONEY": TokenType.SMALLMONEY, 180 "SQL_VARIANT": TokenType.VARIANT, 181 "SYSTEM_USER": TokenType.CURRENT_USER, 182 "TOP": TokenType.TOP, 183 "TIMESTAMP": TokenType.ROWVERSION, 184 "TINYINT": TokenType.UTINYINT, 185 "UNIQUEIDENTIFIER": TokenType.UUID, 186 "UPDATE STATISTICS": TokenType.COMMAND, 187 "XML": TokenType.XML, 188 } 189 KEYWORDS.pop("/*+") 190 191 COMMANDS = {*tokens.Tokenizer.COMMANDS, TokenType.END} - {TokenType.EXECUTE}
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- SINGLE_TOKENS
- BIT_STRINGS
- BYTE_STRINGS
- RAW_STRINGS
- HEREDOC_STRINGS
- UNICODE_STRINGS
- STRING_ESCAPES
- ESCAPE_FOLLOW_CHARS
- IDENTIFIER_ESCAPES
- HEREDOC_TAG_IS_IDENTIFIER
- HEREDOC_STRING_ALTERNATIVE
- STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS
- NESTED_COMMENTS
- HINT_START
- TOKENS_PRECEDING_HINT
- COMMAND_PREFIX_TOKENS
- NUMERIC_LITERALS
- NUMBERS_CAN_HAVE_DECIMALS
- COMMENTS
- dialect
- tokenize
- sql
- size
- tokens