sqlglot.dialects.hive
1from __future__ import annotations 2 3import typing as t 4from functools import partial 5 6from sqlglot import exp, generator, parser, tokens, transforms 7from sqlglot.dialects.dialect import ( 8 DATE_ADD_OR_SUB, 9 Dialect, 10 NormalizationStrategy, 11 approx_count_distinct_sql, 12 arg_max_or_min_no_count, 13 datestrtodate_sql, 14 build_formatted_time, 15 if_sql, 16 is_parse_json, 17 left_to_substring_sql, 18 locate_to_strposition, 19 max_or_greatest, 20 min_or_least, 21 no_ilike_sql, 22 no_recursive_cte_sql, 23 no_safe_divide_sql, 24 no_trycast_sql, 25 regexp_extract_sql, 26 regexp_replace_sql, 27 rename_func, 28 right_to_substring_sql, 29 strposition_to_locate_sql, 30 struct_extract_sql, 31 time_format, 32 timestrtotime_sql, 33 unit_to_str, 34 var_map_sql, 35 sequence_sql, 36 property_sql, 37 build_regexp_extract, 38) 39from sqlglot.transforms import ( 40 remove_unique_constraints, 41 ctas_with_tmp_tables_to_create_tmp_view, 42 preprocess, 43 move_schema_columns_to_partitioned_by, 44) 45from sqlglot.helper import seq_get 46from sqlglot.tokens import TokenType 47from sqlglot.generator import unsupported_args 48 49# (FuncType, Multiplier) 50DATE_DELTA_INTERVAL = { 51 "YEAR": ("ADD_MONTHS", 12), 52 "MONTH": ("ADD_MONTHS", 1), 53 "QUARTER": ("ADD_MONTHS", 3), 54 "WEEK": ("DATE_ADD", 7), 55 "DAY": ("DATE_ADD", 1), 56} 57 58TIME_DIFF_FACTOR = { 59 "MILLISECOND": " * 1000", 60 "SECOND": "", 61 "MINUTE": " / 60", 62 "HOUR": " / 3600", 63} 64 65DIFF_MONTH_SWITCH = ("YEAR", "QUARTER", "MONTH") 66 67 68def _add_date_sql(self: Hive.Generator, expression: DATE_ADD_OR_SUB) -> str: 69 if isinstance(expression, exp.TsOrDsAdd) and not expression.unit: 70 return self.func("DATE_ADD", expression.this, expression.expression) 71 72 unit = expression.text("unit").upper() 73 func, multiplier = DATE_DELTA_INTERVAL.get(unit, ("DATE_ADD", 1)) 74 75 if isinstance(expression, exp.DateSub): 76 multiplier *= -1 77 78 if expression.expression.is_number: 79 modified_increment = exp.Literal.number(expression.expression.to_py() * multiplier) 80 else: 81 modified_increment = expression.expression 82 if multiplier != 1: 83 modified_increment = exp.Mul( # type: ignore 84 this=modified_increment, expression=exp.Literal.number(multiplier) 85 ) 86 87 return self.func(func, expression.this, modified_increment) 88 89 90def _date_diff_sql(self: Hive.Generator, expression: exp.DateDiff | exp.TsOrDsDiff) -> str: 91 unit = expression.text("unit").upper() 92 93 factor = TIME_DIFF_FACTOR.get(unit) 94 if factor is not None: 95 left = self.sql(expression, "this") 96 right = self.sql(expression, "expression") 97 sec_diff = f"UNIX_TIMESTAMP({left}) - UNIX_TIMESTAMP({right})" 98 return f"({sec_diff}){factor}" if factor else sec_diff 99 100 months_between = unit in DIFF_MONTH_SWITCH 101 sql_func = "MONTHS_BETWEEN" if months_between else "DATEDIFF" 102 _, multiplier = DATE_DELTA_INTERVAL.get(unit, ("", 1)) 103 multiplier_sql = f" / {multiplier}" if multiplier > 1 else "" 104 diff_sql = f"{sql_func}({self.format_args(expression.this, expression.expression)})" 105 106 if months_between or multiplier_sql: 107 # MONTHS_BETWEEN returns a float, so we need to truncate the fractional part. 108 # For the same reason, we want to truncate if there's a divisor present. 109 diff_sql = f"CAST({diff_sql}{multiplier_sql} AS INT)" 110 111 return diff_sql 112 113 114def _json_format_sql(self: Hive.Generator, expression: exp.JSONFormat) -> str: 115 this = expression.this 116 117 if is_parse_json(this): 118 if this.this.is_string: 119 # Since FROM_JSON requires a nested type, we always wrap the json string with 120 # an array to ensure that "naked" strings like "'a'" will be handled correctly 121 wrapped_json = exp.Literal.string(f"[{this.this.name}]") 122 123 from_json = self.func( 124 "FROM_JSON", wrapped_json, self.func("SCHEMA_OF_JSON", wrapped_json) 125 ) 126 to_json = self.func("TO_JSON", from_json) 127 128 # This strips the [, ] delimiters of the dummy array printed by TO_JSON 129 return self.func("REGEXP_EXTRACT", to_json, "'^.(.*).$'", "1") 130 return self.sql(this) 131 132 return self.func("TO_JSON", this, expression.args.get("options")) 133 134 135@generator.unsupported_args(("expression", "Hive's SORT_ARRAY does not support a comparator.")) 136def _array_sort_sql(self: Hive.Generator, expression: exp.ArraySort) -> str: 137 return self.func("SORT_ARRAY", expression.this) 138 139 140def _str_to_unix_sql(self: Hive.Generator, expression: exp.StrToUnix) -> str: 141 return self.func("UNIX_TIMESTAMP", expression.this, time_format("hive")(self, expression)) 142 143 144def _unix_to_time_sql(self: Hive.Generator, expression: exp.UnixToTime) -> str: 145 timestamp = self.sql(expression, "this") 146 scale = expression.args.get("scale") 147 if scale in (None, exp.UnixToTime.SECONDS): 148 return rename_func("FROM_UNIXTIME")(self, expression) 149 150 return f"FROM_UNIXTIME({timestamp} / POW(10, {scale}))" 151 152 153def _str_to_date_sql(self: Hive.Generator, expression: exp.StrToDate) -> str: 154 this = self.sql(expression, "this") 155 time_format = self.format_time(expression) 156 if time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 157 this = f"FROM_UNIXTIME(UNIX_TIMESTAMP({this}, {time_format}))" 158 return f"CAST({this} AS DATE)" 159 160 161def _str_to_time_sql(self: Hive.Generator, expression: exp.StrToTime) -> str: 162 this = self.sql(expression, "this") 163 time_format = self.format_time(expression) 164 if time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 165 this = f"FROM_UNIXTIME(UNIX_TIMESTAMP({this}, {time_format}))" 166 return f"CAST({this} AS TIMESTAMP)" 167 168 169def _to_date_sql(self: Hive.Generator, expression: exp.TsOrDsToDate) -> str: 170 time_format = self.format_time(expression) 171 if time_format and time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 172 return self.func("TO_DATE", expression.this, time_format) 173 174 if isinstance(expression.this, exp.TsOrDsToDate): 175 return self.sql(expression, "this") 176 177 return self.func("TO_DATE", expression.this) 178 179 180def _build_with_ignore_nulls( 181 exp_class: t.Type[exp.Expression], 182) -> t.Callable[[t.List[exp.Expression]], exp.Expression]: 183 def _parse(args: t.List[exp.Expression]) -> exp.Expression: 184 this = exp_class(this=seq_get(args, 0)) 185 if seq_get(args, 1) == exp.true(): 186 return exp.IgnoreNulls(this=this) 187 return this 188 189 return _parse 190 191 192class Hive(Dialect): 193 ALIAS_POST_TABLESAMPLE = True 194 IDENTIFIERS_CAN_START_WITH_DIGIT = True 195 SUPPORTS_USER_DEFINED_TYPES = False 196 SAFE_DIVISION = True 197 ARRAY_AGG_INCLUDES_NULLS = None 198 REGEXP_EXTRACT_DEFAULT_GROUP = 1 199 200 # https://spark.apache.org/docs/latest/sql-ref-identifier.html#description 201 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 202 203 TIME_MAPPING = { 204 "y": "%Y", 205 "Y": "%Y", 206 "YYYY": "%Y", 207 "yyyy": "%Y", 208 "YY": "%y", 209 "yy": "%y", 210 "MMMM": "%B", 211 "MMM": "%b", 212 "MM": "%m", 213 "M": "%-m", 214 "dd": "%d", 215 "d": "%-d", 216 "HH": "%H", 217 "H": "%-H", 218 "hh": "%I", 219 "h": "%-I", 220 "mm": "%M", 221 "m": "%-M", 222 "ss": "%S", 223 "s": "%-S", 224 "SSSSSS": "%f", 225 "a": "%p", 226 "DD": "%j", 227 "D": "%-j", 228 "E": "%a", 229 "EE": "%a", 230 "EEE": "%a", 231 "EEEE": "%A", 232 } 233 234 DATE_FORMAT = "'yyyy-MM-dd'" 235 DATEINT_FORMAT = "'yyyyMMdd'" 236 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 237 238 class Tokenizer(tokens.Tokenizer): 239 QUOTES = ["'", '"'] 240 IDENTIFIERS = ["`"] 241 STRING_ESCAPES = ["\\"] 242 243 SINGLE_TOKENS = { 244 **tokens.Tokenizer.SINGLE_TOKENS, 245 "$": TokenType.PARAMETER, 246 } 247 248 KEYWORDS = { 249 **tokens.Tokenizer.KEYWORDS, 250 "ADD ARCHIVE": TokenType.COMMAND, 251 "ADD ARCHIVES": TokenType.COMMAND, 252 "ADD FILE": TokenType.COMMAND, 253 "ADD FILES": TokenType.COMMAND, 254 "ADD JAR": TokenType.COMMAND, 255 "ADD JARS": TokenType.COMMAND, 256 "MINUS": TokenType.EXCEPT, 257 "MSCK REPAIR": TokenType.COMMAND, 258 "REFRESH": TokenType.REFRESH, 259 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 260 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 261 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 262 } 263 264 NUMERIC_LITERALS = { 265 "L": "BIGINT", 266 "S": "SMALLINT", 267 "Y": "TINYINT", 268 "D": "DOUBLE", 269 "F": "FLOAT", 270 "BD": "DECIMAL", 271 } 272 273 class Parser(parser.Parser): 274 LOG_DEFAULTS_TO_LN = True 275 STRICT_CAST = False 276 VALUES_FOLLOWED_BY_PAREN = False 277 278 FUNCTIONS = { 279 **parser.Parser.FUNCTIONS, 280 "ASCII": exp.Unicode.from_arg_list, 281 "BASE64": exp.ToBase64.from_arg_list, 282 "COLLECT_LIST": lambda args: exp.ArrayAgg(this=seq_get(args, 0), nulls_excluded=True), 283 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 284 "DATE_ADD": lambda args: exp.TsOrDsAdd( 285 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 286 ), 287 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 288 [ 289 exp.TimeStrToTime(this=seq_get(args, 0)), 290 seq_get(args, 1), 291 ] 292 ), 293 "DATE_SUB": lambda args: exp.TsOrDsAdd( 294 this=seq_get(args, 0), 295 expression=exp.Mul(this=seq_get(args, 1), expression=exp.Literal.number(-1)), 296 unit=exp.Literal.string("DAY"), 297 ), 298 "DATEDIFF": lambda args: exp.DateDiff( 299 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 300 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 301 ), 302 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 303 "FIRST": _build_with_ignore_nulls(exp.First), 304 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 305 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 306 "GET_JSON_OBJECT": exp.JSONExtractScalar.from_arg_list, 307 "LAST": _build_with_ignore_nulls(exp.Last), 308 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 309 "LOCATE": locate_to_strposition, 310 "MAP": parser.build_var_map, 311 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 312 "PERCENTILE": exp.Quantile.from_arg_list, 313 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 314 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 315 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 316 "SEQUENCE": exp.GenerateSeries.from_arg_list, 317 "SIZE": exp.ArraySize.from_arg_list, 318 "SPLIT": exp.RegexpSplit.from_arg_list, 319 "STR_TO_MAP": lambda args: exp.StrToMap( 320 this=seq_get(args, 0), 321 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 322 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 323 ), 324 "TO_DATE": build_formatted_time(exp.TsOrDsToDate, "hive"), 325 "TO_JSON": exp.JSONFormat.from_arg_list, 326 "TRUNC": exp.TimestampTrunc.from_arg_list, 327 "UNBASE64": exp.FromBase64.from_arg_list, 328 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 329 args or [exp.CurrentTimestamp()] 330 ), 331 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 332 } 333 334 NO_PAREN_FUNCTION_PARSERS = { 335 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 336 "TRANSFORM": lambda self: self._parse_transform(), 337 } 338 339 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 340 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 341 342 PROPERTY_PARSERS = { 343 **parser.Parser.PROPERTY_PARSERS, 344 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 345 expressions=self._parse_wrapped_csv(self._parse_property) 346 ), 347 } 348 349 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 350 if not self._match(TokenType.L_PAREN, advance=False): 351 self._retreat(self._index - 1) 352 return None 353 354 args = self._parse_wrapped_csv(self._parse_lambda) 355 row_format_before = self._parse_row_format(match_row=True) 356 357 record_writer = None 358 if self._match_text_seq("RECORDWRITER"): 359 record_writer = self._parse_string() 360 361 if not self._match(TokenType.USING): 362 return exp.Transform.from_arg_list(args) 363 364 command_script = self._parse_string() 365 366 self._match(TokenType.ALIAS) 367 schema = self._parse_schema() 368 369 row_format_after = self._parse_row_format(match_row=True) 370 record_reader = None 371 if self._match_text_seq("RECORDREADER"): 372 record_reader = self._parse_string() 373 374 return self.expression( 375 exp.QueryTransform, 376 expressions=args, 377 command_script=command_script, 378 schema=schema, 379 row_format_before=row_format_before, 380 record_writer=record_writer, 381 row_format_after=row_format_after, 382 record_reader=record_reader, 383 ) 384 385 def _parse_types( 386 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 387 ) -> t.Optional[exp.Expression]: 388 """ 389 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 390 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 391 392 spark-sql (default)> select cast(1234 as varchar(2)); 393 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 394 char/varchar type and simply treats them as string type. Please use string type 395 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 396 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 397 398 1234 399 Time taken: 4.265 seconds, Fetched 1 row(s) 400 401 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 402 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 403 404 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 405 """ 406 this = super()._parse_types( 407 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 408 ) 409 410 if this and not schema: 411 return this.transform( 412 lambda node: ( 413 node.replace(exp.DataType.build("text")) 414 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 415 else node 416 ), 417 copy=False, 418 ) 419 420 return this 421 422 def _parse_partition_and_order( 423 self, 424 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 425 return ( 426 ( 427 self._parse_csv(self._parse_assignment) 428 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 429 else [] 430 ), 431 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 432 ) 433 434 def _parse_parameter(self) -> exp.Parameter: 435 self._match(TokenType.L_BRACE) 436 this = self._parse_identifier() or self._parse_primary_or_var() 437 expression = self._match(TokenType.COLON) and ( 438 self._parse_identifier() or self._parse_primary_or_var() 439 ) 440 self._match(TokenType.R_BRACE) 441 return self.expression(exp.Parameter, this=this, expression=expression) 442 443 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 444 if isinstance(expression, exp.Column): 445 key = expression.this 446 else: 447 key = exp.to_identifier(f"col{index + 1}") 448 449 return self.expression(exp.PropertyEQ, this=key, expression=expression) 450 451 class Generator(generator.Generator): 452 LIMIT_FETCH = "LIMIT" 453 TABLESAMPLE_WITH_METHOD = False 454 JOIN_HINTS = False 455 TABLE_HINTS = False 456 QUERY_HINTS = False 457 INDEX_ON = "ON TABLE" 458 EXTRACT_ALLOWS_QUOTES = False 459 NVL2_SUPPORTED = False 460 LAST_DAY_SUPPORTS_DATE_PART = False 461 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 462 SUPPORTS_TO_NUMBER = False 463 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 464 PARSE_JSON_NAME = None 465 PAD_FILL_PATTERN_IS_REQUIRED = True 466 SUPPORTS_MEDIAN = False 467 ARRAY_SIZE_NAME = "SIZE" 468 469 EXPRESSIONS_WITHOUT_NESTED_CTES = { 470 exp.Insert, 471 exp.Select, 472 exp.Subquery, 473 exp.SetOperation, 474 } 475 476 SUPPORTED_JSON_PATH_PARTS = { 477 exp.JSONPathKey, 478 exp.JSONPathRoot, 479 exp.JSONPathSubscript, 480 exp.JSONPathWildcard, 481 } 482 483 TYPE_MAPPING = { 484 **generator.Generator.TYPE_MAPPING, 485 exp.DataType.Type.BIT: "BOOLEAN", 486 exp.DataType.Type.DATETIME: "TIMESTAMP", 487 exp.DataType.Type.ROWVERSION: "BINARY", 488 exp.DataType.Type.TEXT: "STRING", 489 exp.DataType.Type.TIME: "TIMESTAMP", 490 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 491 exp.DataType.Type.UTINYINT: "SMALLINT", 492 exp.DataType.Type.VARBINARY: "BINARY", 493 } 494 495 TRANSFORMS = { 496 **generator.Generator.TRANSFORMS, 497 exp.Group: transforms.preprocess([transforms.unalias_group]), 498 exp.Property: property_sql, 499 exp.AnyValue: rename_func("FIRST"), 500 exp.ApproxDistinct: approx_count_distinct_sql, 501 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 502 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 503 exp.ArrayConcat: rename_func("CONCAT"), 504 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 505 exp.ArraySort: _array_sort_sql, 506 exp.With: no_recursive_cte_sql, 507 exp.DateAdd: _add_date_sql, 508 exp.DateDiff: _date_diff_sql, 509 exp.DateStrToDate: datestrtodate_sql, 510 exp.DateSub: _add_date_sql, 511 exp.DateToDi: lambda self, 512 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 513 exp.DiToDate: lambda self, 514 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 515 exp.FileFormatProperty: lambda self, 516 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 517 exp.FromBase64: rename_func("UNBASE64"), 518 exp.GenerateSeries: sequence_sql, 519 exp.GenerateDateArray: sequence_sql, 520 exp.If: if_sql(), 521 exp.ILike: no_ilike_sql, 522 exp.IsNan: rename_func("ISNAN"), 523 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 524 exp.JSONExtractScalar: lambda self, e: self.func( 525 "GET_JSON_OBJECT", e.this, e.expression 526 ), 527 exp.JSONFormat: _json_format_sql, 528 exp.Left: left_to_substring_sql, 529 exp.Map: var_map_sql, 530 exp.Max: max_or_greatest, 531 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 532 exp.Min: min_or_least, 533 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 534 exp.NotNullColumnConstraint: lambda _, e: ( 535 "" if e.args.get("allow_null") else "NOT NULL" 536 ), 537 exp.VarMap: var_map_sql, 538 exp.Create: preprocess( 539 [ 540 remove_unique_constraints, 541 ctas_with_tmp_tables_to_create_tmp_view, 542 move_schema_columns_to_partitioned_by, 543 ] 544 ), 545 exp.Quantile: rename_func("PERCENTILE"), 546 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 547 exp.RegexpExtract: regexp_extract_sql, 548 exp.RegexpExtractAll: regexp_extract_sql, 549 exp.RegexpReplace: regexp_replace_sql, 550 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 551 exp.RegexpSplit: rename_func("SPLIT"), 552 exp.Right: right_to_substring_sql, 553 exp.SafeDivide: no_safe_divide_sql, 554 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 555 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 556 exp.Split: lambda self, e: self.func( 557 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 558 ), 559 exp.Select: transforms.preprocess( 560 [ 561 transforms.eliminate_qualify, 562 transforms.eliminate_distinct_on, 563 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 564 transforms.any_to_exists, 565 ] 566 ), 567 exp.StrPosition: strposition_to_locate_sql, 568 exp.StrToDate: _str_to_date_sql, 569 exp.StrToTime: _str_to_time_sql, 570 exp.StrToUnix: _str_to_unix_sql, 571 exp.StructExtract: struct_extract_sql, 572 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 573 exp.TimeStrToDate: rename_func("TO_DATE"), 574 exp.TimeStrToTime: timestrtotime_sql, 575 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 576 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 577 exp.TimeToStr: lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)), 578 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 579 exp.ToBase64: rename_func("BASE64"), 580 exp.TsOrDiToDi: lambda self, 581 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 582 exp.TsOrDsAdd: _add_date_sql, 583 exp.TsOrDsDiff: _date_diff_sql, 584 exp.TsOrDsToDate: _to_date_sql, 585 exp.TryCast: no_trycast_sql, 586 exp.Unicode: rename_func("ASCII"), 587 exp.UnixToStr: lambda self, e: self.func( 588 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 589 ), 590 exp.UnixToTime: _unix_to_time_sql, 591 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 592 exp.Unnest: rename_func("EXPLODE"), 593 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 594 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 595 exp.National: lambda self, e: self.national_sql(e, prefix=""), 596 exp.ClusteredColumnConstraint: lambda self, 597 e: f"({self.expressions(e, 'this', indent=False)})", 598 exp.NonClusteredColumnConstraint: lambda self, 599 e: f"({self.expressions(e, 'this', indent=False)})", 600 exp.NotForReplicationColumnConstraint: lambda *_: "", 601 exp.OnProperty: lambda *_: "", 602 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 603 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 604 exp.DayOfMonth: rename_func("DAYOFMONTH"), 605 exp.DayOfWeek: rename_func("DAYOFWEEK"), 606 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 607 rename_func("LEVENSHTEIN") 608 ), 609 } 610 611 PROPERTIES_LOCATION = { 612 **generator.Generator.PROPERTIES_LOCATION, 613 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 614 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 615 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 616 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 617 } 618 619 def unnest_sql(self, expression: exp.Unnest) -> str: 620 return rename_func("EXPLODE")(self, expression) 621 622 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 623 if isinstance(expression.this, exp.JSONPathWildcard): 624 self.unsupported("Unsupported wildcard in JSONPathKey expression") 625 return "" 626 627 return super()._jsonpathkey_sql(expression) 628 629 def parameter_sql(self, expression: exp.Parameter) -> str: 630 this = self.sql(expression, "this") 631 expression_sql = self.sql(expression, "expression") 632 633 parent = expression.parent 634 this = f"{this}:{expression_sql}" if expression_sql else this 635 636 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 637 # We need to produce SET key = value instead of SET ${key} = value 638 return this 639 640 return f"${{{this}}}" 641 642 def schema_sql(self, expression: exp.Schema) -> str: 643 for ordered in expression.find_all(exp.Ordered): 644 if ordered.args.get("desc") is False: 645 ordered.set("desc", None) 646 647 return super().schema_sql(expression) 648 649 def constraint_sql(self, expression: exp.Constraint) -> str: 650 for prop in list(expression.find_all(exp.Properties)): 651 prop.pop() 652 653 this = self.sql(expression, "this") 654 expressions = self.expressions(expression, sep=" ", flat=True) 655 return f"CONSTRAINT {this} {expressions}" 656 657 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 658 serde_props = self.sql(expression, "serde_properties") 659 serde_props = f" {serde_props}" if serde_props else "" 660 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 661 662 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 663 return self.func( 664 "COLLECT_LIST", 665 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 666 ) 667 668 def datatype_sql(self, expression: exp.DataType) -> str: 669 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 670 not expression.expressions or expression.expressions[0].name == "MAX" 671 ): 672 expression = exp.DataType.build("text") 673 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 674 expression.set("this", exp.DataType.Type.VARCHAR) 675 elif expression.this in exp.DataType.TEMPORAL_TYPES: 676 expression = exp.DataType.build(expression.this) 677 elif expression.is_type("float"): 678 size_expression = expression.find(exp.DataTypeParam) 679 if size_expression: 680 size = int(size_expression.name) 681 expression = ( 682 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 683 ) 684 685 return super().datatype_sql(expression) 686 687 def version_sql(self, expression: exp.Version) -> str: 688 sql = super().version_sql(expression) 689 return sql.replace("FOR ", "", 1) 690 691 def struct_sql(self, expression: exp.Struct) -> str: 692 values = [] 693 694 for i, e in enumerate(expression.expressions): 695 if isinstance(e, exp.PropertyEQ): 696 self.unsupported("Hive does not support named structs.") 697 values.append(e.expression) 698 else: 699 values.append(e) 700 701 return self.func("STRUCT", *values) 702 703 def alterset_sql(self, expression: exp.AlterSet) -> str: 704 exprs = self.expressions(expression, flat=True) 705 exprs = f" {exprs}" if exprs else "" 706 location = self.sql(expression, "location") 707 location = f" LOCATION {location}" if location else "" 708 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 709 file_format = f" FILEFORMAT {file_format}" if file_format else "" 710 serde = self.sql(expression, "serde") 711 serde = f" SERDE {serde}" if serde else "" 712 tags = self.expressions(expression, key="tag", flat=True, sep="") 713 tags = f" TAGS {tags}" if tags else "" 714 715 return f"SET{serde}{exprs}{location}{file_format}{tags}" 716 717 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 718 prefix = "WITH " if expression.args.get("with") else "" 719 exprs = self.expressions(expression, flat=True) 720 721 return f"{prefix}SERDEPROPERTIES ({exprs})" 722 723 def exists_sql(self, expression: exp.Exists): 724 if expression.expression: 725 return self.function_fallback_sql(expression) 726 727 return super().exists_sql(expression)
DATE_DELTA_INTERVAL =
{'YEAR': ('ADD_MONTHS', 12), 'MONTH': ('ADD_MONTHS', 1), 'QUARTER': ('ADD_MONTHS', 3), 'WEEK': ('DATE_ADD', 7), 'DAY': ('DATE_ADD', 1)}
TIME_DIFF_FACTOR =
{'MILLISECOND': ' * 1000', 'SECOND': '', 'MINUTE': ' / 60', 'HOUR': ' / 3600'}
DIFF_MONTH_SWITCH =
('YEAR', 'QUARTER', 'MONTH')
193class Hive(Dialect): 194 ALIAS_POST_TABLESAMPLE = True 195 IDENTIFIERS_CAN_START_WITH_DIGIT = True 196 SUPPORTS_USER_DEFINED_TYPES = False 197 SAFE_DIVISION = True 198 ARRAY_AGG_INCLUDES_NULLS = None 199 REGEXP_EXTRACT_DEFAULT_GROUP = 1 200 201 # https://spark.apache.org/docs/latest/sql-ref-identifier.html#description 202 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 203 204 TIME_MAPPING = { 205 "y": "%Y", 206 "Y": "%Y", 207 "YYYY": "%Y", 208 "yyyy": "%Y", 209 "YY": "%y", 210 "yy": "%y", 211 "MMMM": "%B", 212 "MMM": "%b", 213 "MM": "%m", 214 "M": "%-m", 215 "dd": "%d", 216 "d": "%-d", 217 "HH": "%H", 218 "H": "%-H", 219 "hh": "%I", 220 "h": "%-I", 221 "mm": "%M", 222 "m": "%-M", 223 "ss": "%S", 224 "s": "%-S", 225 "SSSSSS": "%f", 226 "a": "%p", 227 "DD": "%j", 228 "D": "%-j", 229 "E": "%a", 230 "EE": "%a", 231 "EEE": "%a", 232 "EEEE": "%A", 233 } 234 235 DATE_FORMAT = "'yyyy-MM-dd'" 236 DATEINT_FORMAT = "'yyyyMMdd'" 237 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 238 239 class Tokenizer(tokens.Tokenizer): 240 QUOTES = ["'", '"'] 241 IDENTIFIERS = ["`"] 242 STRING_ESCAPES = ["\\"] 243 244 SINGLE_TOKENS = { 245 **tokens.Tokenizer.SINGLE_TOKENS, 246 "$": TokenType.PARAMETER, 247 } 248 249 KEYWORDS = { 250 **tokens.Tokenizer.KEYWORDS, 251 "ADD ARCHIVE": TokenType.COMMAND, 252 "ADD ARCHIVES": TokenType.COMMAND, 253 "ADD FILE": TokenType.COMMAND, 254 "ADD FILES": TokenType.COMMAND, 255 "ADD JAR": TokenType.COMMAND, 256 "ADD JARS": TokenType.COMMAND, 257 "MINUS": TokenType.EXCEPT, 258 "MSCK REPAIR": TokenType.COMMAND, 259 "REFRESH": TokenType.REFRESH, 260 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 261 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 262 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 263 } 264 265 NUMERIC_LITERALS = { 266 "L": "BIGINT", 267 "S": "SMALLINT", 268 "Y": "TINYINT", 269 "D": "DOUBLE", 270 "F": "FLOAT", 271 "BD": "DECIMAL", 272 } 273 274 class Parser(parser.Parser): 275 LOG_DEFAULTS_TO_LN = True 276 STRICT_CAST = False 277 VALUES_FOLLOWED_BY_PAREN = False 278 279 FUNCTIONS = { 280 **parser.Parser.FUNCTIONS, 281 "ASCII": exp.Unicode.from_arg_list, 282 "BASE64": exp.ToBase64.from_arg_list, 283 "COLLECT_LIST": lambda args: exp.ArrayAgg(this=seq_get(args, 0), nulls_excluded=True), 284 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 285 "DATE_ADD": lambda args: exp.TsOrDsAdd( 286 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 287 ), 288 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 289 [ 290 exp.TimeStrToTime(this=seq_get(args, 0)), 291 seq_get(args, 1), 292 ] 293 ), 294 "DATE_SUB": lambda args: exp.TsOrDsAdd( 295 this=seq_get(args, 0), 296 expression=exp.Mul(this=seq_get(args, 1), expression=exp.Literal.number(-1)), 297 unit=exp.Literal.string("DAY"), 298 ), 299 "DATEDIFF": lambda args: exp.DateDiff( 300 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 301 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 302 ), 303 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 304 "FIRST": _build_with_ignore_nulls(exp.First), 305 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 306 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 307 "GET_JSON_OBJECT": exp.JSONExtractScalar.from_arg_list, 308 "LAST": _build_with_ignore_nulls(exp.Last), 309 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 310 "LOCATE": locate_to_strposition, 311 "MAP": parser.build_var_map, 312 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 313 "PERCENTILE": exp.Quantile.from_arg_list, 314 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 315 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 316 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 317 "SEQUENCE": exp.GenerateSeries.from_arg_list, 318 "SIZE": exp.ArraySize.from_arg_list, 319 "SPLIT": exp.RegexpSplit.from_arg_list, 320 "STR_TO_MAP": lambda args: exp.StrToMap( 321 this=seq_get(args, 0), 322 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 323 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 324 ), 325 "TO_DATE": build_formatted_time(exp.TsOrDsToDate, "hive"), 326 "TO_JSON": exp.JSONFormat.from_arg_list, 327 "TRUNC": exp.TimestampTrunc.from_arg_list, 328 "UNBASE64": exp.FromBase64.from_arg_list, 329 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 330 args or [exp.CurrentTimestamp()] 331 ), 332 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 333 } 334 335 NO_PAREN_FUNCTION_PARSERS = { 336 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 337 "TRANSFORM": lambda self: self._parse_transform(), 338 } 339 340 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 341 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 342 343 PROPERTY_PARSERS = { 344 **parser.Parser.PROPERTY_PARSERS, 345 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 346 expressions=self._parse_wrapped_csv(self._parse_property) 347 ), 348 } 349 350 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 351 if not self._match(TokenType.L_PAREN, advance=False): 352 self._retreat(self._index - 1) 353 return None 354 355 args = self._parse_wrapped_csv(self._parse_lambda) 356 row_format_before = self._parse_row_format(match_row=True) 357 358 record_writer = None 359 if self._match_text_seq("RECORDWRITER"): 360 record_writer = self._parse_string() 361 362 if not self._match(TokenType.USING): 363 return exp.Transform.from_arg_list(args) 364 365 command_script = self._parse_string() 366 367 self._match(TokenType.ALIAS) 368 schema = self._parse_schema() 369 370 row_format_after = self._parse_row_format(match_row=True) 371 record_reader = None 372 if self._match_text_seq("RECORDREADER"): 373 record_reader = self._parse_string() 374 375 return self.expression( 376 exp.QueryTransform, 377 expressions=args, 378 command_script=command_script, 379 schema=schema, 380 row_format_before=row_format_before, 381 record_writer=record_writer, 382 row_format_after=row_format_after, 383 record_reader=record_reader, 384 ) 385 386 def _parse_types( 387 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 388 ) -> t.Optional[exp.Expression]: 389 """ 390 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 391 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 392 393 spark-sql (default)> select cast(1234 as varchar(2)); 394 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 395 char/varchar type and simply treats them as string type. Please use string type 396 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 397 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 398 399 1234 400 Time taken: 4.265 seconds, Fetched 1 row(s) 401 402 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 403 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 404 405 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 406 """ 407 this = super()._parse_types( 408 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 409 ) 410 411 if this and not schema: 412 return this.transform( 413 lambda node: ( 414 node.replace(exp.DataType.build("text")) 415 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 416 else node 417 ), 418 copy=False, 419 ) 420 421 return this 422 423 def _parse_partition_and_order( 424 self, 425 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 426 return ( 427 ( 428 self._parse_csv(self._parse_assignment) 429 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 430 else [] 431 ), 432 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 433 ) 434 435 def _parse_parameter(self) -> exp.Parameter: 436 self._match(TokenType.L_BRACE) 437 this = self._parse_identifier() or self._parse_primary_or_var() 438 expression = self._match(TokenType.COLON) and ( 439 self._parse_identifier() or self._parse_primary_or_var() 440 ) 441 self._match(TokenType.R_BRACE) 442 return self.expression(exp.Parameter, this=this, expression=expression) 443 444 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 445 if isinstance(expression, exp.Column): 446 key = expression.this 447 else: 448 key = exp.to_identifier(f"col{index + 1}") 449 450 return self.expression(exp.PropertyEQ, this=key, expression=expression) 451 452 class Generator(generator.Generator): 453 LIMIT_FETCH = "LIMIT" 454 TABLESAMPLE_WITH_METHOD = False 455 JOIN_HINTS = False 456 TABLE_HINTS = False 457 QUERY_HINTS = False 458 INDEX_ON = "ON TABLE" 459 EXTRACT_ALLOWS_QUOTES = False 460 NVL2_SUPPORTED = False 461 LAST_DAY_SUPPORTS_DATE_PART = False 462 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 463 SUPPORTS_TO_NUMBER = False 464 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 465 PARSE_JSON_NAME = None 466 PAD_FILL_PATTERN_IS_REQUIRED = True 467 SUPPORTS_MEDIAN = False 468 ARRAY_SIZE_NAME = "SIZE" 469 470 EXPRESSIONS_WITHOUT_NESTED_CTES = { 471 exp.Insert, 472 exp.Select, 473 exp.Subquery, 474 exp.SetOperation, 475 } 476 477 SUPPORTED_JSON_PATH_PARTS = { 478 exp.JSONPathKey, 479 exp.JSONPathRoot, 480 exp.JSONPathSubscript, 481 exp.JSONPathWildcard, 482 } 483 484 TYPE_MAPPING = { 485 **generator.Generator.TYPE_MAPPING, 486 exp.DataType.Type.BIT: "BOOLEAN", 487 exp.DataType.Type.DATETIME: "TIMESTAMP", 488 exp.DataType.Type.ROWVERSION: "BINARY", 489 exp.DataType.Type.TEXT: "STRING", 490 exp.DataType.Type.TIME: "TIMESTAMP", 491 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 492 exp.DataType.Type.UTINYINT: "SMALLINT", 493 exp.DataType.Type.VARBINARY: "BINARY", 494 } 495 496 TRANSFORMS = { 497 **generator.Generator.TRANSFORMS, 498 exp.Group: transforms.preprocess([transforms.unalias_group]), 499 exp.Property: property_sql, 500 exp.AnyValue: rename_func("FIRST"), 501 exp.ApproxDistinct: approx_count_distinct_sql, 502 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 503 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 504 exp.ArrayConcat: rename_func("CONCAT"), 505 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 506 exp.ArraySort: _array_sort_sql, 507 exp.With: no_recursive_cte_sql, 508 exp.DateAdd: _add_date_sql, 509 exp.DateDiff: _date_diff_sql, 510 exp.DateStrToDate: datestrtodate_sql, 511 exp.DateSub: _add_date_sql, 512 exp.DateToDi: lambda self, 513 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 514 exp.DiToDate: lambda self, 515 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 516 exp.FileFormatProperty: lambda self, 517 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 518 exp.FromBase64: rename_func("UNBASE64"), 519 exp.GenerateSeries: sequence_sql, 520 exp.GenerateDateArray: sequence_sql, 521 exp.If: if_sql(), 522 exp.ILike: no_ilike_sql, 523 exp.IsNan: rename_func("ISNAN"), 524 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 525 exp.JSONExtractScalar: lambda self, e: self.func( 526 "GET_JSON_OBJECT", e.this, e.expression 527 ), 528 exp.JSONFormat: _json_format_sql, 529 exp.Left: left_to_substring_sql, 530 exp.Map: var_map_sql, 531 exp.Max: max_or_greatest, 532 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 533 exp.Min: min_or_least, 534 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 535 exp.NotNullColumnConstraint: lambda _, e: ( 536 "" if e.args.get("allow_null") else "NOT NULL" 537 ), 538 exp.VarMap: var_map_sql, 539 exp.Create: preprocess( 540 [ 541 remove_unique_constraints, 542 ctas_with_tmp_tables_to_create_tmp_view, 543 move_schema_columns_to_partitioned_by, 544 ] 545 ), 546 exp.Quantile: rename_func("PERCENTILE"), 547 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 548 exp.RegexpExtract: regexp_extract_sql, 549 exp.RegexpExtractAll: regexp_extract_sql, 550 exp.RegexpReplace: regexp_replace_sql, 551 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 552 exp.RegexpSplit: rename_func("SPLIT"), 553 exp.Right: right_to_substring_sql, 554 exp.SafeDivide: no_safe_divide_sql, 555 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 556 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 557 exp.Split: lambda self, e: self.func( 558 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 559 ), 560 exp.Select: transforms.preprocess( 561 [ 562 transforms.eliminate_qualify, 563 transforms.eliminate_distinct_on, 564 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 565 transforms.any_to_exists, 566 ] 567 ), 568 exp.StrPosition: strposition_to_locate_sql, 569 exp.StrToDate: _str_to_date_sql, 570 exp.StrToTime: _str_to_time_sql, 571 exp.StrToUnix: _str_to_unix_sql, 572 exp.StructExtract: struct_extract_sql, 573 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 574 exp.TimeStrToDate: rename_func("TO_DATE"), 575 exp.TimeStrToTime: timestrtotime_sql, 576 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 577 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 578 exp.TimeToStr: lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)), 579 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 580 exp.ToBase64: rename_func("BASE64"), 581 exp.TsOrDiToDi: lambda self, 582 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 583 exp.TsOrDsAdd: _add_date_sql, 584 exp.TsOrDsDiff: _date_diff_sql, 585 exp.TsOrDsToDate: _to_date_sql, 586 exp.TryCast: no_trycast_sql, 587 exp.Unicode: rename_func("ASCII"), 588 exp.UnixToStr: lambda self, e: self.func( 589 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 590 ), 591 exp.UnixToTime: _unix_to_time_sql, 592 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 593 exp.Unnest: rename_func("EXPLODE"), 594 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 595 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 596 exp.National: lambda self, e: self.national_sql(e, prefix=""), 597 exp.ClusteredColumnConstraint: lambda self, 598 e: f"({self.expressions(e, 'this', indent=False)})", 599 exp.NonClusteredColumnConstraint: lambda self, 600 e: f"({self.expressions(e, 'this', indent=False)})", 601 exp.NotForReplicationColumnConstraint: lambda *_: "", 602 exp.OnProperty: lambda *_: "", 603 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 604 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 605 exp.DayOfMonth: rename_func("DAYOFMONTH"), 606 exp.DayOfWeek: rename_func("DAYOFWEEK"), 607 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 608 rename_func("LEVENSHTEIN") 609 ), 610 } 611 612 PROPERTIES_LOCATION = { 613 **generator.Generator.PROPERTIES_LOCATION, 614 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 615 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 616 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 617 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 618 } 619 620 def unnest_sql(self, expression: exp.Unnest) -> str: 621 return rename_func("EXPLODE")(self, expression) 622 623 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 624 if isinstance(expression.this, exp.JSONPathWildcard): 625 self.unsupported("Unsupported wildcard in JSONPathKey expression") 626 return "" 627 628 return super()._jsonpathkey_sql(expression) 629 630 def parameter_sql(self, expression: exp.Parameter) -> str: 631 this = self.sql(expression, "this") 632 expression_sql = self.sql(expression, "expression") 633 634 parent = expression.parent 635 this = f"{this}:{expression_sql}" if expression_sql else this 636 637 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 638 # We need to produce SET key = value instead of SET ${key} = value 639 return this 640 641 return f"${{{this}}}" 642 643 def schema_sql(self, expression: exp.Schema) -> str: 644 for ordered in expression.find_all(exp.Ordered): 645 if ordered.args.get("desc") is False: 646 ordered.set("desc", None) 647 648 return super().schema_sql(expression) 649 650 def constraint_sql(self, expression: exp.Constraint) -> str: 651 for prop in list(expression.find_all(exp.Properties)): 652 prop.pop() 653 654 this = self.sql(expression, "this") 655 expressions = self.expressions(expression, sep=" ", flat=True) 656 return f"CONSTRAINT {this} {expressions}" 657 658 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 659 serde_props = self.sql(expression, "serde_properties") 660 serde_props = f" {serde_props}" if serde_props else "" 661 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 662 663 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 664 return self.func( 665 "COLLECT_LIST", 666 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 667 ) 668 669 def datatype_sql(self, expression: exp.DataType) -> str: 670 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 671 not expression.expressions or expression.expressions[0].name == "MAX" 672 ): 673 expression = exp.DataType.build("text") 674 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 675 expression.set("this", exp.DataType.Type.VARCHAR) 676 elif expression.this in exp.DataType.TEMPORAL_TYPES: 677 expression = exp.DataType.build(expression.this) 678 elif expression.is_type("float"): 679 size_expression = expression.find(exp.DataTypeParam) 680 if size_expression: 681 size = int(size_expression.name) 682 expression = ( 683 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 684 ) 685 686 return super().datatype_sql(expression) 687 688 def version_sql(self, expression: exp.Version) -> str: 689 sql = super().version_sql(expression) 690 return sql.replace("FOR ", "", 1) 691 692 def struct_sql(self, expression: exp.Struct) -> str: 693 values = [] 694 695 for i, e in enumerate(expression.expressions): 696 if isinstance(e, exp.PropertyEQ): 697 self.unsupported("Hive does not support named structs.") 698 values.append(e.expression) 699 else: 700 values.append(e) 701 702 return self.func("STRUCT", *values) 703 704 def alterset_sql(self, expression: exp.AlterSet) -> str: 705 exprs = self.expressions(expression, flat=True) 706 exprs = f" {exprs}" if exprs else "" 707 location = self.sql(expression, "location") 708 location = f" LOCATION {location}" if location else "" 709 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 710 file_format = f" FILEFORMAT {file_format}" if file_format else "" 711 serde = self.sql(expression, "serde") 712 serde = f" SERDE {serde}" if serde else "" 713 tags = self.expressions(expression, key="tag", flat=True, sep="") 714 tags = f" TAGS {tags}" if tags else "" 715 716 return f"SET{serde}{exprs}{location}{file_format}{tags}" 717 718 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 719 prefix = "WITH " if expression.args.get("with") else "" 720 exprs = self.expressions(expression, flat=True) 721 722 return f"{prefix}SERDEPROPERTIES ({exprs})" 723 724 def exists_sql(self, expression: exp.Exists): 725 if expression.expression: 726 return self.function_fallback_sql(expression) 727 728 return super().exists_sql(expression)
NORMALIZATION_STRATEGY =
<NormalizationStrategy.CASE_INSENSITIVE: 'CASE_INSENSITIVE'>
Specifies the strategy according to which identifiers should be normalized.
TIME_MAPPING: Dict[str, str] =
{'y': '%Y', 'Y': '%Y', 'YYYY': '%Y', 'yyyy': '%Y', 'YY': '%y', 'yy': '%y', 'MMMM': '%B', 'MMM': '%b', 'MM': '%m', 'M': '%-m', 'dd': '%d', 'd': '%-d', 'HH': '%H', 'H': '%-H', 'hh': '%I', 'h': '%-I', 'mm': '%M', 'm': '%-M', 'ss': '%S', 's': '%-S', 'SSSSSS': '%f', 'a': '%p', 'DD': '%j', 'D': '%-j', 'E': '%a', 'EE': '%a', 'EEE': '%a', 'EEEE': '%A'}
Associates this dialect's time formats with their equivalent Python strftime
formats.
UNESCAPED_SEQUENCES: Dict[str, str] =
{'\\a': '\x07', '\\b': '\x08', '\\f': '\x0c', '\\n': '\n', '\\r': '\r', '\\t': '\t', '\\v': '\x0b', '\\\\': '\\'}
Mapping of an escaped sequence (\n
) to its unescaped version (
).
tokenizer_class =
<class 'Hive.Tokenizer'>
parser_class =
<class 'Hive.Parser'>
generator_class =
<class 'Hive.Generator'>
TIME_TRIE: Dict =
{'y': {0: True, 'y': {'y': {'y': {0: True}}, 0: True}}, 'Y': {0: True, 'Y': {'Y': {'Y': {0: True}}, 0: True}}, 'M': {'M': {'M': {'M': {0: True}, 0: True}, 0: True}, 0: True}, 'd': {'d': {0: True}, 0: True}, 'H': {'H': {0: True}, 0: True}, 'h': {'h': {0: True}, 0: True}, 'm': {'m': {0: True}, 0: True}, 's': {'s': {0: True}, 0: True}, 'S': {'S': {'S': {'S': {'S': {'S': {0: True}}}}}}, 'a': {0: True}, 'D': {'D': {0: True}, 0: True}, 'E': {0: True, 'E': {0: True, 'E': {0: True, 'E': {0: True}}}}}
FORMAT_TRIE: Dict =
{'y': {0: True, 'y': {'y': {'y': {0: True}}, 0: True}}, 'Y': {0: True, 'Y': {'Y': {'Y': {0: True}}, 0: True}}, 'M': {'M': {'M': {'M': {0: True}, 0: True}, 0: True}, 0: True}, 'd': {'d': {0: True}, 0: True}, 'H': {'H': {0: True}, 0: True}, 'h': {'h': {0: True}, 0: True}, 'm': {'m': {0: True}, 0: True}, 's': {'s': {0: True}, 0: True}, 'S': {'S': {'S': {'S': {'S': {'S': {0: True}}}}}}, 'a': {0: True}, 'D': {'D': {0: True}, 0: True}, 'E': {0: True, 'E': {0: True, 'E': {0: True, 'E': {0: True}}}}}
INVERSE_TIME_MAPPING: Dict[str, str] =
{'%Y': 'yyyy', '%y': 'yy', '%B': 'MMMM', '%b': 'MMM', '%m': 'MM', '%-m': 'M', '%d': 'dd', '%-d': 'd', '%H': 'HH', '%-H': 'H', '%I': 'hh', '%-I': 'h', '%M': 'mm', '%-M': 'm', '%S': 'ss', '%-S': 's', '%f': 'SSSSSS', '%p': 'a', '%j': 'DD', '%-j': 'D', '%a': 'EEE', '%A': 'EEEE'}
INVERSE_TIME_TRIE: Dict =
{'%': {'Y': {0: True}, 'y': {0: True}, 'B': {0: True}, 'b': {0: True}, 'm': {0: True}, '-': {'m': {0: True}, 'd': {0: True}, 'H': {0: True}, 'I': {0: True}, 'M': {0: True}, 'S': {0: True}, 'j': {0: True}}, 'd': {0: True}, 'H': {0: True}, 'I': {0: True}, 'M': {0: True}, 'S': {0: True}, 'f': {0: True}, 'p': {0: True}, 'j': {0: True}, 'a': {0: True}, 'A': {0: True}}}
ESCAPED_SEQUENCES: Dict[str, str] =
{'\x07': '\\a', '\x08': '\\b', '\x0c': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t', '\x0b': '\\v', '\\': '\\\\'}
Inherited Members
- sqlglot.dialects.dialect.Dialect
- Dialect
- INDEX_OFFSET
- WEEK_OFFSET
- UNNEST_COLUMN_ONLY
- TABLESAMPLE_SIZE_IS_PERCENT
- DPIPE_IS_STRING_CONCAT
- STRICT_STRING_CONCAT
- SUPPORTS_SEMI_ANTI_JOIN
- COPY_PARAMS_ARE_CSV
- NORMALIZE_FUNCTIONS
- PRESERVE_ORIGINAL_NAMES
- LOG_BASE_FIRST
- NULL_ORDERING
- TYPED_DIVISION
- CONCAT_COALESCE
- HEX_LOWERCASE
- FORMAT_MAPPING
- PSEUDOCOLUMNS
- PREFER_CTE_ALIAS_COLUMN
- FORCE_EARLY_ALIAS_REF_EXPANSION
- EXPAND_ALIAS_REFS_EARLY_ONLY_IN_GROUP_BY
- SUPPORTS_ORDER_BY_ALL
- HAS_DISTINCT_ARRAY_CONSTRUCTORS
- SUPPORTS_FIXED_SIZE_ARRAYS
- STRICT_JSON_PATH_SYNTAX
- ON_CONDITION_EMPTY_BEFORE_ERROR
- PROMOTE_TO_INFERRED_DATETIME_TYPE
- SUPPORTS_VALUES_DEFAULT
- NUMBERS_CAN_BE_UNDERSCORE_SEPARATED
- SET_OP_DISTINCT_BY_DEFAULT
- CREATABLE_KIND_MAPPING
- DATE_PART_MAPPING
- TYPE_TO_EXPRESSIONS
- ANNOTATORS
- get_or_raise
- format_time
- settings
- normalize_identifier
- case_sensitive
- can_identify
- quote_identifier
- to_json_path
- parse
- parse_into
- generate
- transpile
- tokenize
- tokenizer
- jsonpath_tokenizer
- parser
- generator
239 class Tokenizer(tokens.Tokenizer): 240 QUOTES = ["'", '"'] 241 IDENTIFIERS = ["`"] 242 STRING_ESCAPES = ["\\"] 243 244 SINGLE_TOKENS = { 245 **tokens.Tokenizer.SINGLE_TOKENS, 246 "$": TokenType.PARAMETER, 247 } 248 249 KEYWORDS = { 250 **tokens.Tokenizer.KEYWORDS, 251 "ADD ARCHIVE": TokenType.COMMAND, 252 "ADD ARCHIVES": TokenType.COMMAND, 253 "ADD FILE": TokenType.COMMAND, 254 "ADD FILES": TokenType.COMMAND, 255 "ADD JAR": TokenType.COMMAND, 256 "ADD JARS": TokenType.COMMAND, 257 "MINUS": TokenType.EXCEPT, 258 "MSCK REPAIR": TokenType.COMMAND, 259 "REFRESH": TokenType.REFRESH, 260 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 261 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 262 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 263 } 264 265 NUMERIC_LITERALS = { 266 "L": "BIGINT", 267 "S": "SMALLINT", 268 "Y": "TINYINT", 269 "D": "DOUBLE", 270 "F": "FLOAT", 271 "BD": "DECIMAL", 272 }
SINGLE_TOKENS =
{'(': <TokenType.L_PAREN: 'L_PAREN'>, ')': <TokenType.R_PAREN: 'R_PAREN'>, '[': <TokenType.L_BRACKET: 'L_BRACKET'>, ']': <TokenType.R_BRACKET: 'R_BRACKET'>, '{': <TokenType.L_BRACE: 'L_BRACE'>, '}': <TokenType.R_BRACE: 'R_BRACE'>, '&': <TokenType.AMP: 'AMP'>, '^': <TokenType.CARET: 'CARET'>, ':': <TokenType.COLON: 'COLON'>, ',': <TokenType.COMMA: 'COMMA'>, '.': <TokenType.DOT: 'DOT'>, '-': <TokenType.DASH: 'DASH'>, '=': <TokenType.EQ: 'EQ'>, '>': <TokenType.GT: 'GT'>, '<': <TokenType.LT: 'LT'>, '%': <TokenType.MOD: 'MOD'>, '!': <TokenType.NOT: 'NOT'>, '|': <TokenType.PIPE: 'PIPE'>, '+': <TokenType.PLUS: 'PLUS'>, ';': <TokenType.SEMICOLON: 'SEMICOLON'>, '/': <TokenType.SLASH: 'SLASH'>, '\\': <TokenType.BACKSLASH: 'BACKSLASH'>, '*': <TokenType.STAR: 'STAR'>, '~': <TokenType.TILDA: 'TILDA'>, '?': <TokenType.PLACEHOLDER: 'PLACEHOLDER'>, '@': <TokenType.PARAMETER: 'PARAMETER'>, '#': <TokenType.HASH: 'HASH'>, "'": <TokenType.UNKNOWN: 'UNKNOWN'>, '`': <TokenType.UNKNOWN: 'UNKNOWN'>, '"': <TokenType.UNKNOWN: 'UNKNOWN'>, '$': <TokenType.PARAMETER: 'PARAMETER'>}
KEYWORDS =
{'{%': <TokenType.BLOCK_START: 'BLOCK_START'>, '{%+': <TokenType.BLOCK_START: 'BLOCK_START'>, '{%-': <TokenType.BLOCK_START: 'BLOCK_START'>, '%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '+%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '-%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '{{+': <TokenType.BLOCK_START: 'BLOCK_START'>, '{{-': <TokenType.BLOCK_START: 'BLOCK_START'>, '+}}': <TokenType.BLOCK_END: 'BLOCK_END'>, '-}}': <TokenType.BLOCK_END: 'BLOCK_END'>, '/*+': <TokenType.HINT: 'HINT'>, '==': <TokenType.EQ: 'EQ'>, '::': <TokenType.DCOLON: 'DCOLON'>, '||': <TokenType.DPIPE: 'DPIPE'>, '>=': <TokenType.GTE: 'GTE'>, '<=': <TokenType.LTE: 'LTE'>, '<>': <TokenType.NEQ: 'NEQ'>, '!=': <TokenType.NEQ: 'NEQ'>, ':=': <TokenType.COLON_EQ: 'COLON_EQ'>, '<=>': <TokenType.NULLSAFE_EQ: 'NULLSAFE_EQ'>, '->': <TokenType.ARROW: 'ARROW'>, '->>': <TokenType.DARROW: 'DARROW'>, '=>': <TokenType.FARROW: 'FARROW'>, '#>': <TokenType.HASH_ARROW: 'HASH_ARROW'>, '#>>': <TokenType.DHASH_ARROW: 'DHASH_ARROW'>, '<->': <TokenType.LR_ARROW: 'LR_ARROW'>, '&&': <TokenType.DAMP: 'DAMP'>, '??': <TokenType.DQMARK: 'DQMARK'>, '~~~': <TokenType.GLOB: 'GLOB'>, '~~': <TokenType.LIKE: 'LIKE'>, '~~*': <TokenType.ILIKE: 'ILIKE'>, '~*': <TokenType.IRLIKE: 'IRLIKE'>, 'ALL': <TokenType.ALL: 'ALL'>, 'ALWAYS': <TokenType.ALWAYS: 'ALWAYS'>, 'AND': <TokenType.AND: 'AND'>, 'ANTI': <TokenType.ANTI: 'ANTI'>, 'ANY': <TokenType.ANY: 'ANY'>, 'ASC': <TokenType.ASC: 'ASC'>, 'AS': <TokenType.ALIAS: 'ALIAS'>, 'ASOF': <TokenType.ASOF: 'ASOF'>, 'AUTOINCREMENT': <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, 'AUTO_INCREMENT': <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, 'BEGIN': <TokenType.BEGIN: 'BEGIN'>, 'BETWEEN': <TokenType.BETWEEN: 'BETWEEN'>, 'CACHE': <TokenType.CACHE: 'CACHE'>, 'UNCACHE': <TokenType.UNCACHE: 'UNCACHE'>, 'CASE': <TokenType.CASE: 'CASE'>, 'CHARACTER SET': <TokenType.CHARACTER_SET: 'CHARACTER_SET'>, 'CLUSTER BY': <TokenType.CLUSTER_BY: 'CLUSTER_BY'>, 'COLLATE': <TokenType.COLLATE: 'COLLATE'>, 'COLUMN': <TokenType.COLUMN: 'COLUMN'>, 'COMMIT': <TokenType.COMMIT: 'COMMIT'>, 'CONNECT BY': <TokenType.CONNECT_BY: 'CONNECT_BY'>, 'CONSTRAINT': <TokenType.CONSTRAINT: 'CONSTRAINT'>, 'COPY': <TokenType.COPY: 'COPY'>, 'CREATE': <TokenType.CREATE: 'CREATE'>, 'CROSS': <TokenType.CROSS: 'CROSS'>, 'CUBE': <TokenType.CUBE: 'CUBE'>, 'CURRENT_DATE': <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, 'CURRENT_TIME': <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, 'CURRENT_TIMESTAMP': <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, 'CURRENT_USER': <TokenType.CURRENT_USER: 'CURRENT_USER'>, 'DATABASE': <TokenType.DATABASE: 'DATABASE'>, 'DEFAULT': <TokenType.DEFAULT: 'DEFAULT'>, 'DELETE': <TokenType.DELETE: 'DELETE'>, 'DESC': <TokenType.DESC: 'DESC'>, 'DESCRIBE': <TokenType.DESCRIBE: 'DESCRIBE'>, 'DISTINCT': <TokenType.DISTINCT: 'DISTINCT'>, 'DISTRIBUTE BY': <TokenType.DISTRIBUTE_BY: 'DISTRIBUTE_BY'>, 'DIV': <TokenType.DIV: 'DIV'>, 'DROP': <TokenType.DROP: 'DROP'>, 'ELSE': <TokenType.ELSE: 'ELSE'>, 'END': <TokenType.END: 'END'>, 'ENUM': <TokenType.ENUM: 'ENUM'>, 'ESCAPE': <TokenType.ESCAPE: 'ESCAPE'>, 'EXCEPT': <TokenType.EXCEPT: 'EXCEPT'>, 'EXECUTE': <TokenType.EXECUTE: 'EXECUTE'>, 'EXISTS': <TokenType.EXISTS: 'EXISTS'>, 'FALSE': <TokenType.FALSE: 'FALSE'>, 'FETCH': <TokenType.FETCH: 'FETCH'>, 'FILTER': <TokenType.FILTER: 'FILTER'>, 'FIRST': <TokenType.FIRST: 'FIRST'>, 'FULL': <TokenType.FULL: 'FULL'>, 'FUNCTION': <TokenType.FUNCTION: 'FUNCTION'>, 'FOR': <TokenType.FOR: 'FOR'>, 'FOREIGN KEY': <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, 'FORMAT': <TokenType.FORMAT: 'FORMAT'>, 'FROM': <TokenType.FROM: 'FROM'>, 'GEOGRAPHY': <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, 'GEOMETRY': <TokenType.GEOMETRY: 'GEOMETRY'>, 'GLOB': <TokenType.GLOB: 'GLOB'>, 'GROUP BY': <TokenType.GROUP_BY: 'GROUP_BY'>, 'GROUPING SETS': <TokenType.GROUPING_SETS: 'GROUPING_SETS'>, 'HAVING': <TokenType.HAVING: 'HAVING'>, 'ILIKE': <TokenType.ILIKE: 'ILIKE'>, 'IN': <TokenType.IN: 'IN'>, 'INDEX': <TokenType.INDEX: 'INDEX'>, 'INET': <TokenType.INET: 'INET'>, 'INNER': <TokenType.INNER: 'INNER'>, 'INSERT': <TokenType.INSERT: 'INSERT'>, 'INTERVAL': <TokenType.INTERVAL: 'INTERVAL'>, 'INTERSECT': <TokenType.INTERSECT: 'INTERSECT'>, 'INTO': <TokenType.INTO: 'INTO'>, 'IS': <TokenType.IS: 'IS'>, 'ISNULL': <TokenType.ISNULL: 'ISNULL'>, 'JOIN': <TokenType.JOIN: 'JOIN'>, 'KEEP': <TokenType.KEEP: 'KEEP'>, 'KILL': <TokenType.KILL: 'KILL'>, 'LATERAL': <TokenType.LATERAL: 'LATERAL'>, 'LEFT': <TokenType.LEFT: 'LEFT'>, 'LIKE': <TokenType.LIKE: 'LIKE'>, 'LIMIT': <TokenType.LIMIT: 'LIMIT'>, 'LOAD': <TokenType.LOAD: 'LOAD'>, 'LOCK': <TokenType.LOCK: 'LOCK'>, 'MERGE': <TokenType.MERGE: 'MERGE'>, 'NAMESPACE': <TokenType.NAMESPACE: 'NAMESPACE'>, 'NATURAL': <TokenType.NATURAL: 'NATURAL'>, 'NEXT': <TokenType.NEXT: 'NEXT'>, 'NOT': <TokenType.NOT: 'NOT'>, 'NOTNULL': <TokenType.NOTNULL: 'NOTNULL'>, 'NULL': <TokenType.NULL: 'NULL'>, 'OBJECT': <TokenType.OBJECT: 'OBJECT'>, 'OFFSET': <TokenType.OFFSET: 'OFFSET'>, 'ON': <TokenType.ON: 'ON'>, 'OR': <TokenType.OR: 'OR'>, 'XOR': <TokenType.XOR: 'XOR'>, 'ORDER BY': <TokenType.ORDER_BY: 'ORDER_BY'>, 'ORDINALITY': <TokenType.ORDINALITY: 'ORDINALITY'>, 'OUTER': <TokenType.OUTER: 'OUTER'>, 'OVER': <TokenType.OVER: 'OVER'>, 'OVERLAPS': <TokenType.OVERLAPS: 'OVERLAPS'>, 'OVERWRITE': <TokenType.OVERWRITE: 'OVERWRITE'>, 'PARTITION': <TokenType.PARTITION: 'PARTITION'>, 'PARTITION BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PARTITIONED BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PARTITIONED_BY': <TokenType.PARTITION_BY: 'PARTITION_BY'>, 'PERCENT': <TokenType.PERCENT: 'PERCENT'>, 'PIVOT': <TokenType.PIVOT: 'PIVOT'>, 'PRAGMA': <TokenType.PRAGMA: 'PRAGMA'>, 'PRIMARY KEY': <TokenType.PRIMARY_KEY: 'PRIMARY_KEY'>, 'PROCEDURE': <TokenType.PROCEDURE: 'PROCEDURE'>, 'QUALIFY': <TokenType.QUALIFY: 'QUALIFY'>, 'RANGE': <TokenType.RANGE: 'RANGE'>, 'RECURSIVE': <TokenType.RECURSIVE: 'RECURSIVE'>, 'REGEXP': <TokenType.RLIKE: 'RLIKE'>, 'RENAME': <TokenType.RENAME: 'RENAME'>, 'REPLACE': <TokenType.REPLACE: 'REPLACE'>, 'RETURNING': <TokenType.RETURNING: 'RETURNING'>, 'REFERENCES': <TokenType.REFERENCES: 'REFERENCES'>, 'RIGHT': <TokenType.RIGHT: 'RIGHT'>, 'RLIKE': <TokenType.RLIKE: 'RLIKE'>, 'ROLLBACK': <TokenType.ROLLBACK: 'ROLLBACK'>, 'ROLLUP': <TokenType.ROLLUP: 'ROLLUP'>, 'ROW': <TokenType.ROW: 'ROW'>, 'ROWS': <TokenType.ROWS: 'ROWS'>, 'SCHEMA': <TokenType.SCHEMA: 'SCHEMA'>, 'SELECT': <TokenType.SELECT: 'SELECT'>, 'SEMI': <TokenType.SEMI: 'SEMI'>, 'SET': <TokenType.SET: 'SET'>, 'SETTINGS': <TokenType.SETTINGS: 'SETTINGS'>, 'SHOW': <TokenType.SHOW: 'SHOW'>, 'SIMILAR TO': <TokenType.SIMILAR_TO: 'SIMILAR_TO'>, 'SOME': <TokenType.SOME: 'SOME'>, 'SORT BY': <TokenType.SORT_BY: 'SORT_BY'>, 'START WITH': <TokenType.START_WITH: 'START_WITH'>, 'STRAIGHT_JOIN': <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, 'TABLE': <TokenType.TABLE: 'TABLE'>, 'TABLESAMPLE': <TokenType.TABLE_SAMPLE: 'TABLE_SAMPLE'>, 'TEMP': <TokenType.TEMPORARY: 'TEMPORARY'>, 'TEMPORARY': <TokenType.TEMPORARY: 'TEMPORARY'>, 'THEN': <TokenType.THEN: 'THEN'>, 'TRUE': <TokenType.TRUE: 'TRUE'>, 'TRUNCATE': <TokenType.TRUNCATE: 'TRUNCATE'>, 'UNION': <TokenType.UNION: 'UNION'>, 'UNKNOWN': <TokenType.UNKNOWN: 'UNKNOWN'>, 'UNNEST': <TokenType.UNNEST: 'UNNEST'>, 'UNPIVOT': <TokenType.UNPIVOT: 'UNPIVOT'>, 'UPDATE': <TokenType.UPDATE: 'UPDATE'>, 'USE': <TokenType.USE: 'USE'>, 'USING': <TokenType.USING: 'USING'>, 'UUID': <TokenType.UUID: 'UUID'>, 'VALUES': <TokenType.VALUES: 'VALUES'>, 'VIEW': <TokenType.VIEW: 'VIEW'>, 'VOLATILE': <TokenType.VOLATILE: 'VOLATILE'>, 'WHEN': <TokenType.WHEN: 'WHEN'>, 'WHERE': <TokenType.WHERE: 'WHERE'>, 'WINDOW': <TokenType.WINDOW: 'WINDOW'>, 'WITH': <TokenType.WITH: 'WITH'>, 'APPLY': <TokenType.APPLY: 'APPLY'>, 'ARRAY': <TokenType.ARRAY: 'ARRAY'>, 'BIT': <TokenType.BIT: 'BIT'>, 'BOOL': <TokenType.BOOLEAN: 'BOOLEAN'>, 'BOOLEAN': <TokenType.BOOLEAN: 'BOOLEAN'>, 'BYTE': <TokenType.TINYINT: 'TINYINT'>, 'MEDIUMINT': <TokenType.MEDIUMINT: 'MEDIUMINT'>, 'INT1': <TokenType.TINYINT: 'TINYINT'>, 'TINYINT': <TokenType.TINYINT: 'TINYINT'>, 'INT16': <TokenType.SMALLINT: 'SMALLINT'>, 'SHORT': <TokenType.SMALLINT: 'SMALLINT'>, 'SMALLINT': <TokenType.SMALLINT: 'SMALLINT'>, 'INT128': <TokenType.INT128: 'INT128'>, 'HUGEINT': <TokenType.INT128: 'INT128'>, 'UHUGEINT': <TokenType.UINT128: 'UINT128'>, 'INT2': <TokenType.SMALLINT: 'SMALLINT'>, 'INTEGER': <TokenType.INT: 'INT'>, 'INT': <TokenType.INT: 'INT'>, 'INT4': <TokenType.INT: 'INT'>, 'INT32': <TokenType.INT: 'INT'>, 'INT64': <TokenType.BIGINT: 'BIGINT'>, 'LONG': <TokenType.BIGINT: 'BIGINT'>, 'BIGINT': <TokenType.BIGINT: 'BIGINT'>, 'INT8': <TokenType.TINYINT: 'TINYINT'>, 'UINT': <TokenType.UINT: 'UINT'>, 'DEC': <TokenType.DECIMAL: 'DECIMAL'>, 'DECIMAL': <TokenType.DECIMAL: 'DECIMAL'>, 'DECIMAL32': <TokenType.DECIMAL32: 'DECIMAL32'>, 'DECIMAL64': <TokenType.DECIMAL64: 'DECIMAL64'>, 'DECIMAL128': <TokenType.DECIMAL128: 'DECIMAL128'>, 'DECIMAL256': <TokenType.DECIMAL256: 'DECIMAL256'>, 'BIGDECIMAL': <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, 'BIGNUMERIC': <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, 'LIST': <TokenType.LIST: 'LIST'>, 'MAP': <TokenType.MAP: 'MAP'>, 'NULLABLE': <TokenType.NULLABLE: 'NULLABLE'>, 'NUMBER': <TokenType.DECIMAL: 'DECIMAL'>, 'NUMERIC': <TokenType.DECIMAL: 'DECIMAL'>, 'FIXED': <TokenType.DECIMAL: 'DECIMAL'>, 'REAL': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT4': <TokenType.FLOAT: 'FLOAT'>, 'FLOAT8': <TokenType.DOUBLE: 'DOUBLE'>, 'DOUBLE': <TokenType.DOUBLE: 'DOUBLE'>, 'DOUBLE PRECISION': <TokenType.DOUBLE: 'DOUBLE'>, 'JSON': <TokenType.JSON: 'JSON'>, 'JSONB': <TokenType.JSONB: 'JSONB'>, 'CHAR': <TokenType.CHAR: 'CHAR'>, 'CHARACTER': <TokenType.CHAR: 'CHAR'>, 'NCHAR': <TokenType.NCHAR: 'NCHAR'>, 'VARCHAR': <TokenType.VARCHAR: 'VARCHAR'>, 'VARCHAR2': <TokenType.VARCHAR: 'VARCHAR'>, 'NVARCHAR': <TokenType.NVARCHAR: 'NVARCHAR'>, 'NVARCHAR2': <TokenType.NVARCHAR: 'NVARCHAR'>, 'BPCHAR': <TokenType.BPCHAR: 'BPCHAR'>, 'STR': <TokenType.TEXT: 'TEXT'>, 'STRING': <TokenType.TEXT: 'TEXT'>, 'TEXT': <TokenType.TEXT: 'TEXT'>, 'LONGTEXT': <TokenType.LONGTEXT: 'LONGTEXT'>, 'MEDIUMTEXT': <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, 'TINYTEXT': <TokenType.TINYTEXT: 'TINYTEXT'>, 'CLOB': <TokenType.TEXT: 'TEXT'>, 'LONGVARCHAR': <TokenType.TEXT: 'TEXT'>, 'BINARY': <TokenType.BINARY: 'BINARY'>, 'BLOB': <TokenType.VARBINARY: 'VARBINARY'>, 'LONGBLOB': <TokenType.LONGBLOB: 'LONGBLOB'>, 'MEDIUMBLOB': <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, 'TINYBLOB': <TokenType.TINYBLOB: 'TINYBLOB'>, 'BYTEA': <TokenType.VARBINARY: 'VARBINARY'>, 'VARBINARY': <TokenType.VARBINARY: 'VARBINARY'>, 'TIME': <TokenType.TIME: 'TIME'>, 'TIMETZ': <TokenType.TIMETZ: 'TIMETZ'>, 'TIMESTAMP': <TokenType.TIMESTAMP: 'TIMESTAMP'>, 'TIMESTAMPTZ': <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, 'TIMESTAMPLTZ': <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, 'TIMESTAMP_LTZ': <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, 'TIMESTAMPNTZ': <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, 'TIMESTAMP_NTZ': <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, 'DATE': <TokenType.DATE: 'DATE'>, 'DATETIME': <TokenType.DATETIME: 'DATETIME'>, 'INT4RANGE': <TokenType.INT4RANGE: 'INT4RANGE'>, 'INT4MULTIRANGE': <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, 'INT8RANGE': <TokenType.INT8RANGE: 'INT8RANGE'>, 'INT8MULTIRANGE': <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, 'NUMRANGE': <TokenType.NUMRANGE: 'NUMRANGE'>, 'NUMMULTIRANGE': <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, 'TSRANGE': <TokenType.TSRANGE: 'TSRANGE'>, 'TSMULTIRANGE': <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, 'TSTZRANGE': <TokenType.TSTZRANGE: 'TSTZRANGE'>, 'TSTZMULTIRANGE': <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, 'DATERANGE': <TokenType.DATERANGE: 'DATERANGE'>, 'DATEMULTIRANGE': <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, 'UNIQUE': <TokenType.UNIQUE: 'UNIQUE'>, 'VECTOR': <TokenType.VECTOR: 'VECTOR'>, 'STRUCT': <TokenType.STRUCT: 'STRUCT'>, 'SEQUENCE': <TokenType.SEQUENCE: 'SEQUENCE'>, 'VARIANT': <TokenType.VARIANT: 'VARIANT'>, 'ALTER': <TokenType.ALTER: 'ALTER'>, 'ANALYZE': <TokenType.ANALYZE: 'ANALYZE'>, 'CALL': <TokenType.COMMAND: 'COMMAND'>, 'COMMENT': <TokenType.COMMENT: 'COMMENT'>, 'EXPLAIN': <TokenType.COMMAND: 'COMMAND'>, 'GRANT': <TokenType.GRANT: 'GRANT'>, 'OPTIMIZE': <TokenType.COMMAND: 'COMMAND'>, 'PREPARE': <TokenType.COMMAND: 'COMMAND'>, 'VACUUM': <TokenType.COMMAND: 'COMMAND'>, 'USER-DEFINED': <TokenType.USERDEFINED: 'USERDEFINED'>, 'FOR VERSION': <TokenType.VERSION_SNAPSHOT: 'VERSION_SNAPSHOT'>, 'FOR TIMESTAMP': <TokenType.TIMESTAMP_SNAPSHOT: 'TIMESTAMP_SNAPSHOT'>, 'ADD ARCHIVE': <TokenType.COMMAND: 'COMMAND'>, 'ADD ARCHIVES': <TokenType.COMMAND: 'COMMAND'>, 'ADD FILE': <TokenType.COMMAND: 'COMMAND'>, 'ADD FILES': <TokenType.COMMAND: 'COMMAND'>, 'ADD JAR': <TokenType.COMMAND: 'COMMAND'>, 'ADD JARS': <TokenType.COMMAND: 'COMMAND'>, 'MINUS': <TokenType.EXCEPT: 'EXCEPT'>, 'MSCK REPAIR': <TokenType.COMMAND: 'COMMAND'>, 'REFRESH': <TokenType.REFRESH: 'REFRESH'>, 'TIMESTAMP AS OF': <TokenType.TIMESTAMP_SNAPSHOT: 'TIMESTAMP_SNAPSHOT'>, 'VERSION AS OF': <TokenType.VERSION_SNAPSHOT: 'VERSION_SNAPSHOT'>, 'SERDEPROPERTIES': <TokenType.SERDE_PROPERTIES: 'SERDE_PROPERTIES'>}
NUMERIC_LITERALS =
{'L': 'BIGINT', 'S': 'SMALLINT', 'Y': 'TINYINT', 'D': 'DOUBLE', 'F': 'FLOAT', 'BD': 'DECIMAL'}
Inherited Members
- sqlglot.tokens.Tokenizer
- Tokenizer
- BIT_STRINGS
- BYTE_STRINGS
- HEX_STRINGS
- RAW_STRINGS
- HEREDOC_STRINGS
- UNICODE_STRINGS
- VAR_SINGLE_TOKENS
- IDENTIFIER_ESCAPES
- HEREDOC_TAG_IS_IDENTIFIER
- HEREDOC_STRING_ALTERNATIVE
- STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS
- NESTED_COMMENTS
- HINT_START
- TOKENS_PRECEDING_HINT
- WHITE_SPACE
- COMMANDS
- COMMAND_PREFIX_TOKENS
- COMMENTS
- dialect
- use_rs_tokenizer
- reset
- tokenize
- tokenize_rs
- size
- sql
- tokens
274 class Parser(parser.Parser): 275 LOG_DEFAULTS_TO_LN = True 276 STRICT_CAST = False 277 VALUES_FOLLOWED_BY_PAREN = False 278 279 FUNCTIONS = { 280 **parser.Parser.FUNCTIONS, 281 "ASCII": exp.Unicode.from_arg_list, 282 "BASE64": exp.ToBase64.from_arg_list, 283 "COLLECT_LIST": lambda args: exp.ArrayAgg(this=seq_get(args, 0), nulls_excluded=True), 284 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 285 "DATE_ADD": lambda args: exp.TsOrDsAdd( 286 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 287 ), 288 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 289 [ 290 exp.TimeStrToTime(this=seq_get(args, 0)), 291 seq_get(args, 1), 292 ] 293 ), 294 "DATE_SUB": lambda args: exp.TsOrDsAdd( 295 this=seq_get(args, 0), 296 expression=exp.Mul(this=seq_get(args, 1), expression=exp.Literal.number(-1)), 297 unit=exp.Literal.string("DAY"), 298 ), 299 "DATEDIFF": lambda args: exp.DateDiff( 300 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 301 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 302 ), 303 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 304 "FIRST": _build_with_ignore_nulls(exp.First), 305 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 306 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 307 "GET_JSON_OBJECT": exp.JSONExtractScalar.from_arg_list, 308 "LAST": _build_with_ignore_nulls(exp.Last), 309 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 310 "LOCATE": locate_to_strposition, 311 "MAP": parser.build_var_map, 312 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 313 "PERCENTILE": exp.Quantile.from_arg_list, 314 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 315 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 316 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 317 "SEQUENCE": exp.GenerateSeries.from_arg_list, 318 "SIZE": exp.ArraySize.from_arg_list, 319 "SPLIT": exp.RegexpSplit.from_arg_list, 320 "STR_TO_MAP": lambda args: exp.StrToMap( 321 this=seq_get(args, 0), 322 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 323 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 324 ), 325 "TO_DATE": build_formatted_time(exp.TsOrDsToDate, "hive"), 326 "TO_JSON": exp.JSONFormat.from_arg_list, 327 "TRUNC": exp.TimestampTrunc.from_arg_list, 328 "UNBASE64": exp.FromBase64.from_arg_list, 329 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 330 args or [exp.CurrentTimestamp()] 331 ), 332 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 333 } 334 335 NO_PAREN_FUNCTION_PARSERS = { 336 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 337 "TRANSFORM": lambda self: self._parse_transform(), 338 } 339 340 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 341 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 342 343 PROPERTY_PARSERS = { 344 **parser.Parser.PROPERTY_PARSERS, 345 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 346 expressions=self._parse_wrapped_csv(self._parse_property) 347 ), 348 } 349 350 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 351 if not self._match(TokenType.L_PAREN, advance=False): 352 self._retreat(self._index - 1) 353 return None 354 355 args = self._parse_wrapped_csv(self._parse_lambda) 356 row_format_before = self._parse_row_format(match_row=True) 357 358 record_writer = None 359 if self._match_text_seq("RECORDWRITER"): 360 record_writer = self._parse_string() 361 362 if not self._match(TokenType.USING): 363 return exp.Transform.from_arg_list(args) 364 365 command_script = self._parse_string() 366 367 self._match(TokenType.ALIAS) 368 schema = self._parse_schema() 369 370 row_format_after = self._parse_row_format(match_row=True) 371 record_reader = None 372 if self._match_text_seq("RECORDREADER"): 373 record_reader = self._parse_string() 374 375 return self.expression( 376 exp.QueryTransform, 377 expressions=args, 378 command_script=command_script, 379 schema=schema, 380 row_format_before=row_format_before, 381 record_writer=record_writer, 382 row_format_after=row_format_after, 383 record_reader=record_reader, 384 ) 385 386 def _parse_types( 387 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 388 ) -> t.Optional[exp.Expression]: 389 """ 390 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 391 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 392 393 spark-sql (default)> select cast(1234 as varchar(2)); 394 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 395 char/varchar type and simply treats them as string type. Please use string type 396 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 397 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 398 399 1234 400 Time taken: 4.265 seconds, Fetched 1 row(s) 401 402 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 403 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 404 405 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 406 """ 407 this = super()._parse_types( 408 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 409 ) 410 411 if this and not schema: 412 return this.transform( 413 lambda node: ( 414 node.replace(exp.DataType.build("text")) 415 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 416 else node 417 ), 418 copy=False, 419 ) 420 421 return this 422 423 def _parse_partition_and_order( 424 self, 425 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 426 return ( 427 ( 428 self._parse_csv(self._parse_assignment) 429 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 430 else [] 431 ), 432 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 433 ) 434 435 def _parse_parameter(self) -> exp.Parameter: 436 self._match(TokenType.L_BRACE) 437 this = self._parse_identifier() or self._parse_primary_or_var() 438 expression = self._match(TokenType.COLON) and ( 439 self._parse_identifier() or self._parse_primary_or_var() 440 ) 441 self._match(TokenType.R_BRACE) 442 return self.expression(exp.Parameter, this=this, expression=expression) 443 444 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 445 if isinstance(expression, exp.Column): 446 key = expression.this 447 else: 448 key = exp.to_identifier(f"col{index + 1}") 449 450 return self.expression(exp.PropertyEQ, this=key, expression=expression)
Parser consumes a list of tokens produced by the Tokenizer and produces a parsed syntax tree.
Arguments:
- error_level: The desired error level. Default: ErrorLevel.IMMEDIATE
- error_message_context: The amount of context to capture from a query string when displaying the error message (in number of characters). Default: 100
- max_errors: Maximum number of error messages to include in a raised ParseError. This is only relevant if error_level is ErrorLevel.RAISE. Default: 3
FUNCTIONS =
{'ABS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Abs'>>, 'ADD_MONTHS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AddMonths'>>, 'ANONYMOUS_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AnonymousAggFunc'>>, 'ANY_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AnyValue'>>, 'APPLY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Apply'>>, 'APPROX_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxDistinct'>>, 'APPROX_COUNT_DISTINCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxDistinct'>>, 'APPROX_QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxQuantile'>>, 'APPROX_TOP_K': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxTopK'>>, 'ARG_MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'ARGMAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'MAX_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMax'>>, 'ARG_MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'ARGMIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'MIN_BY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArgMin'>>, 'ARRAY': <function Parser.<lambda>>, 'ARRAY_AGG': <function Parser.<lambda>>, 'ARRAY_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayAll'>>, 'ARRAY_ANY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayAny'>>, 'ARRAY_CONCAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConcat'>>, 'ARRAY_CAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConcat'>>, 'ARRAY_CONSTRUCT_COMPACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConstructCompact'>>, 'ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContains'>>, 'ARRAY_HAS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContains'>>, 'ARRAY_CONTAINS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContainsAll'>>, 'ARRAY_HAS_ALL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayContainsAll'>>, 'FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayFilter'>>, 'ARRAY_FILTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayFilter'>>, 'ARRAY_OVERLAPS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayOverlaps'>>, 'ARRAY_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySize'>>, 'ARRAY_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySize'>>, 'ARRAY_SORT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySort'>>, 'ARRAY_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySum'>>, 'ARRAY_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayToString'>>, 'ARRAY_JOIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayToString'>>, 'ARRAY_UNION_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayUnionAgg'>>, 'ARRAY_UNIQUE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayUniqueAgg'>>, 'AVG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Avg'>>, 'CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Case'>>, 'CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cast'>>, 'CAST_TO_STR_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CastToStrType'>>, 'CBRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cbrt'>>, 'CEIL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ceil'>>, 'CEILING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ceil'>>, 'CHR': <function Parser.<lambda>>, 'CHAR': <function Parser.<lambda>>, 'COALESCE': <function build_coalesce>, 'IFNULL': <function build_coalesce>, 'NVL': <function build_coalesce>, 'COLLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Collate'>>, 'COLUMNS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Columns'>>, 'COMBINED_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CombinedAggFunc'>>, 'COMBINED_PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CombinedParameterizedAgg'>>, 'CONCAT': <function Parser.<lambda>>, 'CONCAT_WS': <function Parser.<lambda>>, 'CONNECT_BY_ROOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ConnectByRoot'>>, 'CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Contains'>>, 'CONVERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Convert'>>, 'CONVERT_TIMEZONE': <function build_convert_timezone>, 'CORR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Corr'>>, 'COUNT': <function Parser.<lambda>>, 'COUNT_IF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CountIf'>>, 'COUNTIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CountIf'>>, 'COVAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CovarPop'>>, 'COVAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CovarSamp'>>, 'CURRENT_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentDate'>>, 'CURRENT_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentDatetime'>>, 'CURRENT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTime'>>, 'CURRENT_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTimestamp'>>, 'CURRENT_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentUser'>>, 'DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Date'>>, 'DATE_ADD': <function Hive.Parser.<lambda>>, 'DATEDIFF': <function Hive.Parser.<lambda>>, 'DATE_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateDiff'>>, 'DATE_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromParts'>>, 'DATEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromParts'>>, 'DATE_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateStrToDate'>>, 'DATE_SUB': <function Hive.Parser.<lambda>>, 'DATE_TO_DATE_STR': <function Parser.<lambda>>, 'DATE_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateToDi'>>, 'DATE_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateTrunc'>>, 'DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Datetime'>>, 'DATETIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeAdd'>>, 'DATETIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeDiff'>>, 'DATETIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeSub'>>, 'DATETIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DatetimeTrunc'>>, 'DAY': <function Hive.Parser.<lambda>>, 'DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfMonth'>>, 'DAYOFMONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfMonth'>>, 'DAY_OF_WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfWeek'>>, 'DAYOFWEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfWeek'>>, 'DAYOFWEEK_ISO': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfWeekIso'>>, 'ISODOW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfWeekIso'>>, 'DAY_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfYear'>>, 'DAYOFYEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DayOfYear'>>, 'DECODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Decode'>>, 'DI_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DiToDate'>>, 'ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Encode'>>, 'EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Exists'>>, 'EXP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Exp'>>, 'EXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Explode'>>, 'EXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ExplodeOuter'>>, 'EXPLODING_GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ExplodingGenerateSeries'>>, 'EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Extract'>>, 'FEATURES_AT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FeaturesAtTime'>>, 'FIRST': <function _build_with_ignore_nulls.<locals>._parse>, 'FIRST_VALUE': <function _build_with_ignore_nulls.<locals>._parse>, 'FLATTEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Flatten'>>, 'FLOOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Floor'>>, 'FROM_BASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase'>>, 'FROM_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase64'>>, 'FROM_ISO8601_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromISO8601Timestamp'>>, 'GAP_FILL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GapFill'>>, 'GENERATE_DATE_ARRAY': <function Parser.<lambda>>, 'GENERATE_SERIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GenerateSeries'>>, 'GENERATE_TIMESTAMP_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GenerateTimestampArray'>>, 'GREATEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Greatest'>>, 'GROUP_CONCAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GroupConcat'>>, 'HEX': <function build_hex>, 'HLL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Hll'>>, 'IF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.If'>>, 'IIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.If'>>, 'INITCAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Initcap'>>, 'INLINE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Inline'>>, 'INT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Int64'>>, 'IS_ASCII': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsAscii'>>, 'IS_INF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsInf'>>, 'ISINF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsInf'>>, 'IS_NAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsNan'>>, 'ISNAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.IsNan'>>, 'J_S_O_N_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArray'>>, 'J_S_O_N_ARRAY_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayAgg'>>, 'JSON_ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayContains'>>, 'JSONB_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBContains'>>, 'JSONB_EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBExists'>>, 'JSONB_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBExtract'>>, 'JSONB_EXTRACT_SCALAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBExtractScalar'>>, 'J_S_O_N_EXISTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONExists'>>, 'JSON_EXTRACT': <function build_extract_json_with_path.<locals>._builder>, 'JSON_EXTRACT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONExtractArray'>>, 'JSON_EXTRACT_SCALAR': <function build_extract_json_with_path.<locals>._builder>, 'JSON_FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONFormat'>>, 'J_S_O_N_OBJECT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONObject'>>, 'J_S_O_N_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONObjectAgg'>>, 'J_S_O_N_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONTable'>>, 'J_S_O_N_VALUE_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONValueArray'>>, 'LAG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lag'>>, 'LAST': <function _build_with_ignore_nulls.<locals>._parse>, 'LAST_DAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LastDay'>>, 'LAST_DAY_OF_MONTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LastDay'>>, 'LAST_VALUE': <function _build_with_ignore_nulls.<locals>._parse>, 'LEAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lead'>>, 'LEAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Least'>>, 'LEFT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Left'>>, 'LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'LEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'CHAR_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'CHARACTER_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Length'>>, 'LEVENSHTEIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Levenshtein'>>, 'LIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.List'>>, 'LN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ln'>>, 'LOG': <function build_logarithm>, 'LOGICAL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'BOOL_AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'BOOLAND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalAnd'>>, 'LOGICAL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'BOOL_OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'BOOLOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LogicalOr'>>, 'LOWER': <function build_lower>, 'LCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Lower'>>, 'LOWER_HEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LowerHex'>>, 'MD5': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5'>>, 'MD5_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5Digest'>>, 'MAKE_INTERVAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MakeInterval'>>, 'MAP': <function build_var_map>, 'MAP_FROM_ENTRIES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MapFromEntries'>>, 'MATCH_AGAINST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MatchAgainst'>>, 'MAX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Max'>>, 'MEDIAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Median'>>, 'MIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Min'>>, 'MONTH': <function Hive.Parser.<lambda>>, 'MONTHS_BETWEEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MonthsBetween'>>, 'NEXT_VALUE_FOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NextValueFor'>>, 'NORMALIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Normalize'>>, 'NTH_VALUE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NthValue'>>, 'NULLIF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Nullif'>>, 'NUMBER_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.NumberToStr'>>, 'NVL2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Nvl2'>>, 'OBJECT_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ObjectInsert'>>, 'OPEN_J_S_O_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.OpenJSON'>>, 'OVERLAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Overlay'>>, 'PAD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pad'>>, 'PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParameterizedAgg'>>, 'PARSE_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseJSON'>>, 'JSON_PARSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseJSON'>>, 'PERCENTILE_CONT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PercentileCont'>>, 'PERCENTILE_DISC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PercentileDisc'>>, 'POSEXPLODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Posexplode'>>, 'POSEXPLODE_OUTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PosexplodeOuter'>>, 'POWER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pow'>>, 'POW': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Pow'>>, 'PREDICT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Predict'>>, 'QUANTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Quantile'>>, 'QUARTER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Quarter'>>, 'RAND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rand'>>, 'RANDOM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rand'>>, 'RANDN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Randn'>>, 'RANGE_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RangeN'>>, 'READ_CSV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ReadCSV'>>, 'REDUCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Reduce'>>, 'REGEXP_EXTRACT': <function build_regexp_extract.<locals>._builder>, 'REGEXP_EXTRACT_ALL': <function build_regexp_extract.<locals>._builder>, 'REGEXP_I_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpILike'>>, 'REGEXP_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpLike'>>, 'REGEXP_REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpReplace'>>, 'REGEXP_SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpSplit'>>, 'REPEAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Repeat'>>, 'RIGHT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Right'>>, 'ROUND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Round'>>, 'ROW_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RowNumber'>>, 'SHA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA2'>>, 'SAFE_DIVIDE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeDivide'>>, 'SIGN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SIGNUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SORT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SortArray'>>, 'SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpSplit'>>, 'SPLIT_PART': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SplitPart'>>, 'SQRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sqrt'>>, 'STANDARD_HASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StandardHash'>>, 'STAR_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StarMap'>>, 'STARTS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STARTSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STDDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDDEV_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevPop'>>, 'STDDEV_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevSamp'>>, 'STR_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrPosition'>>, 'STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToDate'>>, 'STR_TO_MAP': <function Hive.Parser.<lambda>>, 'STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToTime'>>, 'STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToUnix'>>, 'STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.String'>>, 'STRING_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'SPLIT_BY_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'STRUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Struct'>>, 'STRUCT_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StructExtract'>>, 'STUFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'SUBSTRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Substring'>>, 'SUBSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Substring'>>, 'SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sum'>>, 'TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Time'>>, 'TIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeAdd'>>, 'TIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeDiff'>>, 'TIME_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'TIMEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'TIME_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToDate'>>, 'TIME_STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToTime'>>, 'TIME_STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToUnix'>>, 'TIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeSub'>>, 'TIME_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeToStr'>>, 'TIME_TO_TIME_STR': <function Parser.<lambda>>, 'TIME_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeToUnix'>>, 'TIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeTrunc'>>, 'TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Timestamp'>>, 'TIMESTAMP_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampAdd'>>, 'TIMESTAMPDIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampDiff'>>, 'TIMESTAMP_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampDiff'>>, 'TIMESTAMP_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampFromParts'>>, 'TIMESTAMPFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampFromParts'>>, 'TIMESTAMP_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampSub'>>, 'TIMESTAMP_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampTrunc'>>, 'TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToArray'>>, 'TO_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToBase64'>>, 'TO_CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToChar'>>, 'TO_DAYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToDays'>>, 'TO_DOUBLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToDouble'>>, 'TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToMap'>>, 'TO_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToNumber'>>, 'TRANSFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Transform'>>, 'TRIM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Trim'>>, 'TRY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Try'>>, 'TRY_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryCast'>>, 'TS_OR_DI_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDiToDi'>>, 'TS_OR_DS_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsAdd'>>, 'TS_OR_DS_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsDiff'>>, 'TS_OR_DS_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToDate'>>, 'TS_OR_DS_TO_DATE_STR': <function Parser.<lambda>>, 'TS_OR_DS_TO_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToDatetime'>>, 'TS_OR_DS_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToTime'>>, 'TS_OR_DS_TO_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToTimestamp'>>, 'UNHEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Unhex'>>, 'UNICODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Unicode'>>, 'UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixDate'>>, 'UNIX_SECONDS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixSeconds'>>, 'UNIX_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToStr'>>, 'UNIX_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToTime'>>, 'UNIX_TO_TIME_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToTimeStr'>>, 'UNNEST': <function Parser.<lambda>>, 'UPPER': <function build_upper>, 'UCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Upper'>>, 'UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'GEN_RANDOM_UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'GENERATE_UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'UUID_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'VAR_MAP': <function build_var_map>, 'VARIANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VARIANCE_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VARIANCE_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VariancePop'>>, 'VAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VariancePop'>>, 'WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Week'>>, 'WEEK_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.WeekOfYear'>>, 'WEEKOFYEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.WeekOfYear'>>, 'XMLELEMENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.XMLElement'>>, 'X_M_L_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.XMLTable'>>, 'XOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Xor'>>, 'YEAR': <function Hive.Parser.<lambda>>, 'ARRAYAGG': <function Parser.<lambda>>, 'GLOB': <function Parser.<lambda>>, 'INSTR': <function Parser.<lambda>>, 'JSON_EXTRACT_PATH_TEXT': <function build_extract_json_with_path.<locals>._builder>, 'LIKE': <function build_like>, 'LOG2': <function Parser.<lambda>>, 'LOG10': <function Parser.<lambda>>, 'LPAD': <function Parser.<lambda>>, 'LEFTPAD': <function Parser.<lambda>>, 'LTRIM': <function Parser.<lambda>>, 'MOD': <function build_mod>, 'RIGHTPAD': <function Parser.<lambda>>, 'RPAD': <function Parser.<lambda>>, 'RTRIM': <function Parser.<lambda>>, 'SCOPE_RESOLUTION': <function Parser.<lambda>>, 'TO_HEX': <function build_hex>, 'ASCII': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Unicode'>>, 'BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToBase64'>>, 'COLLECT_LIST': <function Hive.Parser.<lambda>>, 'COLLECT_SET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayUniqueAgg'>>, 'DATE_FORMAT': <function Hive.Parser.<lambda>>, 'FROM_UNIXTIME': <function build_formatted_time.<locals>._builder>, 'GET_JSON_OBJECT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONExtractScalar'>>, 'LOCATE': <function locate_to_strposition>, 'PERCENTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Quantile'>>, 'PERCENTILE_APPROX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxQuantile'>>, 'SEQUENCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GenerateSeries'>>, 'SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySize'>>, 'TO_DATE': <function build_formatted_time.<locals>._builder>, 'TO_JSON': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONFormat'>>, 'TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampTrunc'>>, 'UNBASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase64'>>, 'UNIX_TIMESTAMP': <function Hive.Parser.<lambda>>}
NO_PAREN_FUNCTION_PARSERS =
{'ANY': <function Parser.<lambda>>, 'CASE': <function Parser.<lambda>>, 'CONNECT_BY_ROOT': <function Parser.<lambda>>, 'IF': <function Parser.<lambda>>, 'TRANSFORM': <function Hive.Parser.<lambda>>}
NO_PAREN_FUNCTIONS =
{<TokenType.CURRENT_DATE: 'CURRENT_DATE'>: <class 'sqlglot.expressions.CurrentDate'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>: <class 'sqlglot.expressions.CurrentDate'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>: <class 'sqlglot.expressions.CurrentTimestamp'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>: <class 'sqlglot.expressions.CurrentUser'>}
PROPERTY_PARSERS =
{'ALLOWED_VALUES': <function Parser.<lambda>>, 'ALGORITHM': <function Parser.<lambda>>, 'AUTO': <function Parser.<lambda>>, 'AUTO_INCREMENT': <function Parser.<lambda>>, 'BACKUP': <function Parser.<lambda>>, 'BLOCKCOMPRESSION': <function Parser.<lambda>>, 'CHARSET': <function Parser.<lambda>>, 'CHARACTER SET': <function Parser.<lambda>>, 'CHECKSUM': <function Parser.<lambda>>, 'CLUSTER BY': <function Parser.<lambda>>, 'CLUSTERED': <function Parser.<lambda>>, 'COLLATE': <function Parser.<lambda>>, 'COMMENT': <function Parser.<lambda>>, 'CONTAINS': <function Parser.<lambda>>, 'COPY': <function Parser.<lambda>>, 'DATABLOCKSIZE': <function Parser.<lambda>>, 'DATA_DELETION': <function Parser.<lambda>>, 'DEFINER': <function Parser.<lambda>>, 'DETERMINISTIC': <function Parser.<lambda>>, 'DISTRIBUTED': <function Parser.<lambda>>, 'DUPLICATE': <function Parser.<lambda>>, 'DYNAMIC': <function Parser.<lambda>>, 'DISTKEY': <function Parser.<lambda>>, 'DISTSTYLE': <function Parser.<lambda>>, 'EMPTY': <function Parser.<lambda>>, 'ENGINE': <function Parser.<lambda>>, 'EXECUTE': <function Parser.<lambda>>, 'EXTERNAL': <function Parser.<lambda>>, 'FALLBACK': <function Parser.<lambda>>, 'FORMAT': <function Parser.<lambda>>, 'FREESPACE': <function Parser.<lambda>>, 'GLOBAL': <function Parser.<lambda>>, 'HEAP': <function Parser.<lambda>>, 'ICEBERG': <function Parser.<lambda>>, 'IMMUTABLE': <function Parser.<lambda>>, 'INHERITS': <function Parser.<lambda>>, 'INPUT': <function Parser.<lambda>>, 'JOURNAL': <function Parser.<lambda>>, 'LANGUAGE': <function Parser.<lambda>>, 'LAYOUT': <function Parser.<lambda>>, 'LIFETIME': <function Parser.<lambda>>, 'LIKE': <function Parser.<lambda>>, 'LOCATION': <function Parser.<lambda>>, 'LOCK': <function Parser.<lambda>>, 'LOCKING': <function Parser.<lambda>>, 'LOG': <function Parser.<lambda>>, 'MATERIALIZED': <function Parser.<lambda>>, 'MERGEBLOCKRATIO': <function Parser.<lambda>>, 'MODIFIES': <function Parser.<lambda>>, 'MULTISET': <function Parser.<lambda>>, 'NO': <function Parser.<lambda>>, 'ON': <function Parser.<lambda>>, 'ORDER BY': <function Parser.<lambda>>, 'OUTPUT': <function Parser.<lambda>>, 'PARTITION': <function Parser.<lambda>>, 'PARTITION BY': <function Parser.<lambda>>, 'PARTITIONED BY': <function Parser.<lambda>>, 'PARTITIONED_BY': <function Parser.<lambda>>, 'PRIMARY KEY': <function Parser.<lambda>>, 'RANGE': <function Parser.<lambda>>, 'READS': <function Parser.<lambda>>, 'REMOTE': <function Parser.<lambda>>, 'RETURNS': <function Parser.<lambda>>, 'STRICT': <function Parser.<lambda>>, 'STREAMING': <function Parser.<lambda>>, 'ROW': <function Parser.<lambda>>, 'ROW_FORMAT': <function Parser.<lambda>>, 'SAMPLE': <function Parser.<lambda>>, 'SECURE': <function Parser.<lambda>>, 'SECURITY': <function Parser.<lambda>>, 'SET': <function Parser.<lambda>>, 'SETTINGS': <function Parser.<lambda>>, 'SHARING': <function Parser.<lambda>>, 'SORTKEY': <function Parser.<lambda>>, 'SOURCE': <function Parser.<lambda>>, 'STABLE': <function Parser.<lambda>>, 'STORED': <function Parser.<lambda>>, 'SYSTEM_VERSIONING': <function Parser.<lambda>>, 'TBLPROPERTIES': <function Parser.<lambda>>, 'TEMP': <function Parser.<lambda>>, 'TEMPORARY': <function Parser.<lambda>>, 'TO': <function Parser.<lambda>>, 'TRANSIENT': <function Parser.<lambda>>, 'TRANSFORM': <function Parser.<lambda>>, 'TTL': <function Parser.<lambda>>, 'USING': <function Parser.<lambda>>, 'UNLOGGED': <function Parser.<lambda>>, 'VOLATILE': <function Parser.<lambda>>, 'WITH': <function Parser.<lambda>>, 'SERDEPROPERTIES': <function Hive.Parser.<lambda>>}
ID_VAR_TOKENS =
{<TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.INDEX: 'INDEX'>, <TokenType.USE: 'USE'>, <TokenType.MONEY: 'MONEY'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.INT128: 'INT128'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.TOP: 'TOP'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.INT: 'INT'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.SET: 'SET'>, <TokenType.SHOW: 'SHOW'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.LIST: 'LIST'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.SINK: 'SINK'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.MODEL: 'MODEL'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.UUID: 'UUID'>, <TokenType.NULL: 'NULL'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.NATURAL: 'NATURAL'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.SEMI: 'SEMI'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.APPLY: 'APPLY'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.LOAD: 'LOAD'>, <TokenType.FILTER: 'FILTER'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.RENAME: 'RENAME'>, <TokenType.TEXT: 'TEXT'>, <TokenType.CUBE: 'CUBE'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.ANTI: 'ANTI'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.UINT256: 'UINT256'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.KILL: 'KILL'>, <TokenType.NAME: 'NAME'>, <TokenType.DESC: 'DESC'>, <TokenType.IPV4: 'IPV4'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.TRUE: 'TRUE'>, <TokenType.YEAR: 'YEAR'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.MERGE: 'MERGE'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.IPV6: 'IPV6'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.DATE32: 'DATE32'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.ASOF: 'ASOF'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.ALL: 'ALL'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.INT256: 'INT256'>, <TokenType.BIT: 'BIT'>, <TokenType.BINARY: 'BINARY'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.FIRST: 'FIRST'>, <TokenType.DATE: 'DATE'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.TIME: 'TIME'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.RING: 'RING'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.FULL: 'FULL'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.ROW: 'ROW'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.DELETE: 'DELETE'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.LEFT: 'LEFT'>, <TokenType.ROWS: 'ROWS'>, <TokenType.TABLE: 'TABLE'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.JSONB: 'JSONB'>, <TokenType.ANY: 'ANY'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.END: 'END'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.XML: 'XML'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.DETACH: 'DETACH'>, <TokenType.SOME: 'SOME'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.INET: 'INET'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.FALSE: 'FALSE'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.DIV: 'DIV'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.VAR: 'VAR'>, <TokenType.CASE: 'CASE'>, <TokenType.COPY: 'COPY'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.NEXT: 'NEXT'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.JSON: 'JSON'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.TAG: 'TAG'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.POINT: 'POINT'>, <TokenType.KEEP: 'KEEP'>, <TokenType.MAP: 'MAP'>, <TokenType.FINAL: 'FINAL'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.RANGE: 'RANGE'>, <TokenType.VIEW: 'VIEW'>, <TokenType.ENUM: 'ENUM'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.CHAR: 'CHAR'>, <TokenType.UINT128: 'UINT128'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.CACHE: 'CACHE'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.IS: 'IS'>, <TokenType.UINT: 'UINT'>, <TokenType.SUPER: 'SUPER'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.ASC: 'ASC'>, <TokenType.FLOAT: 'FLOAT'>}
TABLE_ALIAS_TOKENS =
{<TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.INDEX: 'INDEX'>, <TokenType.USE: 'USE'>, <TokenType.MONEY: 'MONEY'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.INT128: 'INT128'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.TOP: 'TOP'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.INT: 'INT'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.SET: 'SET'>, <TokenType.SHOW: 'SHOW'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.LIST: 'LIST'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.SINK: 'SINK'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.MODEL: 'MODEL'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.UUID: 'UUID'>, <TokenType.NULL: 'NULL'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.LOAD: 'LOAD'>, <TokenType.FILTER: 'FILTER'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.RENAME: 'RENAME'>, <TokenType.TEXT: 'TEXT'>, <TokenType.CUBE: 'CUBE'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.UINT256: 'UINT256'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.KILL: 'KILL'>, <TokenType.NAME: 'NAME'>, <TokenType.DESC: 'DESC'>, <TokenType.IPV4: 'IPV4'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.TRUE: 'TRUE'>, <TokenType.YEAR: 'YEAR'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.MERGE: 'MERGE'>, <TokenType.IPV6: 'IPV6'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.DATE32: 'DATE32'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.ALL: 'ALL'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.INT256: 'INT256'>, <TokenType.BIT: 'BIT'>, <TokenType.BINARY: 'BINARY'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.FIRST: 'FIRST'>, <TokenType.DATE: 'DATE'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.TIME: 'TIME'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.RING: 'RING'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.ROW: 'ROW'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.DELETE: 'DELETE'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.ROWS: 'ROWS'>, <TokenType.TABLE: 'TABLE'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.JSONB: 'JSONB'>, <TokenType.ANY: 'ANY'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.END: 'END'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.XML: 'XML'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.DETACH: 'DETACH'>, <TokenType.SOME: 'SOME'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.INET: 'INET'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.FALSE: 'FALSE'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.DIV: 'DIV'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.VAR: 'VAR'>, <TokenType.CASE: 'CASE'>, <TokenType.COPY: 'COPY'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.NEXT: 'NEXT'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.JSON: 'JSON'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.TAG: 'TAG'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.POINT: 'POINT'>, <TokenType.KEEP: 'KEEP'>, <TokenType.MAP: 'MAP'>, <TokenType.FINAL: 'FINAL'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.RANGE: 'RANGE'>, <TokenType.VIEW: 'VIEW'>, <TokenType.ENUM: 'ENUM'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.CHAR: 'CHAR'>, <TokenType.UINT128: 'UINT128'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.CACHE: 'CACHE'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.IS: 'IS'>, <TokenType.UINT: 'UINT'>, <TokenType.SUPER: 'SUPER'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.ASC: 'ASC'>, <TokenType.FLOAT: 'FLOAT'>}
SET_TRIE: Dict =
{'GLOBAL': {0: True}, 'LOCAL': {0: True}, 'SESSION': {0: True}, 'TRANSACTION': {0: True}}
Inherited Members
- sqlglot.parser.Parser
- Parser
- STRUCT_TYPE_TOKENS
- NESTED_TYPE_TOKENS
- ENUM_TYPE_TOKENS
- AGGREGATE_TYPE_TOKENS
- TYPE_TOKENS
- SIGNED_TO_UNSIGNED_TYPE_TOKEN
- SUBQUERY_PREDICATES
- RESERVED_TOKENS
- DB_CREATABLES
- CREATABLES
- ALTERABLES
- INTERVAL_VARS
- ALIAS_TOKENS
- ARRAY_CONSTRUCTORS
- COMMENT_TABLE_ALIAS_TOKENS
- UPDATE_ALIAS_TOKENS
- TRIM_TYPES
- FUNC_TOKENS
- CONJUNCTION
- ASSIGNMENT
- DISJUNCTION
- EQUALITY
- COMPARISON
- BITWISE
- TERM
- FACTOR
- EXPONENT
- TIMES
- TIMESTAMPS
- SET_OPERATIONS
- JOIN_METHODS
- JOIN_SIDES
- JOIN_KINDS
- JOIN_HINTS
- LAMBDAS
- COLUMN_OPERATORS
- EXPRESSION_PARSERS
- STATEMENT_PARSERS
- UNARY_PARSERS
- STRING_PARSERS
- NUMERIC_PARSERS
- PRIMARY_PARSERS
- PLACEHOLDER_PARSERS
- RANGE_PARSERS
- CONSTRAINT_PARSERS
- ALTER_PARSERS
- ALTER_ALTER_PARSERS
- SCHEMA_UNNAMED_CONSTRAINTS
- INVALID_FUNC_NAME_TOKENS
- FUNCTIONS_WITH_ALIASED_ARGS
- KEY_VALUE_DEFINITIONS
- FUNCTION_PARSERS
- QUERY_MODIFIER_PARSERS
- SET_PARSERS
- SHOW_PARSERS
- TYPE_LITERAL_PARSERS
- TYPE_CONVERTERS
- DDL_SELECT_TOKENS
- PRE_VOLATILE_TOKENS
- TRANSACTION_KIND
- TRANSACTION_CHARACTERISTICS
- CONFLICT_ACTIONS
- CREATE_SEQUENCE
- ISOLATED_LOADING_OPTIONS
- USABLES
- CAST_ACTIONS
- SCHEMA_BINDING_OPTIONS
- PROCEDURE_OPTIONS
- EXECUTE_AS_OPTIONS
- KEY_CONSTRAINT_OPTIONS
- INSERT_ALTERNATIVES
- CLONE_KEYWORDS
- HISTORICAL_DATA_PREFIX
- HISTORICAL_DATA_KIND
- OPCLASS_FOLLOW_KEYWORDS
- OPTYPE_FOLLOW_TOKENS
- TABLE_INDEX_HINT_TOKENS
- VIEW_ATTRIBUTES
- WINDOW_ALIAS_TOKENS
- WINDOW_BEFORE_PAREN_TOKENS
- WINDOW_SIDES
- JSON_KEY_VALUE_SEPARATOR_TOKENS
- FETCH_TOKENS
- ADD_CONSTRAINT_TOKENS
- DISTINCT_TOKENS
- NULL_TOKENS
- UNNEST_OFFSET_ALIAS_TOKENS
- SELECT_START_TOKENS
- COPY_INTO_VARLEN_OPTIONS
- IS_JSON_PREDICATE_KIND
- ODBC_DATETIME_LITERALS
- ON_CONDITION_TOKENS
- PRIVILEGE_FOLLOW_TOKENS
- DESCRIBE_STYLES
- ANALYZE_STYLES
- ANALYZE_EXPRESSION_PARSERS
- PARTITION_KEYWORDS
- AMBIGUOUS_ALIAS_TOKENS
- OPERATION_MODIFIERS
- PREFIXED_PIVOT_COLUMNS
- IDENTIFY_PIVOT_STRINGS
- ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMN
- TABLESAMPLE_CSV
- DEFAULT_SAMPLING_METHOD
- SET_REQUIRES_ASSIGNMENT_DELIMITER
- TRIM_PATTERN_FIRST
- STRING_ALIASES
- MODIFIERS_ATTACHED_TO_SET_OP
- SET_OP_MODIFIERS
- NO_PAREN_IF_COMMANDS
- JSON_ARROWS_REQUIRE_JSON_TYPE
- COLON_IS_VARIANT_EXTRACT
- SUPPORTS_IMPLICIT_UNNEST
- INTERVAL_SPANS
- SUPPORTS_PARTITION_SELECTION
- WRAPPED_TRANSFORM_COLUMN_CONSTRAINT
- OPTIONAL_ALIAS_TOKEN_CTE
- error_level
- error_message_context
- max_errors
- dialect
- reset
- parse
- parse_into
- check_errors
- raise_error
- expression
- validate_expression
- errors
- sql
452 class Generator(generator.Generator): 453 LIMIT_FETCH = "LIMIT" 454 TABLESAMPLE_WITH_METHOD = False 455 JOIN_HINTS = False 456 TABLE_HINTS = False 457 QUERY_HINTS = False 458 INDEX_ON = "ON TABLE" 459 EXTRACT_ALLOWS_QUOTES = False 460 NVL2_SUPPORTED = False 461 LAST_DAY_SUPPORTS_DATE_PART = False 462 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 463 SUPPORTS_TO_NUMBER = False 464 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 465 PARSE_JSON_NAME = None 466 PAD_FILL_PATTERN_IS_REQUIRED = True 467 SUPPORTS_MEDIAN = False 468 ARRAY_SIZE_NAME = "SIZE" 469 470 EXPRESSIONS_WITHOUT_NESTED_CTES = { 471 exp.Insert, 472 exp.Select, 473 exp.Subquery, 474 exp.SetOperation, 475 } 476 477 SUPPORTED_JSON_PATH_PARTS = { 478 exp.JSONPathKey, 479 exp.JSONPathRoot, 480 exp.JSONPathSubscript, 481 exp.JSONPathWildcard, 482 } 483 484 TYPE_MAPPING = { 485 **generator.Generator.TYPE_MAPPING, 486 exp.DataType.Type.BIT: "BOOLEAN", 487 exp.DataType.Type.DATETIME: "TIMESTAMP", 488 exp.DataType.Type.ROWVERSION: "BINARY", 489 exp.DataType.Type.TEXT: "STRING", 490 exp.DataType.Type.TIME: "TIMESTAMP", 491 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 492 exp.DataType.Type.UTINYINT: "SMALLINT", 493 exp.DataType.Type.VARBINARY: "BINARY", 494 } 495 496 TRANSFORMS = { 497 **generator.Generator.TRANSFORMS, 498 exp.Group: transforms.preprocess([transforms.unalias_group]), 499 exp.Property: property_sql, 500 exp.AnyValue: rename_func("FIRST"), 501 exp.ApproxDistinct: approx_count_distinct_sql, 502 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 503 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 504 exp.ArrayConcat: rename_func("CONCAT"), 505 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 506 exp.ArraySort: _array_sort_sql, 507 exp.With: no_recursive_cte_sql, 508 exp.DateAdd: _add_date_sql, 509 exp.DateDiff: _date_diff_sql, 510 exp.DateStrToDate: datestrtodate_sql, 511 exp.DateSub: _add_date_sql, 512 exp.DateToDi: lambda self, 513 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 514 exp.DiToDate: lambda self, 515 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 516 exp.FileFormatProperty: lambda self, 517 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 518 exp.FromBase64: rename_func("UNBASE64"), 519 exp.GenerateSeries: sequence_sql, 520 exp.GenerateDateArray: sequence_sql, 521 exp.If: if_sql(), 522 exp.ILike: no_ilike_sql, 523 exp.IsNan: rename_func("ISNAN"), 524 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 525 exp.JSONExtractScalar: lambda self, e: self.func( 526 "GET_JSON_OBJECT", e.this, e.expression 527 ), 528 exp.JSONFormat: _json_format_sql, 529 exp.Left: left_to_substring_sql, 530 exp.Map: var_map_sql, 531 exp.Max: max_or_greatest, 532 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 533 exp.Min: min_or_least, 534 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 535 exp.NotNullColumnConstraint: lambda _, e: ( 536 "" if e.args.get("allow_null") else "NOT NULL" 537 ), 538 exp.VarMap: var_map_sql, 539 exp.Create: preprocess( 540 [ 541 remove_unique_constraints, 542 ctas_with_tmp_tables_to_create_tmp_view, 543 move_schema_columns_to_partitioned_by, 544 ] 545 ), 546 exp.Quantile: rename_func("PERCENTILE"), 547 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 548 exp.RegexpExtract: regexp_extract_sql, 549 exp.RegexpExtractAll: regexp_extract_sql, 550 exp.RegexpReplace: regexp_replace_sql, 551 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 552 exp.RegexpSplit: rename_func("SPLIT"), 553 exp.Right: right_to_substring_sql, 554 exp.SafeDivide: no_safe_divide_sql, 555 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 556 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 557 exp.Split: lambda self, e: self.func( 558 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 559 ), 560 exp.Select: transforms.preprocess( 561 [ 562 transforms.eliminate_qualify, 563 transforms.eliminate_distinct_on, 564 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 565 transforms.any_to_exists, 566 ] 567 ), 568 exp.StrPosition: strposition_to_locate_sql, 569 exp.StrToDate: _str_to_date_sql, 570 exp.StrToTime: _str_to_time_sql, 571 exp.StrToUnix: _str_to_unix_sql, 572 exp.StructExtract: struct_extract_sql, 573 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 574 exp.TimeStrToDate: rename_func("TO_DATE"), 575 exp.TimeStrToTime: timestrtotime_sql, 576 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 577 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 578 exp.TimeToStr: lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)), 579 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 580 exp.ToBase64: rename_func("BASE64"), 581 exp.TsOrDiToDi: lambda self, 582 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 583 exp.TsOrDsAdd: _add_date_sql, 584 exp.TsOrDsDiff: _date_diff_sql, 585 exp.TsOrDsToDate: _to_date_sql, 586 exp.TryCast: no_trycast_sql, 587 exp.Unicode: rename_func("ASCII"), 588 exp.UnixToStr: lambda self, e: self.func( 589 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 590 ), 591 exp.UnixToTime: _unix_to_time_sql, 592 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 593 exp.Unnest: rename_func("EXPLODE"), 594 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 595 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 596 exp.National: lambda self, e: self.national_sql(e, prefix=""), 597 exp.ClusteredColumnConstraint: lambda self, 598 e: f"({self.expressions(e, 'this', indent=False)})", 599 exp.NonClusteredColumnConstraint: lambda self, 600 e: f"({self.expressions(e, 'this', indent=False)})", 601 exp.NotForReplicationColumnConstraint: lambda *_: "", 602 exp.OnProperty: lambda *_: "", 603 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 604 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 605 exp.DayOfMonth: rename_func("DAYOFMONTH"), 606 exp.DayOfWeek: rename_func("DAYOFWEEK"), 607 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 608 rename_func("LEVENSHTEIN") 609 ), 610 } 611 612 PROPERTIES_LOCATION = { 613 **generator.Generator.PROPERTIES_LOCATION, 614 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 615 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 616 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 617 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 618 } 619 620 def unnest_sql(self, expression: exp.Unnest) -> str: 621 return rename_func("EXPLODE")(self, expression) 622 623 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 624 if isinstance(expression.this, exp.JSONPathWildcard): 625 self.unsupported("Unsupported wildcard in JSONPathKey expression") 626 return "" 627 628 return super()._jsonpathkey_sql(expression) 629 630 def parameter_sql(self, expression: exp.Parameter) -> str: 631 this = self.sql(expression, "this") 632 expression_sql = self.sql(expression, "expression") 633 634 parent = expression.parent 635 this = f"{this}:{expression_sql}" if expression_sql else this 636 637 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 638 # We need to produce SET key = value instead of SET ${key} = value 639 return this 640 641 return f"${{{this}}}" 642 643 def schema_sql(self, expression: exp.Schema) -> str: 644 for ordered in expression.find_all(exp.Ordered): 645 if ordered.args.get("desc") is False: 646 ordered.set("desc", None) 647 648 return super().schema_sql(expression) 649 650 def constraint_sql(self, expression: exp.Constraint) -> str: 651 for prop in list(expression.find_all(exp.Properties)): 652 prop.pop() 653 654 this = self.sql(expression, "this") 655 expressions = self.expressions(expression, sep=" ", flat=True) 656 return f"CONSTRAINT {this} {expressions}" 657 658 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 659 serde_props = self.sql(expression, "serde_properties") 660 serde_props = f" {serde_props}" if serde_props else "" 661 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 662 663 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 664 return self.func( 665 "COLLECT_LIST", 666 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 667 ) 668 669 def datatype_sql(self, expression: exp.DataType) -> str: 670 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 671 not expression.expressions or expression.expressions[0].name == "MAX" 672 ): 673 expression = exp.DataType.build("text") 674 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 675 expression.set("this", exp.DataType.Type.VARCHAR) 676 elif expression.this in exp.DataType.TEMPORAL_TYPES: 677 expression = exp.DataType.build(expression.this) 678 elif expression.is_type("float"): 679 size_expression = expression.find(exp.DataTypeParam) 680 if size_expression: 681 size = int(size_expression.name) 682 expression = ( 683 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 684 ) 685 686 return super().datatype_sql(expression) 687 688 def version_sql(self, expression: exp.Version) -> str: 689 sql = super().version_sql(expression) 690 return sql.replace("FOR ", "", 1) 691 692 def struct_sql(self, expression: exp.Struct) -> str: 693 values = [] 694 695 for i, e in enumerate(expression.expressions): 696 if isinstance(e, exp.PropertyEQ): 697 self.unsupported("Hive does not support named structs.") 698 values.append(e.expression) 699 else: 700 values.append(e) 701 702 return self.func("STRUCT", *values) 703 704 def alterset_sql(self, expression: exp.AlterSet) -> str: 705 exprs = self.expressions(expression, flat=True) 706 exprs = f" {exprs}" if exprs else "" 707 location = self.sql(expression, "location") 708 location = f" LOCATION {location}" if location else "" 709 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 710 file_format = f" FILEFORMAT {file_format}" if file_format else "" 711 serde = self.sql(expression, "serde") 712 serde = f" SERDE {serde}" if serde else "" 713 tags = self.expressions(expression, key="tag", flat=True, sep="") 714 tags = f" TAGS {tags}" if tags else "" 715 716 return f"SET{serde}{exprs}{location}{file_format}{tags}" 717 718 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 719 prefix = "WITH " if expression.args.get("with") else "" 720 exprs = self.expressions(expression, flat=True) 721 722 return f"{prefix}SERDEPROPERTIES ({exprs})" 723 724 def exists_sql(self, expression: exp.Exists): 725 if expression.expression: 726 return self.function_fallback_sql(expression) 727 728 return super().exists_sql(expression)
Generator converts a given syntax tree to the corresponding SQL string.
Arguments:
- pretty: Whether to format the produced SQL string. Default: False.
- identify: Determines when an identifier should be quoted. Possible values are: False (default): Never quote, except in cases where it's mandatory by the dialect. True or 'always': Always quote. 'safe': Only quote identifiers that are case insensitive.
- normalize: Whether to normalize identifiers to lowercase. Default: False.
- pad: The pad size in a formatted string. For example, this affects the indentation of a projection in a query, relative to its nesting level. Default: 2.
- indent: The indentation size in a formatted string. For example, this affects the
indentation of subqueries and filters under a
WHERE
clause. Default: 2. - normalize_functions: How to normalize function names. Possible values are: "upper" or True (default): Convert names to uppercase. "lower": Convert names to lowercase. False: Disables function name normalization.
- unsupported_level: Determines the generator's behavior when it encounters unsupported expressions. Default ErrorLevel.WARN.
- max_unsupported: Maximum number of unsupported messages to include in a raised UnsupportedError. This is only relevant if unsupported_level is ErrorLevel.RAISE. Default: 3
- leading_comma: Whether the comma is leading or trailing in select expressions. This is only relevant when generating in pretty mode. Default: False
- max_text_width: The max number of characters in a segment before creating new lines in pretty mode. The default is on the smaller end because the length only represents a segment and not the true line length. Default: 80
- comments: Whether to preserve comments in the output SQL code. Default: True
EXPRESSIONS_WITHOUT_NESTED_CTES =
{<class 'sqlglot.expressions.Subquery'>, <class 'sqlglot.expressions.Select'>, <class 'sqlglot.expressions.SetOperation'>, <class 'sqlglot.expressions.Insert'>}
SUPPORTED_JSON_PATH_PARTS =
{<class 'sqlglot.expressions.JSONPathKey'>, <class 'sqlglot.expressions.JSONPathSubscript'>, <class 'sqlglot.expressions.JSONPathWildcard'>, <class 'sqlglot.expressions.JSONPathRoot'>}
TYPE_MAPPING =
{<Type.DATETIME2: 'DATETIME2'>: 'TIMESTAMP', <Type.NCHAR: 'NCHAR'>: 'CHAR', <Type.NVARCHAR: 'NVARCHAR'>: 'VARCHAR', <Type.MEDIUMTEXT: 'MEDIUMTEXT'>: 'TEXT', <Type.LONGTEXT: 'LONGTEXT'>: 'TEXT', <Type.TINYTEXT: 'TINYTEXT'>: 'TEXT', <Type.MEDIUMBLOB: 'MEDIUMBLOB'>: 'BLOB', <Type.LONGBLOB: 'LONGBLOB'>: 'BLOB', <Type.TINYBLOB: 'TINYBLOB'>: 'BLOB', <Type.INET: 'INET'>: 'INET', <Type.ROWVERSION: 'ROWVERSION'>: 'BINARY', <Type.SMALLDATETIME: 'SMALLDATETIME'>: 'TIMESTAMP', <Type.BIT: 'BIT'>: 'BOOLEAN', <Type.DATETIME: 'DATETIME'>: 'TIMESTAMP', <Type.TEXT: 'TEXT'>: 'STRING', <Type.TIME: 'TIME'>: 'TIMESTAMP', <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>: 'TIMESTAMP', <Type.UTINYINT: 'UTINYINT'>: 'SMALLINT', <Type.VARBINARY: 'VARBINARY'>: 'BINARY'}
TRANSFORMS =
{<class 'sqlglot.expressions.JSONPathKey'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathRoot'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathSubscript'>: <function <lambda>>, <class 'sqlglot.expressions.JSONPathWildcard'>: <function <lambda>>, <class 'sqlglot.expressions.AllowedValuesProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.AnalyzeColumns'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.AnalyzeWith'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ArrayContainsAll'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ArrayOverlaps'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.AutoRefreshProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.BackupProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CaseSpecificColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Ceil'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CharacterSetColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CharacterSetProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ClusteredColumnConstraint'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.CollateColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CommentColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ConnectByRoot'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CopyGrantsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.DateFormatColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.DefaultColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.DynamicProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EmptyProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EncodeColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.EphemeralColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ExcludeColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ExecuteAsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Except'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ExternalProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Floor'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.GlobalProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.HeapProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.IcebergProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InheritsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InlineLengthColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.InputModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Intersect'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.IntervalSpan'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Int64'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LanguageProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LocationProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.LogProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.MaterializedProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.NonClusteredColumnConstraint'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.NoPrimaryIndexProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.NotForReplicationColumnConstraint'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.OnCommitProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OnProperty'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.OnUpdateColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Operator'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.OutputModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PathColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.PivotAny'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ProjectionPolicyColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.RemoteWithConnectionModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ReturnsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SampleProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SecureProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SecurityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SetConfigProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SetProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SettingsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SharingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SqlReadWriteProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SqlSecurityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StabilityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Stream'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StreamingTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StrictProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SwapTable'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TemporaryProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Tags'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TitleColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ToMap'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ToTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TransformModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TransientProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Union'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UnloggedProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UsingData'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Uuid'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UppercaseColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.VarMap'>: <function var_map_sql>, <class 'sqlglot.expressions.ViewAttributeProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.VolatileProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithJournalTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithProcedureOptions'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithSchemaBindingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithOperator'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Group'>: <function preprocess.<locals>._to_sql>, <class 'sqlglot.expressions.Property'>: <function property_sql>, <class 'sqlglot.expressions.AnyValue'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.ApproxDistinct'>: <function approx_count_distinct_sql>, <class 'sqlglot.expressions.ArgMax'>: <function arg_max_or_min_no_count.<locals>._arg_max_or_min_sql>, <class 'sqlglot.expressions.ArgMin'>: <function arg_max_or_min_no_count.<locals>._arg_max_or_min_sql>, <class 'sqlglot.expressions.ArrayConcat'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.ArrayToString'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.ArraySort'>: <function _array_sort_sql>, <class 'sqlglot.expressions.With'>: <function no_recursive_cte_sql>, <class 'sqlglot.expressions.DateAdd'>: <function _add_date_sql>, <class 'sqlglot.expressions.DateDiff'>: <function _date_diff_sql>, <class 'sqlglot.expressions.DateStrToDate'>: <function datestrtodate_sql>, <class 'sqlglot.expressions.DateSub'>: <function _add_date_sql>, <class 'sqlglot.expressions.DateToDi'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.DiToDate'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.FileFormatProperty'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.FromBase64'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.GenerateSeries'>: <function sequence_sql>, <class 'sqlglot.expressions.GenerateDateArray'>: <function sequence_sql>, <class 'sqlglot.expressions.If'>: <function if_sql.<locals>._if_sql>, <class 'sqlglot.expressions.ILike'>: <function no_ilike_sql>, <class 'sqlglot.expressions.IsNan'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.JSONExtract'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.JSONExtractScalar'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.JSONFormat'>: <function _json_format_sql>, <class 'sqlglot.expressions.Left'>: <function left_to_substring_sql>, <class 'sqlglot.expressions.Map'>: <function var_map_sql>, <class 'sqlglot.expressions.Max'>: <function max_or_greatest>, <class 'sqlglot.expressions.MD5Digest'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.Min'>: <function min_or_least>, <class 'sqlglot.expressions.MonthsBetween'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.NotNullColumnConstraint'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.Create'>: <function preprocess.<locals>._to_sql>, <class 'sqlglot.expressions.Quantile'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.ApproxQuantile'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.RegexpExtract'>: <function regexp_extract_sql>, <class 'sqlglot.expressions.RegexpExtractAll'>: <function regexp_extract_sql>, <class 'sqlglot.expressions.RegexpReplace'>: <function regexp_replace_sql>, <class 'sqlglot.expressions.RegexpLike'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.RegexpSplit'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Right'>: <function right_to_substring_sql>, <class 'sqlglot.expressions.SafeDivide'>: <function no_safe_divide_sql>, <class 'sqlglot.expressions.SchemaCommentProperty'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.ArrayUniqueAgg'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Split'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.Select'>: <function preprocess.<locals>._to_sql>, <class 'sqlglot.expressions.StrPosition'>: <function strposition_to_locate_sql>, <class 'sqlglot.expressions.StrToDate'>: <function _str_to_date_sql>, <class 'sqlglot.expressions.StrToTime'>: <function _str_to_time_sql>, <class 'sqlglot.expressions.StrToUnix'>: <function _str_to_unix_sql>, <class 'sqlglot.expressions.StructExtract'>: <function struct_extract_sql>, <class 'sqlglot.expressions.Table'>: <function preprocess.<locals>._to_sql>, <class 'sqlglot.expressions.TimeStrToDate'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeStrToTime'>: <function timestrtotime_sql>, <class 'sqlglot.expressions.TimeStrToUnix'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TimestampTrunc'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.TimeToStr'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.TimeToUnix'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.ToBase64'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TsOrDiToDi'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.TsOrDsAdd'>: <function _add_date_sql>, <class 'sqlglot.expressions.TsOrDsDiff'>: <function _date_diff_sql>, <class 'sqlglot.expressions.TsOrDsToDate'>: <function _to_date_sql>, <class 'sqlglot.expressions.TryCast'>: <function no_trycast_sql>, <class 'sqlglot.expressions.Unicode'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixToStr'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.UnixToTime'>: <function _unix_to_time_sql>, <class 'sqlglot.expressions.UnixToTimeStr'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Unnest'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.PartitionedByProperty'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.NumberToStr'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.National'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.PrimaryKeyColumnConstraint'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.WeekOfYear'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.DayOfMonth'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.DayOfWeek'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Levenshtein'>: <function rename_func.<locals>.<lambda>>}
PROPERTIES_LOCATION =
{<class 'sqlglot.expressions.AllowedValuesProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.AlgorithmProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.AutoIncrementProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.AutoRefreshProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.BackupProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.BlockCompressionProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.CharacterSetProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ChecksumProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.CollateProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.CopyGrantsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Cluster'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ClusteredByProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DistributedByProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DuplicateKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DataBlocksizeProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.DataDeletionProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DefinerProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.DictRange'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DictProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DynamicProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.DistKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DistStyleProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EmptyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EncodeProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.EngineProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ExecuteAsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ExternalProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.FallbackProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.FileFormatProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.FreespaceProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.GlobalProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.HeapProperty'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.InheritsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.IcebergProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.IncludeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.InputModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.IsolatedLoadingProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.JournalProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.LanguageProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LikeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LocationProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LockProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LockingProperty'>: <Location.POST_ALIAS: 'POST_ALIAS'>, <class 'sqlglot.expressions.LogProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.MaterializedProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.MergeBlockRatioProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.NoPrimaryIndexProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.OnProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.OnCommitProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.Order'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.OutputModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PartitionedByProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PartitionedOfProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PrimaryKey'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Property'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.RemoteWithConnectionModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ReturnsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatDelimitedProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatSerdeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SampleProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SchemaCommentProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SecureProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.SecurityProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SerdeProperties'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Set'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SettingsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SetProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.SetConfigProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SharingProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.SequenceProperties'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.SortKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SqlReadWriteProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SqlSecurityProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.StabilityProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.StreamingTableProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.StrictProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Tags'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.TemporaryProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.ToTableProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.TransientProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.TransformModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.MergeTreeTTL'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.UnloggedProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.ViewAttributeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.VolatileProperty'>: <Location.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.WithDataProperty'>: <Location.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.WithJournalTableProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.WithProcedureOptions'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.WithSchemaBindingProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.WithSystemVersioningProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>}
630 def parameter_sql(self, expression: exp.Parameter) -> str: 631 this = self.sql(expression, "this") 632 expression_sql = self.sql(expression, "expression") 633 634 parent = expression.parent 635 this = f"{this}:{expression_sql}" if expression_sql else this 636 637 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 638 # We need to produce SET key = value instead of SET ${key} = value 639 return this 640 641 return f"${{{this}}}"
def
rowformatserdeproperty_sql(self, expression: sqlglot.expressions.RowFormatSerdeProperty) -> str:
669 def datatype_sql(self, expression: exp.DataType) -> str: 670 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 671 not expression.expressions or expression.expressions[0].name == "MAX" 672 ): 673 expression = exp.DataType.build("text") 674 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 675 expression.set("this", exp.DataType.Type.VARCHAR) 676 elif expression.this in exp.DataType.TEMPORAL_TYPES: 677 expression = exp.DataType.build(expression.this) 678 elif expression.is_type("float"): 679 size_expression = expression.find(exp.DataTypeParam) 680 if size_expression: 681 size = int(size_expression.name) 682 expression = ( 683 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 684 ) 685 686 return super().datatype_sql(expression)
692 def struct_sql(self, expression: exp.Struct) -> str: 693 values = [] 694 695 for i, e in enumerate(expression.expressions): 696 if isinstance(e, exp.PropertyEQ): 697 self.unsupported("Hive does not support named structs.") 698 values.append(e.expression) 699 else: 700 values.append(e) 701 702 return self.func("STRUCT", *values)
704 def alterset_sql(self, expression: exp.AlterSet) -> str: 705 exprs = self.expressions(expression, flat=True) 706 exprs = f" {exprs}" if exprs else "" 707 location = self.sql(expression, "location") 708 location = f" LOCATION {location}" if location else "" 709 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 710 file_format = f" FILEFORMAT {file_format}" if file_format else "" 711 serde = self.sql(expression, "serde") 712 serde = f" SERDE {serde}" if serde else "" 713 tags = self.expressions(expression, key="tag", flat=True, sep="") 714 tags = f" TAGS {tags}" if tags else "" 715 716 return f"SET{serde}{exprs}{location}{file_format}{tags}"
Inherited Members
- sqlglot.generator.Generator
- Generator
- NULL_ORDERING_SUPPORTED
- IGNORE_NULLS_IN_FUNC
- LOCKING_READS_SUPPORTED
- EXCEPT_INTERSECT_SUPPORT_ALL_CLAUSE
- WRAP_DERIVED_VALUES
- CREATE_FUNCTION_RETURN_AS
- MATCHED_BY_SOURCE
- SINGLE_STRING_INTERVAL
- INTERVAL_ALLOWS_PLURAL_FORM
- LIMIT_ONLY_LITERALS
- RENAME_TABLE_WITH_DB
- GROUPINGS_SEP
- QUERY_HINT_SEP
- IS_BOOL_ALLOWED
- DUPLICATE_KEY_UPDATE_WITH_SET
- LIMIT_IS_TOP
- RETURNING_END
- TZ_TO_WITH_TIME_ZONE
- VALUES_AS_TABLE
- ALTER_TABLE_INCLUDE_COLUMN_KEYWORD
- UNNEST_WITH_ORDINALITY
- AGGREGATE_FILTER_SUPPORTED
- SEMI_ANTI_JOIN_WITH_SIDE
- COMPUTED_COLUMN_WITH_TYPE
- SUPPORTS_TABLE_COPY
- TABLESAMPLE_REQUIRES_PARENS
- TABLESAMPLE_SIZE_IS_ROWS
- TABLESAMPLE_KEYWORDS
- TABLESAMPLE_SEED_KEYWORD
- COLLATE_IS_FUNC
- DATA_TYPE_SPECIFIERS_ALLOWED
- ENSURE_BOOLS
- CTE_RECURSIVE_KEYWORD_REQUIRED
- SUPPORTS_SINGLE_ARG_CONCAT
- SUPPORTS_TABLE_ALIAS_COLUMNS
- UNPIVOT_ALIASES_ARE_IDENTIFIERS
- JSON_KEY_VALUE_PAIR_SEP
- INSERT_OVERWRITE
- SUPPORTS_SELECT_INTO
- SUPPORTS_UNLOGGED_TABLES
- SUPPORTS_CREATE_TABLE_LIKE
- LIKE_PROPERTY_INSIDE_SCHEMA
- MULTI_ARG_DISTINCT
- JSON_TYPE_REQUIRED_FOR_EXTRACTION
- JSON_PATH_BRACKETED_KEY_SUPPORTED
- CAN_IMPLEMENT_ARRAY_ANY
- SET_OP_MODIFIERS
- COPY_PARAMS_ARE_WRAPPED
- COPY_PARAMS_EQ_REQUIRED
- COPY_HAS_INTO_KEYWORD
- STAR_EXCEPT
- HEX_FUNC
- QUOTE_JSON_PATH
- SUPPORTS_EXPLODING_PROJECTIONS
- ARRAY_CONCAT_IS_VAR_LEN
- SUPPORTS_CONVERT_TIMEZONE
- SUPPORTS_UNIX_SECONDS
- ARRAY_SIZE_DIM_REQUIRED
- TIME_PART_SINGULARS
- AFTER_HAVING_MODIFIER_TRANSFORMS
- TOKEN_MAPPING
- STRUCT_DELIMITER
- PARAMETER_TOKEN
- NAMED_PLACEHOLDER_TOKEN
- EXPRESSION_PRECEDES_PROPERTIES_CREATABLES
- RESERVED_KEYWORDS
- WITH_SEPARATED_COMMENTS
- EXCLUDE_COMMENTS
- UNWRAPPED_INTERVAL_VALUES
- PARAMETERIZABLE_TEXT_TYPES
- SENTINEL_LINE_BREAK
- pretty
- identify
- normalize
- pad
- unsupported_level
- max_unsupported
- leading_comma
- max_text_width
- comments
- dialect
- normalize_functions
- unsupported_messages
- generate
- preprocess
- unsupported
- sep
- seg
- pad_comment
- maybe_comment
- wrap
- no_identify
- normalize_func
- indent
- sql
- uncache_sql
- cache_sql
- characterset_sql
- column_parts
- column_sql
- columnposition_sql
- columndef_sql
- columnconstraint_sql
- computedcolumnconstraint_sql
- autoincrementcolumnconstraint_sql
- compresscolumnconstraint_sql
- generatedasidentitycolumnconstraint_sql
- generatedasrowcolumnconstraint_sql
- periodforsystemtimeconstraint_sql
- notnullcolumnconstraint_sql
- transformcolumnconstraint_sql
- primarykeycolumnconstraint_sql
- uniquecolumnconstraint_sql
- createable_sql
- create_sql
- sequenceproperties_sql
- clone_sql
- describe_sql
- heredoc_sql
- prepend_ctes
- with_sql
- cte_sql
- tablealias_sql
- bitstring_sql
- hexstring_sql
- bytestring_sql
- unicodestring_sql
- rawstring_sql
- datatypeparam_sql
- directory_sql
- delete_sql
- drop_sql
- set_operation
- set_operations
- fetch_sql
- filter_sql
- hint_sql
- indexparameters_sql
- index_sql
- identifier_sql
- hex_sql
- lowerhex_sql
- inputoutputformat_sql
- national_sql
- partition_sql
- properties_sql
- root_properties
- properties
- with_properties
- locate_properties
- property_name
- property_sql
- likeproperty_sql
- fallbackproperty_sql
- journalproperty_sql
- freespaceproperty_sql
- checksumproperty_sql
- mergeblockratioproperty_sql
- datablocksizeproperty_sql
- blockcompressionproperty_sql
- isolatedloadingproperty_sql
- partitionboundspec_sql
- partitionedofproperty_sql
- lockingproperty_sql
- withdataproperty_sql
- withsystemversioningproperty_sql
- insert_sql
- introducer_sql
- kill_sql
- pseudotype_sql
- objectidentifier_sql
- onconflict_sql
- returning_sql
- rowformatdelimitedproperty_sql
- withtablehint_sql
- indextablehint_sql
- historicaldata_sql
- table_parts
- table_sql
- tablesample_sql
- pivot_sql
- tuple_sql
- update_sql
- values_sql
- var_sql
- into_sql
- from_sql
- groupingsets_sql
- rollup_sql
- cube_sql
- group_sql
- having_sql
- connect_sql
- prior_sql
- join_sql
- lambda_sql
- lateral_op
- lateral_sql
- limit_sql
- offset_sql
- setitem_sql
- set_sql
- pragma_sql
- lock_sql
- literal_sql
- escape_str
- loaddata_sql
- null_sql
- boolean_sql
- order_sql
- withfill_sql
- cluster_sql
- distribute_sql
- sort_sql
- ordered_sql
- matchrecognizemeasure_sql
- matchrecognize_sql
- query_modifiers
- options_modifier
- queryoption_sql
- offset_limit_modifiers
- after_limit_modifiers
- select_sql
- schema_columns_sql
- star_sql
- sessionparameter_sql
- placeholder_sql
- subquery_sql
- qualify_sql
- prewhere_sql
- where_sql
- window_sql
- partition_by_sql
- windowspec_sql
- withingroup_sql
- between_sql
- bracket_offset_expressions
- bracket_sql
- all_sql
- any_sql
- case_sql
- nextvaluefor_sql
- extract_sql
- trim_sql
- convert_concat_args
- concat_sql
- concatws_sql
- check_sql
- foreignkey_sql
- primarykey_sql
- if_sql
- matchagainst_sql
- jsonkeyvalue_sql
- jsonpath_sql
- json_path_part
- formatjson_sql
- jsonobject_sql
- jsonobjectagg_sql
- jsonarray_sql
- jsonarrayagg_sql
- jsoncolumndef_sql
- jsonschema_sql
- jsontable_sql
- openjsoncolumndef_sql
- openjson_sql
- in_sql
- in_unnest_op
- interval_sql
- return_sql
- reference_sql
- anonymous_sql
- paren_sql
- neg_sql
- not_sql
- alias_sql
- pivotalias_sql
- aliases_sql
- atindex_sql
- attimezone_sql
- fromtimezone_sql
- add_sql
- and_sql
- or_sql
- xor_sql
- connector_sql
- bitwiseand_sql
- bitwiseleftshift_sql
- bitwisenot_sql
- bitwiseor_sql
- bitwiserightshift_sql
- bitwisexor_sql
- cast_sql
- currentdate_sql
- collate_sql
- command_sql
- comment_sql
- mergetreettlaction_sql
- mergetreettl_sql
- transaction_sql
- commit_sql
- rollback_sql
- altercolumn_sql
- alterdiststyle_sql
- altersortkey_sql
- alterrename_sql
- renamecolumn_sql
- alter_sql
- add_column_sql
- droppartition_sql
- addconstraint_sql
- distinct_sql
- ignorenulls_sql
- respectnulls_sql
- havingmax_sql
- intdiv_sql
- dpipe_sql
- div_sql
- overlaps_sql
- distance_sql
- dot_sql
- eq_sql
- propertyeq_sql
- escape_sql
- glob_sql
- gt_sql
- gte_sql
- ilike_sql
- ilikeany_sql
- is_sql
- like_sql
- likeany_sql
- similarto_sql
- lt_sql
- lte_sql
- mod_sql
- mul_sql
- neq_sql
- nullsafeeq_sql
- nullsafeneq_sql
- slice_sql
- sub_sql
- trycast_sql
- try_sql
- log_sql
- use_sql
- binary
- ceil_floor
- function_fallback_sql
- func
- format_args
- too_wide
- format_time
- expressions
- op_expressions
- naked_property
- tag_sql
- token_sql
- userdefinedfunction_sql
- joinhint_sql
- kwarg_sql
- when_sql
- whens_sql
- merge_sql
- tochar_sql
- tonumber_sql
- dictproperty_sql
- dictrange_sql
- dictsubproperty_sql
- duplicatekeyproperty_sql
- uniquekeyproperty_sql
- distributedbyproperty_sql
- oncluster_sql
- clusteredbyproperty_sql
- anyvalue_sql
- querytransform_sql
- indexconstraintoption_sql
- checkcolumnconstraint_sql
- indexcolumnconstraint_sql
- nvl2_sql
- comprehension_sql
- columnprefix_sql
- opclass_sql
- predict_sql
- forin_sql
- refresh_sql
- toarray_sql
- tsordstotime_sql
- tsordstotimestamp_sql
- tsordstodatetime_sql
- tsordstodate_sql
- unixdate_sql
- lastday_sql
- dateadd_sql
- arrayany_sql
- partitionrange_sql
- truncatetable_sql
- convert_sql
- copyparameter_sql
- credentials_sql
- copy_sql
- semicolon_sql
- datadeletionproperty_sql
- maskingpolicycolumnconstraint_sql
- gapfill_sql
- scope_resolution
- scoperesolution_sql
- parsejson_sql
- rand_sql
- changes_sql
- pad_sql
- summarize_sql
- explodinggenerateseries_sql
- arrayconcat_sql
- converttimezone_sql
- json_sql
- jsonvalue_sql
- conditionalinsert_sql
- multitableinserts_sql
- oncondition_sql
- jsonexists_sql
- apply_sql
- grant_sql
- grantprivilege_sql
- grantprincipal_sql
- columns_sql
- overlay_sql
- todouble_sql
- string_sql
- median_sql
- overflowtruncatebehavior_sql
- unixseconds_sql
- arraysize_sql
- attach_sql
- detach_sql
- attachoption_sql
- featuresattime_sql
- watermarkcolumnconstraint_sql
- encodeproperty_sql
- includeproperty_sql
- xmlelement_sql
- partitionbyrangeproperty_sql
- partitionbyrangepropertydynamic_sql
- unpivotcolumns_sql
- analyzesample_sql
- analyzestatistics_sql
- analyzehistogram_sql
- analyzedelete_sql
- analyzelistchainedrows_sql
- analyzevalidate_sql
- analyze_sql
- xmltable_sql