sqlglot.dialects.hive
1from __future__ import annotations 2 3import typing as t 4from copy import deepcopy 5from functools import partial 6from collections import defaultdict 7 8from sqlglot import exp, generator, parser, tokens, transforms 9from sqlglot.dialects.dialect import ( 10 DATE_ADD_OR_SUB, 11 Dialect, 12 NormalizationStrategy, 13 approx_count_distinct_sql, 14 arg_max_or_min_no_count, 15 datestrtodate_sql, 16 build_formatted_time, 17 if_sql, 18 is_parse_json, 19 left_to_substring_sql, 20 max_or_greatest, 21 min_or_least, 22 no_ilike_sql, 23 no_recursive_cte_sql, 24 no_trycast_sql, 25 regexp_extract_sql, 26 regexp_replace_sql, 27 rename_func, 28 right_to_substring_sql, 29 strposition_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 48from sqlglot.optimizer.annotate_types import TypeAnnotator 49 50# (FuncType, Multiplier) 51DATE_DELTA_INTERVAL = { 52 "YEAR": ("ADD_MONTHS", 12), 53 "MONTH": ("ADD_MONTHS", 1), 54 "QUARTER": ("ADD_MONTHS", 3), 55 "WEEK": ("DATE_ADD", 7), 56 "DAY": ("DATE_ADD", 1), 57} 58 59TIME_DIFF_FACTOR = { 60 "MILLISECOND": " * 1000", 61 "SECOND": "", 62 "MINUTE": " / 60", 63 "HOUR": " / 3600", 64} 65 66DIFF_MONTH_SWITCH = ("YEAR", "QUARTER", "MONTH") 67 68TS_OR_DS_EXPRESSIONS = ( 69 exp.DateDiff, 70 exp.Day, 71 exp.Month, 72 exp.Year, 73) 74 75 76def _add_date_sql(self: Hive.Generator, expression: DATE_ADD_OR_SUB) -> str: 77 if isinstance(expression, exp.TsOrDsAdd) and not expression.unit: 78 return self.func("DATE_ADD", expression.this, expression.expression) 79 80 unit = expression.text("unit").upper() 81 func, multiplier = DATE_DELTA_INTERVAL.get(unit, ("DATE_ADD", 1)) 82 83 if isinstance(expression, exp.DateSub): 84 multiplier *= -1 85 86 increment = expression.expression 87 if isinstance(increment, exp.Literal): 88 value = increment.to_py() if increment.is_number else int(increment.name) 89 increment = exp.Literal.number(value * multiplier) 90 elif multiplier != 1: 91 increment *= exp.Literal.number(multiplier) 92 93 return self.func(func, expression.this, increment) 94 95 96def _date_diff_sql(self: Hive.Generator, expression: exp.DateDiff | exp.TsOrDsDiff) -> str: 97 unit = expression.text("unit").upper() 98 99 factor = TIME_DIFF_FACTOR.get(unit) 100 if factor is not None: 101 left = self.sql(expression, "this") 102 right = self.sql(expression, "expression") 103 sec_diff = f"UNIX_TIMESTAMP({left}) - UNIX_TIMESTAMP({right})" 104 return f"({sec_diff}){factor}" if factor else sec_diff 105 106 months_between = unit in DIFF_MONTH_SWITCH 107 sql_func = "MONTHS_BETWEEN" if months_between else "DATEDIFF" 108 _, multiplier = DATE_DELTA_INTERVAL.get(unit, ("", 1)) 109 multiplier_sql = f" / {multiplier}" if multiplier > 1 else "" 110 diff_sql = f"{sql_func}({self.format_args(expression.this, expression.expression)})" 111 112 if months_between or multiplier_sql: 113 # MONTHS_BETWEEN returns a float, so we need to truncate the fractional part. 114 # For the same reason, we want to truncate if there's a divisor present. 115 diff_sql = f"CAST({diff_sql}{multiplier_sql} AS INT)" 116 117 return diff_sql 118 119 120def _json_format_sql(self: Hive.Generator, expression: exp.JSONFormat) -> str: 121 this = expression.this 122 123 if is_parse_json(this): 124 if this.this.is_string: 125 # Since FROM_JSON requires a nested type, we always wrap the json string with 126 # an array to ensure that "naked" strings like "'a'" will be handled correctly 127 wrapped_json = exp.Literal.string(f"[{this.this.name}]") 128 129 from_json = self.func( 130 "FROM_JSON", wrapped_json, self.func("SCHEMA_OF_JSON", wrapped_json) 131 ) 132 to_json = self.func("TO_JSON", from_json) 133 134 # This strips the [, ] delimiters of the dummy array printed by TO_JSON 135 return self.func("REGEXP_EXTRACT", to_json, "'^.(.*).$'", "1") 136 return self.sql(this) 137 138 return self.func("TO_JSON", this, expression.args.get("options")) 139 140 141@generator.unsupported_args(("expression", "Hive's SORT_ARRAY does not support a comparator.")) 142def _array_sort_sql(self: Hive.Generator, expression: exp.ArraySort) -> str: 143 return self.func("SORT_ARRAY", expression.this) 144 145 146def _str_to_unix_sql(self: Hive.Generator, expression: exp.StrToUnix) -> str: 147 return self.func("UNIX_TIMESTAMP", expression.this, time_format("hive")(self, expression)) 148 149 150def _unix_to_time_sql(self: Hive.Generator, expression: exp.UnixToTime) -> str: 151 timestamp = self.sql(expression, "this") 152 scale = expression.args.get("scale") 153 if scale in (None, exp.UnixToTime.SECONDS): 154 return rename_func("FROM_UNIXTIME")(self, expression) 155 156 return f"FROM_UNIXTIME({timestamp} / POW(10, {scale}))" 157 158 159def _str_to_date_sql(self: Hive.Generator, expression: exp.StrToDate) -> str: 160 this = self.sql(expression, "this") 161 time_format = self.format_time(expression) 162 if time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 163 this = f"FROM_UNIXTIME(UNIX_TIMESTAMP({this}, {time_format}))" 164 return f"CAST({this} AS DATE)" 165 166 167def _str_to_time_sql(self: Hive.Generator, expression: exp.StrToTime) -> str: 168 this = self.sql(expression, "this") 169 time_format = self.format_time(expression) 170 if time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 171 this = f"FROM_UNIXTIME(UNIX_TIMESTAMP({this}, {time_format}))" 172 return f"CAST({this} AS TIMESTAMP)" 173 174 175def _to_date_sql(self: Hive.Generator, expression: exp.TsOrDsToDate) -> str: 176 time_format = self.format_time(expression) 177 if time_format and time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 178 return self.func("TO_DATE", expression.this, time_format) 179 180 if isinstance(expression.parent, TS_OR_DS_EXPRESSIONS): 181 return self.sql(expression, "this") 182 183 return self.func("TO_DATE", expression.this) 184 185 186def _build_with_ignore_nulls( 187 exp_class: t.Type[exp.Expression], 188) -> t.Callable[[t.List[exp.Expression]], exp.Expression]: 189 def _parse(args: t.List[exp.Expression]) -> exp.Expression: 190 this = exp_class(this=seq_get(args, 0)) 191 if seq_get(args, 1) == exp.true(): 192 return exp.IgnoreNulls(this=this) 193 return this 194 195 return _parse 196 197 198def _build_to_date(args: t.List) -> exp.TsOrDsToDate: 199 expr = build_formatted_time(exp.TsOrDsToDate, "hive")(args) 200 expr.set("safe", True) 201 return expr 202 203 204class Hive(Dialect): 205 ALIAS_POST_TABLESAMPLE = True 206 IDENTIFIERS_CAN_START_WITH_DIGIT = True 207 SUPPORTS_USER_DEFINED_TYPES = False 208 SAFE_DIVISION = True 209 ARRAY_AGG_INCLUDES_NULLS = None 210 REGEXP_EXTRACT_DEFAULT_GROUP = 1 211 212 # https://spark.apache.org/docs/latest/sql-ref-identifier.html#description 213 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 214 215 ANNOTATORS = { 216 **Dialect.ANNOTATORS, 217 exp.If: lambda self, e: self._annotate_by_args(e, "true", "false", promote=True), 218 exp.Coalesce: lambda self, e: self._annotate_by_args( 219 e, "this", "expressions", promote=True 220 ), 221 } 222 223 # Support only the non-ANSI mode (default for Hive, Spark2, Spark) 224 COERCES_TO = defaultdict(set, deepcopy(TypeAnnotator.COERCES_TO)) 225 for target_type in { 226 *exp.DataType.NUMERIC_TYPES, 227 *exp.DataType.TEMPORAL_TYPES, 228 exp.DataType.Type.INTERVAL, 229 }: 230 COERCES_TO[target_type] |= exp.DataType.TEXT_TYPES 231 232 TIME_MAPPING = { 233 "y": "%Y", 234 "Y": "%Y", 235 "YYYY": "%Y", 236 "yyyy": "%Y", 237 "YY": "%y", 238 "yy": "%y", 239 "MMMM": "%B", 240 "MMM": "%b", 241 "MM": "%m", 242 "M": "%-m", 243 "dd": "%d", 244 "d": "%-d", 245 "HH": "%H", 246 "H": "%-H", 247 "hh": "%I", 248 "h": "%-I", 249 "mm": "%M", 250 "m": "%-M", 251 "ss": "%S", 252 "s": "%-S", 253 "SSSSSS": "%f", 254 "a": "%p", 255 "DD": "%j", 256 "D": "%-j", 257 "E": "%a", 258 "EE": "%a", 259 "EEE": "%a", 260 "EEEE": "%A", 261 "z": "%Z", 262 "Z": "%z", 263 } 264 265 DATE_FORMAT = "'yyyy-MM-dd'" 266 DATEINT_FORMAT = "'yyyyMMdd'" 267 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 268 269 class Tokenizer(tokens.Tokenizer): 270 QUOTES = ["'", '"'] 271 IDENTIFIERS = ["`"] 272 STRING_ESCAPES = ["\\"] 273 274 SINGLE_TOKENS = { 275 **tokens.Tokenizer.SINGLE_TOKENS, 276 "$": TokenType.PARAMETER, 277 } 278 279 KEYWORDS = { 280 **tokens.Tokenizer.KEYWORDS, 281 "ADD ARCHIVE": TokenType.COMMAND, 282 "ADD ARCHIVES": TokenType.COMMAND, 283 "ADD FILE": TokenType.COMMAND, 284 "ADD FILES": TokenType.COMMAND, 285 "ADD JAR": TokenType.COMMAND, 286 "ADD JARS": TokenType.COMMAND, 287 "MINUS": TokenType.EXCEPT, 288 "MSCK REPAIR": TokenType.COMMAND, 289 "REFRESH": TokenType.REFRESH, 290 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 291 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 292 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 293 } 294 295 NUMERIC_LITERALS = { 296 "L": "BIGINT", 297 "S": "SMALLINT", 298 "Y": "TINYINT", 299 "D": "DOUBLE", 300 "F": "FLOAT", 301 "BD": "DECIMAL", 302 } 303 304 class Parser(parser.Parser): 305 LOG_DEFAULTS_TO_LN = True 306 STRICT_CAST = False 307 VALUES_FOLLOWED_BY_PAREN = False 308 JOINS_HAVE_EQUAL_PRECEDENCE = True 309 310 FUNCTIONS = { 311 **parser.Parser.FUNCTIONS, 312 "ASCII": exp.Unicode.from_arg_list, 313 "BASE64": exp.ToBase64.from_arg_list, 314 "COLLECT_LIST": lambda args: exp.ArrayAgg(this=seq_get(args, 0), nulls_excluded=True), 315 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 316 "DATE_ADD": lambda args: exp.TsOrDsAdd( 317 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 318 ), 319 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 320 [ 321 exp.TimeStrToTime(this=seq_get(args, 0)), 322 seq_get(args, 1), 323 ] 324 ), 325 "DATE_SUB": lambda args: exp.TsOrDsAdd( 326 this=seq_get(args, 0), 327 expression=exp.Mul(this=seq_get(args, 1), expression=exp.Literal.number(-1)), 328 unit=exp.Literal.string("DAY"), 329 ), 330 "DATEDIFF": lambda args: exp.DateDiff( 331 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 332 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 333 ), 334 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 335 "FIRST": _build_with_ignore_nulls(exp.First), 336 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 337 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 338 "GET_JSON_OBJECT": lambda args, dialect: exp.JSONExtractScalar( 339 this=seq_get(args, 0), expression=dialect.to_json_path(seq_get(args, 1)) 340 ), 341 "LAST": _build_with_ignore_nulls(exp.Last), 342 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 343 "MAP": parser.build_var_map, 344 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 345 "PERCENTILE": exp.Quantile.from_arg_list, 346 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 347 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 348 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 349 "SEQUENCE": exp.GenerateSeries.from_arg_list, 350 "SIZE": exp.ArraySize.from_arg_list, 351 "SPLIT": exp.RegexpSplit.from_arg_list, 352 "STR_TO_MAP": lambda args: exp.StrToMap( 353 this=seq_get(args, 0), 354 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 355 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 356 ), 357 "TO_DATE": _build_to_date, 358 "TO_JSON": exp.JSONFormat.from_arg_list, 359 "TRUNC": exp.TimestampTrunc.from_arg_list, 360 "UNBASE64": exp.FromBase64.from_arg_list, 361 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 362 args or [exp.CurrentTimestamp()] 363 ), 364 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 365 } 366 367 NO_PAREN_FUNCTION_PARSERS = { 368 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 369 "TRANSFORM": lambda self: self._parse_transform(), 370 } 371 372 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 373 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 374 375 PROPERTY_PARSERS = { 376 **parser.Parser.PROPERTY_PARSERS, 377 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 378 expressions=self._parse_wrapped_csv(self._parse_property) 379 ), 380 } 381 382 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 383 if not self._match(TokenType.L_PAREN, advance=False): 384 self._retreat(self._index - 1) 385 return None 386 387 args = self._parse_wrapped_csv(self._parse_lambda) 388 row_format_before = self._parse_row_format(match_row=True) 389 390 record_writer = None 391 if self._match_text_seq("RECORDWRITER"): 392 record_writer = self._parse_string() 393 394 if not self._match(TokenType.USING): 395 return exp.Transform.from_arg_list(args) 396 397 command_script = self._parse_string() 398 399 self._match(TokenType.ALIAS) 400 schema = self._parse_schema() 401 402 row_format_after = self._parse_row_format(match_row=True) 403 record_reader = None 404 if self._match_text_seq("RECORDREADER"): 405 record_reader = self._parse_string() 406 407 return self.expression( 408 exp.QueryTransform, 409 expressions=args, 410 command_script=command_script, 411 schema=schema, 412 row_format_before=row_format_before, 413 record_writer=record_writer, 414 row_format_after=row_format_after, 415 record_reader=record_reader, 416 ) 417 418 def _parse_types( 419 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 420 ) -> t.Optional[exp.Expression]: 421 """ 422 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 423 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 424 425 spark-sql (default)> select cast(1234 as varchar(2)); 426 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 427 char/varchar type and simply treats them as string type. Please use string type 428 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 429 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 430 431 1234 432 Time taken: 4.265 seconds, Fetched 1 row(s) 433 434 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 435 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 436 437 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 438 """ 439 this = super()._parse_types( 440 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 441 ) 442 443 if this and not schema: 444 return this.transform( 445 lambda node: ( 446 node.replace(exp.DataType.build("text")) 447 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 448 else node 449 ), 450 copy=False, 451 ) 452 453 return this 454 455 def _parse_partition_and_order( 456 self, 457 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 458 return ( 459 ( 460 self._parse_csv(self._parse_assignment) 461 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 462 else [] 463 ), 464 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 465 ) 466 467 def _parse_parameter(self) -> exp.Parameter: 468 self._match(TokenType.L_BRACE) 469 this = self._parse_identifier() or self._parse_primary_or_var() 470 expression = self._match(TokenType.COLON) and ( 471 self._parse_identifier() or self._parse_primary_or_var() 472 ) 473 self._match(TokenType.R_BRACE) 474 return self.expression(exp.Parameter, this=this, expression=expression) 475 476 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 477 if expression.is_star: 478 return expression 479 480 if isinstance(expression, exp.Column): 481 key = expression.this 482 else: 483 key = exp.to_identifier(f"col{index + 1}") 484 485 return self.expression(exp.PropertyEQ, this=key, expression=expression) 486 487 class Generator(generator.Generator): 488 LIMIT_FETCH = "LIMIT" 489 TABLESAMPLE_WITH_METHOD = False 490 JOIN_HINTS = False 491 TABLE_HINTS = False 492 QUERY_HINTS = False 493 INDEX_ON = "ON TABLE" 494 EXTRACT_ALLOWS_QUOTES = False 495 NVL2_SUPPORTED = False 496 LAST_DAY_SUPPORTS_DATE_PART = False 497 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 498 SUPPORTS_TO_NUMBER = False 499 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 500 PARSE_JSON_NAME: t.Optional[str] = None 501 PAD_FILL_PATTERN_IS_REQUIRED = True 502 SUPPORTS_MEDIAN = False 503 ARRAY_SIZE_NAME = "SIZE" 504 505 EXPRESSIONS_WITHOUT_NESTED_CTES = { 506 exp.Insert, 507 exp.Select, 508 exp.Subquery, 509 exp.SetOperation, 510 } 511 512 SUPPORTED_JSON_PATH_PARTS = { 513 exp.JSONPathKey, 514 exp.JSONPathRoot, 515 exp.JSONPathSubscript, 516 exp.JSONPathWildcard, 517 } 518 519 TYPE_MAPPING = { 520 **generator.Generator.TYPE_MAPPING, 521 exp.DataType.Type.BIT: "BOOLEAN", 522 exp.DataType.Type.BLOB: "BINARY", 523 exp.DataType.Type.DATETIME: "TIMESTAMP", 524 exp.DataType.Type.ROWVERSION: "BINARY", 525 exp.DataType.Type.TEXT: "STRING", 526 exp.DataType.Type.TIME: "TIMESTAMP", 527 exp.DataType.Type.TIMESTAMPNTZ: "TIMESTAMP", 528 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 529 exp.DataType.Type.UTINYINT: "SMALLINT", 530 exp.DataType.Type.VARBINARY: "BINARY", 531 } 532 533 TRANSFORMS = { 534 **generator.Generator.TRANSFORMS, 535 exp.Group: transforms.preprocess([transforms.unalias_group]), 536 exp.Property: property_sql, 537 exp.AnyValue: rename_func("FIRST"), 538 exp.ApproxDistinct: approx_count_distinct_sql, 539 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 540 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 541 exp.ArrayConcat: rename_func("CONCAT"), 542 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 543 exp.ArraySort: _array_sort_sql, 544 exp.With: no_recursive_cte_sql, 545 exp.DateAdd: _add_date_sql, 546 exp.DateDiff: _date_diff_sql, 547 exp.DateStrToDate: datestrtodate_sql, 548 exp.DateSub: _add_date_sql, 549 exp.DateToDi: lambda self, 550 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 551 exp.DiToDate: lambda self, 552 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 553 exp.FileFormatProperty: lambda self, 554 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 555 exp.StorageHandlerProperty: lambda self, e: f"STORED BY {self.sql(e, 'this')}", 556 exp.FromBase64: rename_func("UNBASE64"), 557 exp.GenerateSeries: sequence_sql, 558 exp.GenerateDateArray: sequence_sql, 559 exp.If: if_sql(), 560 exp.ILike: no_ilike_sql, 561 exp.IntDiv: lambda self, e: self.binary(e, "DIV"), 562 exp.IsNan: rename_func("ISNAN"), 563 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 564 exp.JSONExtractScalar: lambda self, e: self.func( 565 "GET_JSON_OBJECT", e.this, e.expression 566 ), 567 exp.JSONFormat: _json_format_sql, 568 exp.Left: left_to_substring_sql, 569 exp.Map: var_map_sql, 570 exp.Max: max_or_greatest, 571 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 572 exp.Min: min_or_least, 573 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 574 exp.NotNullColumnConstraint: lambda _, e: ( 575 "" if e.args.get("allow_null") else "NOT NULL" 576 ), 577 exp.VarMap: var_map_sql, 578 exp.Create: preprocess( 579 [ 580 remove_unique_constraints, 581 ctas_with_tmp_tables_to_create_tmp_view, 582 move_schema_columns_to_partitioned_by, 583 ] 584 ), 585 exp.Quantile: rename_func("PERCENTILE"), 586 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 587 exp.RegexpExtract: regexp_extract_sql, 588 exp.RegexpExtractAll: regexp_extract_sql, 589 exp.RegexpReplace: regexp_replace_sql, 590 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 591 exp.RegexpSplit: rename_func("SPLIT"), 592 exp.Right: right_to_substring_sql, 593 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 594 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 595 exp.Split: lambda self, e: self.func( 596 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 597 ), 598 exp.Select: transforms.preprocess( 599 [ 600 transforms.eliminate_qualify, 601 transforms.eliminate_distinct_on, 602 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 603 transforms.any_to_exists, 604 ] 605 ), 606 exp.StrPosition: lambda self, e: strposition_sql( 607 self, e, func_name="LOCATE", supports_position=True 608 ), 609 exp.StrToDate: _str_to_date_sql, 610 exp.StrToTime: _str_to_time_sql, 611 exp.StrToUnix: _str_to_unix_sql, 612 exp.StructExtract: struct_extract_sql, 613 exp.StarMap: rename_func("MAP"), 614 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 615 exp.TimeStrToDate: rename_func("TO_DATE"), 616 exp.TimeStrToTime: timestrtotime_sql, 617 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 618 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 619 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 620 exp.ToBase64: rename_func("BASE64"), 621 exp.TsOrDiToDi: lambda self, 622 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 623 exp.TsOrDsAdd: _add_date_sql, 624 exp.TsOrDsDiff: _date_diff_sql, 625 exp.TsOrDsToDate: _to_date_sql, 626 exp.TryCast: no_trycast_sql, 627 exp.Unicode: rename_func("ASCII"), 628 exp.UnixToStr: lambda self, e: self.func( 629 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 630 ), 631 exp.UnixToTime: _unix_to_time_sql, 632 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 633 exp.Unnest: rename_func("EXPLODE"), 634 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 635 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 636 exp.National: lambda self, e: self.national_sql(e, prefix=""), 637 exp.ClusteredColumnConstraint: lambda self, 638 e: f"({self.expressions(e, 'this', indent=False)})", 639 exp.NonClusteredColumnConstraint: lambda self, 640 e: f"({self.expressions(e, 'this', indent=False)})", 641 exp.NotForReplicationColumnConstraint: lambda *_: "", 642 exp.OnProperty: lambda *_: "", 643 exp.PartitionedByBucket: lambda self, e: self.func("BUCKET", e.expression, e.this), 644 exp.PartitionByTruncate: lambda self, e: self.func("TRUNCATE", e.expression, e.this), 645 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 646 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 647 exp.DayOfMonth: rename_func("DAYOFMONTH"), 648 exp.DayOfWeek: rename_func("DAYOFWEEK"), 649 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 650 rename_func("LEVENSHTEIN") 651 ), 652 } 653 654 PROPERTIES_LOCATION = { 655 **generator.Generator.PROPERTIES_LOCATION, 656 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 657 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 658 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 659 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 660 } 661 662 def unnest_sql(self, expression: exp.Unnest) -> str: 663 return rename_func("EXPLODE")(self, expression) 664 665 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 666 if isinstance(expression.this, exp.JSONPathWildcard): 667 self.unsupported("Unsupported wildcard in JSONPathKey expression") 668 return "" 669 670 return super()._jsonpathkey_sql(expression) 671 672 def parameter_sql(self, expression: exp.Parameter) -> str: 673 this = self.sql(expression, "this") 674 expression_sql = self.sql(expression, "expression") 675 676 parent = expression.parent 677 this = f"{this}:{expression_sql}" if expression_sql else this 678 679 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 680 # We need to produce SET key = value instead of SET ${key} = value 681 return this 682 683 return f"${{{this}}}" 684 685 def schema_sql(self, expression: exp.Schema) -> str: 686 for ordered in expression.find_all(exp.Ordered): 687 if ordered.args.get("desc") is False: 688 ordered.set("desc", None) 689 690 return super().schema_sql(expression) 691 692 def constraint_sql(self, expression: exp.Constraint) -> str: 693 for prop in list(expression.find_all(exp.Properties)): 694 prop.pop() 695 696 this = self.sql(expression, "this") 697 expressions = self.expressions(expression, sep=" ", flat=True) 698 return f"CONSTRAINT {this} {expressions}" 699 700 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 701 serde_props = self.sql(expression, "serde_properties") 702 serde_props = f" {serde_props}" if serde_props else "" 703 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 704 705 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 706 return self.func( 707 "COLLECT_LIST", 708 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 709 ) 710 711 def datatype_sql(self, expression: exp.DataType) -> str: 712 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 713 not expression.expressions or expression.expressions[0].name == "MAX" 714 ): 715 expression = exp.DataType.build("text") 716 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 717 expression.set("this", exp.DataType.Type.VARCHAR) 718 elif expression.this in exp.DataType.TEMPORAL_TYPES: 719 expression = exp.DataType.build(expression.this) 720 elif expression.is_type("float"): 721 size_expression = expression.find(exp.DataTypeParam) 722 if size_expression: 723 size = int(size_expression.name) 724 expression = ( 725 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 726 ) 727 728 return super().datatype_sql(expression) 729 730 def version_sql(self, expression: exp.Version) -> str: 731 sql = super().version_sql(expression) 732 return sql.replace("FOR ", "", 1) 733 734 def struct_sql(self, expression: exp.Struct) -> str: 735 values = [] 736 737 for i, e in enumerate(expression.expressions): 738 if isinstance(e, exp.PropertyEQ): 739 self.unsupported("Hive does not support named structs.") 740 values.append(e.expression) 741 else: 742 values.append(e) 743 744 return self.func("STRUCT", *values) 745 746 def columndef_sql(self, expression: exp.ColumnDef, sep: str = " ") -> str: 747 return super().columndef_sql( 748 expression, 749 sep=( 750 ": " 751 if isinstance(expression.parent, exp.DataType) 752 and expression.parent.is_type("struct") 753 else sep 754 ), 755 ) 756 757 def alterset_sql(self, expression: exp.AlterSet) -> str: 758 exprs = self.expressions(expression, flat=True) 759 exprs = f" {exprs}" if exprs else "" 760 location = self.sql(expression, "location") 761 location = f" LOCATION {location}" if location else "" 762 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 763 file_format = f" FILEFORMAT {file_format}" if file_format else "" 764 serde = self.sql(expression, "serde") 765 serde = f" SERDE {serde}" if serde else "" 766 tags = self.expressions(expression, key="tag", flat=True, sep="") 767 tags = f" TAGS {tags}" if tags else "" 768 769 return f"SET{serde}{exprs}{location}{file_format}{tags}" 770 771 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 772 prefix = "WITH " if expression.args.get("with") else "" 773 exprs = self.expressions(expression, flat=True) 774 775 return f"{prefix}SERDEPROPERTIES ({exprs})" 776 777 def exists_sql(self, expression: exp.Exists) -> str: 778 if expression.expression: 779 return self.function_fallback_sql(expression) 780 781 return super().exists_sql(expression) 782 783 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 784 this = expression.this 785 if isinstance(this, exp.TimeStrToTime): 786 this = this.this 787 788 return self.func("DATE_FORMAT", this, self.format_time(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')
TS_OR_DS_EXPRESSIONS =
(<class 'sqlglot.expressions.DateDiff'>, <class 'sqlglot.expressions.Day'>, <class 'sqlglot.expressions.Month'>, <class 'sqlglot.expressions.Year'>)
class
Hive(sqlglot.dialects.dialect.Dialect):
205class Hive(Dialect): 206 ALIAS_POST_TABLESAMPLE = True 207 IDENTIFIERS_CAN_START_WITH_DIGIT = True 208 SUPPORTS_USER_DEFINED_TYPES = False 209 SAFE_DIVISION = True 210 ARRAY_AGG_INCLUDES_NULLS = None 211 REGEXP_EXTRACT_DEFAULT_GROUP = 1 212 213 # https://spark.apache.org/docs/latest/sql-ref-identifier.html#description 214 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 215 216 ANNOTATORS = { 217 **Dialect.ANNOTATORS, 218 exp.If: lambda self, e: self._annotate_by_args(e, "true", "false", promote=True), 219 exp.Coalesce: lambda self, e: self._annotate_by_args( 220 e, "this", "expressions", promote=True 221 ), 222 } 223 224 # Support only the non-ANSI mode (default for Hive, Spark2, Spark) 225 COERCES_TO = defaultdict(set, deepcopy(TypeAnnotator.COERCES_TO)) 226 for target_type in { 227 *exp.DataType.NUMERIC_TYPES, 228 *exp.DataType.TEMPORAL_TYPES, 229 exp.DataType.Type.INTERVAL, 230 }: 231 COERCES_TO[target_type] |= exp.DataType.TEXT_TYPES 232 233 TIME_MAPPING = { 234 "y": "%Y", 235 "Y": "%Y", 236 "YYYY": "%Y", 237 "yyyy": "%Y", 238 "YY": "%y", 239 "yy": "%y", 240 "MMMM": "%B", 241 "MMM": "%b", 242 "MM": "%m", 243 "M": "%-m", 244 "dd": "%d", 245 "d": "%-d", 246 "HH": "%H", 247 "H": "%-H", 248 "hh": "%I", 249 "h": "%-I", 250 "mm": "%M", 251 "m": "%-M", 252 "ss": "%S", 253 "s": "%-S", 254 "SSSSSS": "%f", 255 "a": "%p", 256 "DD": "%j", 257 "D": "%-j", 258 "E": "%a", 259 "EE": "%a", 260 "EEE": "%a", 261 "EEEE": "%A", 262 "z": "%Z", 263 "Z": "%z", 264 } 265 266 DATE_FORMAT = "'yyyy-MM-dd'" 267 DATEINT_FORMAT = "'yyyyMMdd'" 268 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 269 270 class Tokenizer(tokens.Tokenizer): 271 QUOTES = ["'", '"'] 272 IDENTIFIERS = ["`"] 273 STRING_ESCAPES = ["\\"] 274 275 SINGLE_TOKENS = { 276 **tokens.Tokenizer.SINGLE_TOKENS, 277 "$": TokenType.PARAMETER, 278 } 279 280 KEYWORDS = { 281 **tokens.Tokenizer.KEYWORDS, 282 "ADD ARCHIVE": TokenType.COMMAND, 283 "ADD ARCHIVES": TokenType.COMMAND, 284 "ADD FILE": TokenType.COMMAND, 285 "ADD FILES": TokenType.COMMAND, 286 "ADD JAR": TokenType.COMMAND, 287 "ADD JARS": TokenType.COMMAND, 288 "MINUS": TokenType.EXCEPT, 289 "MSCK REPAIR": TokenType.COMMAND, 290 "REFRESH": TokenType.REFRESH, 291 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 292 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 293 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 294 } 295 296 NUMERIC_LITERALS = { 297 "L": "BIGINT", 298 "S": "SMALLINT", 299 "Y": "TINYINT", 300 "D": "DOUBLE", 301 "F": "FLOAT", 302 "BD": "DECIMAL", 303 } 304 305 class Parser(parser.Parser): 306 LOG_DEFAULTS_TO_LN = True 307 STRICT_CAST = False 308 VALUES_FOLLOWED_BY_PAREN = False 309 JOINS_HAVE_EQUAL_PRECEDENCE = True 310 311 FUNCTIONS = { 312 **parser.Parser.FUNCTIONS, 313 "ASCII": exp.Unicode.from_arg_list, 314 "BASE64": exp.ToBase64.from_arg_list, 315 "COLLECT_LIST": lambda args: exp.ArrayAgg(this=seq_get(args, 0), nulls_excluded=True), 316 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 317 "DATE_ADD": lambda args: exp.TsOrDsAdd( 318 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 319 ), 320 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 321 [ 322 exp.TimeStrToTime(this=seq_get(args, 0)), 323 seq_get(args, 1), 324 ] 325 ), 326 "DATE_SUB": lambda args: exp.TsOrDsAdd( 327 this=seq_get(args, 0), 328 expression=exp.Mul(this=seq_get(args, 1), expression=exp.Literal.number(-1)), 329 unit=exp.Literal.string("DAY"), 330 ), 331 "DATEDIFF": lambda args: exp.DateDiff( 332 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 333 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 334 ), 335 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 336 "FIRST": _build_with_ignore_nulls(exp.First), 337 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 338 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 339 "GET_JSON_OBJECT": lambda args, dialect: exp.JSONExtractScalar( 340 this=seq_get(args, 0), expression=dialect.to_json_path(seq_get(args, 1)) 341 ), 342 "LAST": _build_with_ignore_nulls(exp.Last), 343 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 344 "MAP": parser.build_var_map, 345 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 346 "PERCENTILE": exp.Quantile.from_arg_list, 347 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 348 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 349 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 350 "SEQUENCE": exp.GenerateSeries.from_arg_list, 351 "SIZE": exp.ArraySize.from_arg_list, 352 "SPLIT": exp.RegexpSplit.from_arg_list, 353 "STR_TO_MAP": lambda args: exp.StrToMap( 354 this=seq_get(args, 0), 355 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 356 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 357 ), 358 "TO_DATE": _build_to_date, 359 "TO_JSON": exp.JSONFormat.from_arg_list, 360 "TRUNC": exp.TimestampTrunc.from_arg_list, 361 "UNBASE64": exp.FromBase64.from_arg_list, 362 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 363 args or [exp.CurrentTimestamp()] 364 ), 365 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 366 } 367 368 NO_PAREN_FUNCTION_PARSERS = { 369 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 370 "TRANSFORM": lambda self: self._parse_transform(), 371 } 372 373 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 374 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 375 376 PROPERTY_PARSERS = { 377 **parser.Parser.PROPERTY_PARSERS, 378 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 379 expressions=self._parse_wrapped_csv(self._parse_property) 380 ), 381 } 382 383 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 384 if not self._match(TokenType.L_PAREN, advance=False): 385 self._retreat(self._index - 1) 386 return None 387 388 args = self._parse_wrapped_csv(self._parse_lambda) 389 row_format_before = self._parse_row_format(match_row=True) 390 391 record_writer = None 392 if self._match_text_seq("RECORDWRITER"): 393 record_writer = self._parse_string() 394 395 if not self._match(TokenType.USING): 396 return exp.Transform.from_arg_list(args) 397 398 command_script = self._parse_string() 399 400 self._match(TokenType.ALIAS) 401 schema = self._parse_schema() 402 403 row_format_after = self._parse_row_format(match_row=True) 404 record_reader = None 405 if self._match_text_seq("RECORDREADER"): 406 record_reader = self._parse_string() 407 408 return self.expression( 409 exp.QueryTransform, 410 expressions=args, 411 command_script=command_script, 412 schema=schema, 413 row_format_before=row_format_before, 414 record_writer=record_writer, 415 row_format_after=row_format_after, 416 record_reader=record_reader, 417 ) 418 419 def _parse_types( 420 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 421 ) -> t.Optional[exp.Expression]: 422 """ 423 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 424 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 425 426 spark-sql (default)> select cast(1234 as varchar(2)); 427 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 428 char/varchar type and simply treats them as string type. Please use string type 429 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 430 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 431 432 1234 433 Time taken: 4.265 seconds, Fetched 1 row(s) 434 435 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 436 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 437 438 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 439 """ 440 this = super()._parse_types( 441 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 442 ) 443 444 if this and not schema: 445 return this.transform( 446 lambda node: ( 447 node.replace(exp.DataType.build("text")) 448 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 449 else node 450 ), 451 copy=False, 452 ) 453 454 return this 455 456 def _parse_partition_and_order( 457 self, 458 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 459 return ( 460 ( 461 self._parse_csv(self._parse_assignment) 462 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 463 else [] 464 ), 465 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 466 ) 467 468 def _parse_parameter(self) -> exp.Parameter: 469 self._match(TokenType.L_BRACE) 470 this = self._parse_identifier() or self._parse_primary_or_var() 471 expression = self._match(TokenType.COLON) and ( 472 self._parse_identifier() or self._parse_primary_or_var() 473 ) 474 self._match(TokenType.R_BRACE) 475 return self.expression(exp.Parameter, this=this, expression=expression) 476 477 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 478 if expression.is_star: 479 return expression 480 481 if isinstance(expression, exp.Column): 482 key = expression.this 483 else: 484 key = exp.to_identifier(f"col{index + 1}") 485 486 return self.expression(exp.PropertyEQ, this=key, expression=expression) 487 488 class Generator(generator.Generator): 489 LIMIT_FETCH = "LIMIT" 490 TABLESAMPLE_WITH_METHOD = False 491 JOIN_HINTS = False 492 TABLE_HINTS = False 493 QUERY_HINTS = False 494 INDEX_ON = "ON TABLE" 495 EXTRACT_ALLOWS_QUOTES = False 496 NVL2_SUPPORTED = False 497 LAST_DAY_SUPPORTS_DATE_PART = False 498 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 499 SUPPORTS_TO_NUMBER = False 500 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 501 PARSE_JSON_NAME: t.Optional[str] = None 502 PAD_FILL_PATTERN_IS_REQUIRED = True 503 SUPPORTS_MEDIAN = False 504 ARRAY_SIZE_NAME = "SIZE" 505 506 EXPRESSIONS_WITHOUT_NESTED_CTES = { 507 exp.Insert, 508 exp.Select, 509 exp.Subquery, 510 exp.SetOperation, 511 } 512 513 SUPPORTED_JSON_PATH_PARTS = { 514 exp.JSONPathKey, 515 exp.JSONPathRoot, 516 exp.JSONPathSubscript, 517 exp.JSONPathWildcard, 518 } 519 520 TYPE_MAPPING = { 521 **generator.Generator.TYPE_MAPPING, 522 exp.DataType.Type.BIT: "BOOLEAN", 523 exp.DataType.Type.BLOB: "BINARY", 524 exp.DataType.Type.DATETIME: "TIMESTAMP", 525 exp.DataType.Type.ROWVERSION: "BINARY", 526 exp.DataType.Type.TEXT: "STRING", 527 exp.DataType.Type.TIME: "TIMESTAMP", 528 exp.DataType.Type.TIMESTAMPNTZ: "TIMESTAMP", 529 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 530 exp.DataType.Type.UTINYINT: "SMALLINT", 531 exp.DataType.Type.VARBINARY: "BINARY", 532 } 533 534 TRANSFORMS = { 535 **generator.Generator.TRANSFORMS, 536 exp.Group: transforms.preprocess([transforms.unalias_group]), 537 exp.Property: property_sql, 538 exp.AnyValue: rename_func("FIRST"), 539 exp.ApproxDistinct: approx_count_distinct_sql, 540 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 541 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 542 exp.ArrayConcat: rename_func("CONCAT"), 543 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 544 exp.ArraySort: _array_sort_sql, 545 exp.With: no_recursive_cte_sql, 546 exp.DateAdd: _add_date_sql, 547 exp.DateDiff: _date_diff_sql, 548 exp.DateStrToDate: datestrtodate_sql, 549 exp.DateSub: _add_date_sql, 550 exp.DateToDi: lambda self, 551 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 552 exp.DiToDate: lambda self, 553 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 554 exp.FileFormatProperty: lambda self, 555 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 556 exp.StorageHandlerProperty: lambda self, e: f"STORED BY {self.sql(e, 'this')}", 557 exp.FromBase64: rename_func("UNBASE64"), 558 exp.GenerateSeries: sequence_sql, 559 exp.GenerateDateArray: sequence_sql, 560 exp.If: if_sql(), 561 exp.ILike: no_ilike_sql, 562 exp.IntDiv: lambda self, e: self.binary(e, "DIV"), 563 exp.IsNan: rename_func("ISNAN"), 564 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 565 exp.JSONExtractScalar: lambda self, e: self.func( 566 "GET_JSON_OBJECT", e.this, e.expression 567 ), 568 exp.JSONFormat: _json_format_sql, 569 exp.Left: left_to_substring_sql, 570 exp.Map: var_map_sql, 571 exp.Max: max_or_greatest, 572 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 573 exp.Min: min_or_least, 574 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 575 exp.NotNullColumnConstraint: lambda _, e: ( 576 "" if e.args.get("allow_null") else "NOT NULL" 577 ), 578 exp.VarMap: var_map_sql, 579 exp.Create: preprocess( 580 [ 581 remove_unique_constraints, 582 ctas_with_tmp_tables_to_create_tmp_view, 583 move_schema_columns_to_partitioned_by, 584 ] 585 ), 586 exp.Quantile: rename_func("PERCENTILE"), 587 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 588 exp.RegexpExtract: regexp_extract_sql, 589 exp.RegexpExtractAll: regexp_extract_sql, 590 exp.RegexpReplace: regexp_replace_sql, 591 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 592 exp.RegexpSplit: rename_func("SPLIT"), 593 exp.Right: right_to_substring_sql, 594 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 595 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 596 exp.Split: lambda self, e: self.func( 597 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 598 ), 599 exp.Select: transforms.preprocess( 600 [ 601 transforms.eliminate_qualify, 602 transforms.eliminate_distinct_on, 603 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 604 transforms.any_to_exists, 605 ] 606 ), 607 exp.StrPosition: lambda self, e: strposition_sql( 608 self, e, func_name="LOCATE", supports_position=True 609 ), 610 exp.StrToDate: _str_to_date_sql, 611 exp.StrToTime: _str_to_time_sql, 612 exp.StrToUnix: _str_to_unix_sql, 613 exp.StructExtract: struct_extract_sql, 614 exp.StarMap: rename_func("MAP"), 615 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 616 exp.TimeStrToDate: rename_func("TO_DATE"), 617 exp.TimeStrToTime: timestrtotime_sql, 618 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 619 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 620 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 621 exp.ToBase64: rename_func("BASE64"), 622 exp.TsOrDiToDi: lambda self, 623 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 624 exp.TsOrDsAdd: _add_date_sql, 625 exp.TsOrDsDiff: _date_diff_sql, 626 exp.TsOrDsToDate: _to_date_sql, 627 exp.TryCast: no_trycast_sql, 628 exp.Unicode: rename_func("ASCII"), 629 exp.UnixToStr: lambda self, e: self.func( 630 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 631 ), 632 exp.UnixToTime: _unix_to_time_sql, 633 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 634 exp.Unnest: rename_func("EXPLODE"), 635 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 636 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 637 exp.National: lambda self, e: self.national_sql(e, prefix=""), 638 exp.ClusteredColumnConstraint: lambda self, 639 e: f"({self.expressions(e, 'this', indent=False)})", 640 exp.NonClusteredColumnConstraint: lambda self, 641 e: f"({self.expressions(e, 'this', indent=False)})", 642 exp.NotForReplicationColumnConstraint: lambda *_: "", 643 exp.OnProperty: lambda *_: "", 644 exp.PartitionedByBucket: lambda self, e: self.func("BUCKET", e.expression, e.this), 645 exp.PartitionByTruncate: lambda self, e: self.func("TRUNCATE", e.expression, e.this), 646 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 647 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 648 exp.DayOfMonth: rename_func("DAYOFMONTH"), 649 exp.DayOfWeek: rename_func("DAYOFWEEK"), 650 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 651 rename_func("LEVENSHTEIN") 652 ), 653 } 654 655 PROPERTIES_LOCATION = { 656 **generator.Generator.PROPERTIES_LOCATION, 657 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 658 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 659 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 660 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 661 } 662 663 def unnest_sql(self, expression: exp.Unnest) -> str: 664 return rename_func("EXPLODE")(self, expression) 665 666 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 667 if isinstance(expression.this, exp.JSONPathWildcard): 668 self.unsupported("Unsupported wildcard in JSONPathKey expression") 669 return "" 670 671 return super()._jsonpathkey_sql(expression) 672 673 def parameter_sql(self, expression: exp.Parameter) -> str: 674 this = self.sql(expression, "this") 675 expression_sql = self.sql(expression, "expression") 676 677 parent = expression.parent 678 this = f"{this}:{expression_sql}" if expression_sql else this 679 680 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 681 # We need to produce SET key = value instead of SET ${key} = value 682 return this 683 684 return f"${{{this}}}" 685 686 def schema_sql(self, expression: exp.Schema) -> str: 687 for ordered in expression.find_all(exp.Ordered): 688 if ordered.args.get("desc") is False: 689 ordered.set("desc", None) 690 691 return super().schema_sql(expression) 692 693 def constraint_sql(self, expression: exp.Constraint) -> str: 694 for prop in list(expression.find_all(exp.Properties)): 695 prop.pop() 696 697 this = self.sql(expression, "this") 698 expressions = self.expressions(expression, sep=" ", flat=True) 699 return f"CONSTRAINT {this} {expressions}" 700 701 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 702 serde_props = self.sql(expression, "serde_properties") 703 serde_props = f" {serde_props}" if serde_props else "" 704 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 705 706 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 707 return self.func( 708 "COLLECT_LIST", 709 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 710 ) 711 712 def datatype_sql(self, expression: exp.DataType) -> str: 713 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 714 not expression.expressions or expression.expressions[0].name == "MAX" 715 ): 716 expression = exp.DataType.build("text") 717 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 718 expression.set("this", exp.DataType.Type.VARCHAR) 719 elif expression.this in exp.DataType.TEMPORAL_TYPES: 720 expression = exp.DataType.build(expression.this) 721 elif expression.is_type("float"): 722 size_expression = expression.find(exp.DataTypeParam) 723 if size_expression: 724 size = int(size_expression.name) 725 expression = ( 726 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 727 ) 728 729 return super().datatype_sql(expression) 730 731 def version_sql(self, expression: exp.Version) -> str: 732 sql = super().version_sql(expression) 733 return sql.replace("FOR ", "", 1) 734 735 def struct_sql(self, expression: exp.Struct) -> str: 736 values = [] 737 738 for i, e in enumerate(expression.expressions): 739 if isinstance(e, exp.PropertyEQ): 740 self.unsupported("Hive does not support named structs.") 741 values.append(e.expression) 742 else: 743 values.append(e) 744 745 return self.func("STRUCT", *values) 746 747 def columndef_sql(self, expression: exp.ColumnDef, sep: str = " ") -> str: 748 return super().columndef_sql( 749 expression, 750 sep=( 751 ": " 752 if isinstance(expression.parent, exp.DataType) 753 and expression.parent.is_type("struct") 754 else sep 755 ), 756 ) 757 758 def alterset_sql(self, expression: exp.AlterSet) -> str: 759 exprs = self.expressions(expression, flat=True) 760 exprs = f" {exprs}" if exprs else "" 761 location = self.sql(expression, "location") 762 location = f" LOCATION {location}" if location else "" 763 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 764 file_format = f" FILEFORMAT {file_format}" if file_format else "" 765 serde = self.sql(expression, "serde") 766 serde = f" SERDE {serde}" if serde else "" 767 tags = self.expressions(expression, key="tag", flat=True, sep="") 768 tags = f" TAGS {tags}" if tags else "" 769 770 return f"SET{serde}{exprs}{location}{file_format}{tags}" 771 772 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 773 prefix = "WITH " if expression.args.get("with") else "" 774 exprs = self.expressions(expression, flat=True) 775 776 return f"{prefix}SERDEPROPERTIES ({exprs})" 777 778 def exists_sql(self, expression: exp.Exists) -> str: 779 if expression.expression: 780 return self.function_fallback_sql(expression) 781 782 return super().exists_sql(expression) 783 784 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 785 this = expression.this 786 if isinstance(this, exp.TimeStrToTime): 787 this = this.this 788 789 return self.func("DATE_FORMAT", this, self.format_time(expression))
NORMALIZATION_STRATEGY =
<NormalizationStrategy.CASE_INSENSITIVE: 'CASE_INSENSITIVE'>
Specifies the strategy according to which identifiers should be normalized.
ANNOTATORS: Dict[Type[~E], Callable[[sqlglot.optimizer.annotate_types.TypeAnnotator, ~E], ~E]] =
{<class 'sqlglot.expressions.Alias'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.BitwiseNot'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Neg'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Not'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Paren'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.PivotAlias'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Unary'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Add'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.And'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.ArrayContains'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.ArrayContainsAll'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.ArrayOverlaps'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Binary'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.BitwiseAnd'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.BitwiseLeftShift'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.BitwiseOr'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.BitwiseRightShift'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.BitwiseXor'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Collate'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Connector'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Corr'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.CovarPop'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.CovarSamp'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.DPipe'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Distance'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Div'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Dot'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.EQ'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Escape'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.GT'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.GTE'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Glob'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.ILike'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.ILikeAny'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.IntDiv'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Is'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.JSONArrayContains'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.JSONBContains'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.JSONBExtract'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.JSONBExtractScalar'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.JSONExtract'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.JSONExtractScalar'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Kwarg'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.LT'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.LTE'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Like'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.LikeAny'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Mod'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Mul'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.NEQ'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.NullSafeEQ'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.NullSafeNEQ'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Operator'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Or'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Overlaps'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Pow'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.PropertyEQ'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.RegexpILike'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.RegexpLike'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.SimilarTo'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Slice'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Sub'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.Xor'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.ApproxDistinct'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Length'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ArraySize'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Between'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Boolean'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.In'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Date'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DateFromParts'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeStrToDate'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TsOrDsToDate'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DiToDate'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.StrToDate'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentDate'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DateStrToDate'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentDatetime'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DatetimeSub'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Datetime'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DatetimeAdd'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Log'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.SafeDivide'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Ln'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.StddevPop'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Stddev'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Exp'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Sqrt'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.VariancePop'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Avg'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Variance'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ApproxQuantile'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ToDouble'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Quantile'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Round'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.StddevSamp'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimestampDiff'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DatetimeDiff'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DateToDi'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Levenshtein'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Ceil'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeDiff'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DateDiff'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Sign'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.StrPosition'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TsOrDiToDi'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ParseJSON'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeAdd'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Time'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentTime'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeSub'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentTimestampLTZ'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimestampSub'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeStrToTime'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimestampAdd'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.StrToTime'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentTimestamp'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixToTime'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Year'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Quarter'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Day'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Month'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Week'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DateToDateStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.GroupConcat'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Initcap'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ConcatWs'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Substring'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.String'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ArrayConcat'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Concat'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixToStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Upper'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeToTimeStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Lower'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TsOrDsToDateStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixToTimeStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeToStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Trim'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Abs'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Anonymous'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Array'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.ArrayAgg'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Bracket'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Cast'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Case'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Coalesce'>: <function Hive.<lambda>>, <class 'sqlglot.expressions.Count'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.DataType'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.DateAdd'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.DateSub'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.DateTrunc'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Distinct'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Explode'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Extract'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Filter'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.GenerateDateArray'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.GenerateTimestampArray'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Greatest'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.If'>: <function Hive.<lambda>>, <class 'sqlglot.expressions.Interval'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Least'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Literal'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Map'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Max'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Min'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Null'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Nullif'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Struct'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Sum'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.SortArray'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Timestamp'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.ToMap'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.TryCast'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Unnest'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.VarMap'>: <function Dialect.<lambda>>}
COERCES_TO: Dict[sqlglot.expressions.DataType.Type, Set[sqlglot.expressions.DataType.Type]] =
defaultdict(<class 'set'>, {<Type.TEXT: 'TEXT'>: set(), <Type.NVARCHAR: 'NVARCHAR'>: {<Type.TEXT: 'TEXT'>}, <Type.VARCHAR: 'VARCHAR'>: {<Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>}, <Type.NCHAR: 'NCHAR'>: {<Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>}, <Type.CHAR: 'CHAR'>: {<Type.NCHAR: 'NCHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>}, <Type.DOUBLE: 'DOUBLE'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.FLOAT: 'FLOAT'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.DOUBLE: 'DOUBLE'>, <Type.NAME: 'NAME'>}, <Type.DECIMAL: 'DECIMAL'>: {<Type.TEXT: 'TEXT'>, <Type.DOUBLE: 'DOUBLE'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.FLOAT: 'FLOAT'>}, <Type.BIGINT: 'BIGINT'>: {<Type.TEXT: 'TEXT'>, <Type.DOUBLE: 'DOUBLE'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.DECIMAL: 'DECIMAL'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.FLOAT: 'FLOAT'>}, <Type.INT: 'INT'>: {<Type.TEXT: 'TEXT'>, <Type.BIGINT: 'BIGINT'>, <Type.DOUBLE: 'DOUBLE'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.DECIMAL: 'DECIMAL'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.FLOAT: 'FLOAT'>}, <Type.SMALLINT: 'SMALLINT'>: {<Type.TEXT: 'TEXT'>, <Type.BIGINT: 'BIGINT'>, <Type.DOUBLE: 'DOUBLE'>, <Type.INT: 'INT'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.DECIMAL: 'DECIMAL'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.FLOAT: 'FLOAT'>}, <Type.TINYINT: 'TINYINT'>: {<Type.TEXT: 'TEXT'>, <Type.BIGINT: 'BIGINT'>, <Type.DOUBLE: 'DOUBLE'>, <Type.INT: 'INT'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>, <Type.SMALLINT: 'SMALLINT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.DECIMAL: 'DECIMAL'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.FLOAT: 'FLOAT'>}, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>}, <Type.TIMESTAMP: 'TIMESTAMP'>: {<Type.TEXT: 'TEXT'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>}, <Type.DATETIME: 'DATETIME'>: {<Type.TEXT: 'TEXT'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <Type.NAME: 'NAME'>, <Type.TIMESTAMP: 'TIMESTAMP'>, <Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>}, <Type.DATE: 'DATE'>: {<Type.TEXT: 'TEXT'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <Type.NAME: 'NAME'>, <Type.TIMESTAMP: 'TIMESTAMP'>, <Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <Type.DATETIME: 'DATETIME'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>}, <Type.NULL: 'NULL'>: {<Type.TINYINT: 'TINYINT'>, <Type.TEXT: 'TEXT'>, <Type.BIGINT: 'BIGINT'>, <Type.NCHAR: 'NCHAR'>, <Type.DOUBLE: 'DOUBLE'>, <Type.INT: 'INT'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <Type.CHAR: 'CHAR'>, <Type.SMALLINT: 'SMALLINT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.DECIMAL: 'DECIMAL'>, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <Type.TIMESTAMP: 'TIMESTAMP'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.DATE: 'DATE'>, <Type.DATETIME: 'DATETIME'>, <Type.FLOAT: 'FLOAT'>}, <Type.DECIMAL128: 'DECIMAL128'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.DATE32: 'DATE32'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.DATETIME64: 'DATETIME64'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.UINT: 'UINT'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.UDOUBLE: 'UDOUBLE'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.SMALLMONEY: 'SMALLMONEY'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.TIMESTAMP_S: 'TIMESTAMP_S'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.INT128: 'INT128'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.MEDIUMINT: 'MEDIUMINT'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.UMEDIUMINT: 'UMEDIUMINT'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.MONEY: 'MONEY'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.DECIMAL256: 'DECIMAL256'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.DECIMAL64: 'DECIMAL64'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.UINT256: 'UINT256'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.UINT128: 'UINT128'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.UTINYINT: 'UTINYINT'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.UBIGINT: 'UBIGINT'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.USMALLINT: 'USMALLINT'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.UDECIMAL: 'UDECIMAL'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.TIME: 'TIME'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.BIGDECIMAL: 'BIGDECIMAL'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.TIMESTAMP_MS: 'TIMESTAMP_MS'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.SMALLDATETIME: 'SMALLDATETIME'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.BIT: 'BIT'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.DATETIME2: 'DATETIME2'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.TIMESTAMP_NS: 'TIMESTAMP_NS'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.TIMETZ: 'TIMETZ'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.DECIMAL32: 'DECIMAL32'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.INTERVAL: 'INTERVAL'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.INT256: 'INT256'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}, <Type.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>: {<Type.CHAR: 'CHAR'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>}})
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', 'z': '%Z', 'Z': '%z'}
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}}}}, 'z': {0: True}, 'Z': {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}}}}, 'z': {0: True}, 'Z': {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', '%Z': 'z', '%z': 'Z'}
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}, 'Z': {0: True}, 'z': {0: True}}}
270 class Tokenizer(tokens.Tokenizer): 271 QUOTES = ["'", '"'] 272 IDENTIFIERS = ["`"] 273 STRING_ESCAPES = ["\\"] 274 275 SINGLE_TOKENS = { 276 **tokens.Tokenizer.SINGLE_TOKENS, 277 "$": TokenType.PARAMETER, 278 } 279 280 KEYWORDS = { 281 **tokens.Tokenizer.KEYWORDS, 282 "ADD ARCHIVE": TokenType.COMMAND, 283 "ADD ARCHIVES": TokenType.COMMAND, 284 "ADD FILE": TokenType.COMMAND, 285 "ADD FILES": TokenType.COMMAND, 286 "ADD JAR": TokenType.COMMAND, 287 "ADD JARS": TokenType.COMMAND, 288 "MINUS": TokenType.EXCEPT, 289 "MSCK REPAIR": TokenType.COMMAND, 290 "REFRESH": TokenType.REFRESH, 291 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 292 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 293 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 294 } 295 296 NUMERIC_LITERALS = { 297 "L": "BIGINT", 298 "S": "SMALLINT", 299 "Y": "TINYINT", 300 "D": "DOUBLE", 301 "F": "FLOAT", 302 "BD": "DECIMAL", 303 }
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.PIPE_GT: 'PIPE_GT'>, '>=': <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_SCHEMA': <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, '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'>, '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'>, 'INT128': <TokenType.INT128: 'INT128'>, 'INT256': <TokenType.INT256: 'INT256'>, 'LONG': <TokenType.BIGINT: 'BIGINT'>, 'BIGINT': <TokenType.BIGINT: 'BIGINT'>, 'INT8': <TokenType.TINYINT: 'TINYINT'>, 'UINT': <TokenType.UINT: 'UINT'>, 'UINT128': <TokenType.UINT128: 'UINT128'>, 'UINT256': <TokenType.UINT256: 'UINT256'>, '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'>, 'CHAR VARYING': <TokenType.VARCHAR: 'VARCHAR'>, 'CHARACTER VARYING': <TokenType.VARCHAR: 'VARCHAR'>, '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
305 class Parser(parser.Parser): 306 LOG_DEFAULTS_TO_LN = True 307 STRICT_CAST = False 308 VALUES_FOLLOWED_BY_PAREN = False 309 JOINS_HAVE_EQUAL_PRECEDENCE = True 310 311 FUNCTIONS = { 312 **parser.Parser.FUNCTIONS, 313 "ASCII": exp.Unicode.from_arg_list, 314 "BASE64": exp.ToBase64.from_arg_list, 315 "COLLECT_LIST": lambda args: exp.ArrayAgg(this=seq_get(args, 0), nulls_excluded=True), 316 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 317 "DATE_ADD": lambda args: exp.TsOrDsAdd( 318 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 319 ), 320 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 321 [ 322 exp.TimeStrToTime(this=seq_get(args, 0)), 323 seq_get(args, 1), 324 ] 325 ), 326 "DATE_SUB": lambda args: exp.TsOrDsAdd( 327 this=seq_get(args, 0), 328 expression=exp.Mul(this=seq_get(args, 1), expression=exp.Literal.number(-1)), 329 unit=exp.Literal.string("DAY"), 330 ), 331 "DATEDIFF": lambda args: exp.DateDiff( 332 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 333 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 334 ), 335 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 336 "FIRST": _build_with_ignore_nulls(exp.First), 337 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 338 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 339 "GET_JSON_OBJECT": lambda args, dialect: exp.JSONExtractScalar( 340 this=seq_get(args, 0), expression=dialect.to_json_path(seq_get(args, 1)) 341 ), 342 "LAST": _build_with_ignore_nulls(exp.Last), 343 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 344 "MAP": parser.build_var_map, 345 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 346 "PERCENTILE": exp.Quantile.from_arg_list, 347 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 348 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 349 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 350 "SEQUENCE": exp.GenerateSeries.from_arg_list, 351 "SIZE": exp.ArraySize.from_arg_list, 352 "SPLIT": exp.RegexpSplit.from_arg_list, 353 "STR_TO_MAP": lambda args: exp.StrToMap( 354 this=seq_get(args, 0), 355 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 356 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 357 ), 358 "TO_DATE": _build_to_date, 359 "TO_JSON": exp.JSONFormat.from_arg_list, 360 "TRUNC": exp.TimestampTrunc.from_arg_list, 361 "UNBASE64": exp.FromBase64.from_arg_list, 362 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 363 args or [exp.CurrentTimestamp()] 364 ), 365 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 366 } 367 368 NO_PAREN_FUNCTION_PARSERS = { 369 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 370 "TRANSFORM": lambda self: self._parse_transform(), 371 } 372 373 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 374 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 375 376 PROPERTY_PARSERS = { 377 **parser.Parser.PROPERTY_PARSERS, 378 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 379 expressions=self._parse_wrapped_csv(self._parse_property) 380 ), 381 } 382 383 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 384 if not self._match(TokenType.L_PAREN, advance=False): 385 self._retreat(self._index - 1) 386 return None 387 388 args = self._parse_wrapped_csv(self._parse_lambda) 389 row_format_before = self._parse_row_format(match_row=True) 390 391 record_writer = None 392 if self._match_text_seq("RECORDWRITER"): 393 record_writer = self._parse_string() 394 395 if not self._match(TokenType.USING): 396 return exp.Transform.from_arg_list(args) 397 398 command_script = self._parse_string() 399 400 self._match(TokenType.ALIAS) 401 schema = self._parse_schema() 402 403 row_format_after = self._parse_row_format(match_row=True) 404 record_reader = None 405 if self._match_text_seq("RECORDREADER"): 406 record_reader = self._parse_string() 407 408 return self.expression( 409 exp.QueryTransform, 410 expressions=args, 411 command_script=command_script, 412 schema=schema, 413 row_format_before=row_format_before, 414 record_writer=record_writer, 415 row_format_after=row_format_after, 416 record_reader=record_reader, 417 ) 418 419 def _parse_types( 420 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 421 ) -> t.Optional[exp.Expression]: 422 """ 423 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 424 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 425 426 spark-sql (default)> select cast(1234 as varchar(2)); 427 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 428 char/varchar type and simply treats them as string type. Please use string type 429 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 430 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 431 432 1234 433 Time taken: 4.265 seconds, Fetched 1 row(s) 434 435 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 436 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 437 438 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 439 """ 440 this = super()._parse_types( 441 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 442 ) 443 444 if this and not schema: 445 return this.transform( 446 lambda node: ( 447 node.replace(exp.DataType.build("text")) 448 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 449 else node 450 ), 451 copy=False, 452 ) 453 454 return this 455 456 def _parse_partition_and_order( 457 self, 458 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 459 return ( 460 ( 461 self._parse_csv(self._parse_assignment) 462 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 463 else [] 464 ), 465 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 466 ) 467 468 def _parse_parameter(self) -> exp.Parameter: 469 self._match(TokenType.L_BRACE) 470 this = self._parse_identifier() or self._parse_primary_or_var() 471 expression = self._match(TokenType.COLON) and ( 472 self._parse_identifier() or self._parse_primary_or_var() 473 ) 474 self._match(TokenType.R_BRACE) 475 return self.expression(exp.Parameter, this=this, expression=expression) 476 477 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 478 if expression.is_star: 479 return expression 480 481 if isinstance(expression, exp.Column): 482 key = expression.this 483 else: 484 key = exp.to_identifier(f"col{index + 1}") 485 486 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'>>, 'AND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.And'>>, '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_CONCAT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayConcatAgg'>>, '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_INTERSECT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayIntersect'>>, 'ARRAY_INTERSECTION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayIntersect'>>, 'ARRAY_OVERLAPS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayOverlaps'>>, 'ARRAY_REMOVE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayRemove'>>, '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>, 'CONVERT_TO_CHARSET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ConvertToCharset'>>, '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_SCHEMA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentSchema'>>, '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_TIMESTAMP_L_T_Z': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTimestampLTZ'>>, '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>>, 'DATE_BIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateBin'>>, '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'>>, 'ENDS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.EndsWith'>>, 'ENDSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.EndsWith'>>, '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_B_OBJECT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBObjectAgg'>>, 'J_S_O_N_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONCast'>>, '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'>>, 'OR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Or'>>, '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'>>, 'REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Replace'>>, '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'>>, 'ST_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StDistance'>>, 'ST_POINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StPoint'>>, 'ST_MAKEPOINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StPoint'>>, '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'>>, 'STRTOK_TO_ARRAY': <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>>, '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>>, 'STRPOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrPosition'>>, 'CHARINDEX': <function Parser.<lambda>>, 'INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrPosition'>>, 'LOCATE': <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': <function Hive.Parser.<lambda>>, '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_to_date>, '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>>, 'ENVIRONMENT': <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.DATE32: 'DATE32'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.NAME: 'NAME'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.JSON: 'JSON'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.IPV4: 'IPV4'>, <TokenType.NEXT: 'NEXT'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.DESC: 'DESC'>, <TokenType.DIV: 'DIV'>, <TokenType.ANY: 'ANY'>, <TokenType.INT128: 'INT128'>, <TokenType.DELETE: 'DELETE'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.BINARY: 'BINARY'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.PUT: 'PUT'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.RENAME: 'RENAME'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.RING: 'RING'>, <TokenType.TIME: 'TIME'>, <TokenType.ASC: 'ASC'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.LOAD: 'LOAD'>, <TokenType.JSONB: 'JSONB'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.FALSE: 'FALSE'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.SOME: 'SOME'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.POINT: 'POINT'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.FIRST: 'FIRST'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.SUPER: 'SUPER'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.TRUE: 'TRUE'>, <TokenType.UINT128: 'UINT128'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.RANGE: 'RANGE'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.COPY: 'COPY'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.SINK: 'SINK'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.BIT: 'BIT'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.ENUM: 'ENUM'>, <TokenType.CASE: 'CASE'>, <TokenType.TOP: 'TOP'>, <TokenType.LIST: 'LIST'>, <TokenType.TEXT: 'TEXT'>, <TokenType.NATURAL: 'NATURAL'>, <TokenType.YEAR: 'YEAR'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.INET: 'INET'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.INT256: 'INT256'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.MERGE: 'MERGE'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.UINT: 'UINT'>, <TokenType.MAP: 'MAP'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.ASOF: 'ASOF'>, <TokenType.VOID: 'VOID'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.NULL: 'NULL'>, <TokenType.IPV6: 'IPV6'>, <TokenType.MONEY: 'MONEY'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.KEEP: 'KEEP'>, <TokenType.BLOB: 'BLOB'>, <TokenType.CUBE: 'CUBE'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.FILTER: 'FILTER'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.FINAL: 'FINAL'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.INDEX: 'INDEX'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.CHAR: 'CHAR'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.APPLY: 'APPLY'>, <TokenType.IS: 'IS'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.TAG: 'TAG'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.CACHE: 'CACHE'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.SHOW: 'SHOW'>, <TokenType.FILE_FORMAT: 'FILE_FORMAT'>, <TokenType.FULL: 'FULL'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.UUID: 'UUID'>, <TokenType.SEMI: 'SEMI'>, <TokenType.SET: 'SET'>, <TokenType.ALL: 'ALL'>, <TokenType.LEFT: 'LEFT'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.ROW: 'ROW'>, <TokenType.KILL: 'KILL'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.INT: 'INT'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.END: 'END'>, <TokenType.MODEL: 'MODEL'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.USE: 'USE'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.NESTED: 'NESTED'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.GET: 'GET'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.TABLE: 'TABLE'>, <TokenType.VIEW: 'VIEW'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.VAR: 'VAR'>, <TokenType.UINT256: 'UINT256'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.ROWS: 'ROWS'>, <TokenType.DETACH: 'DETACH'>, <TokenType.DATE: 'DATE'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.XML: 'XML'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.ANTI: 'ANTI'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.STAGE: 'STAGE'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>}
TABLE_ALIAS_TOKENS =
{<TokenType.DATE32: 'DATE32'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.NAME: 'NAME'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.JSON: 'JSON'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.IPV4: 'IPV4'>, <TokenType.NEXT: 'NEXT'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.DESC: 'DESC'>, <TokenType.DIV: 'DIV'>, <TokenType.ANY: 'ANY'>, <TokenType.INT128: 'INT128'>, <TokenType.DELETE: 'DELETE'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.BINARY: 'BINARY'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.PUT: 'PUT'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.RENAME: 'RENAME'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.RING: 'RING'>, <TokenType.TIME: 'TIME'>, <TokenType.ASC: 'ASC'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.LOAD: 'LOAD'>, <TokenType.JSONB: 'JSONB'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.FALSE: 'FALSE'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.SOME: 'SOME'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.POINT: 'POINT'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.FIRST: 'FIRST'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.SUPER: 'SUPER'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.TRUE: 'TRUE'>, <TokenType.UINT128: 'UINT128'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.RANGE: 'RANGE'>, <TokenType.COPY: 'COPY'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.SINK: 'SINK'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.BIT: 'BIT'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.ENUM: 'ENUM'>, <TokenType.CASE: 'CASE'>, <TokenType.TOP: 'TOP'>, <TokenType.LIST: 'LIST'>, <TokenType.TEXT: 'TEXT'>, <TokenType.YEAR: 'YEAR'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.INET: 'INET'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.INT256: 'INT256'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.MERGE: 'MERGE'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.UINT: 'UINT'>, <TokenType.MAP: 'MAP'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.VOID: 'VOID'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.NULL: 'NULL'>, <TokenType.IPV6: 'IPV6'>, <TokenType.MONEY: 'MONEY'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.KEEP: 'KEEP'>, <TokenType.BLOB: 'BLOB'>, <TokenType.CUBE: 'CUBE'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.FILTER: 'FILTER'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.FINAL: 'FINAL'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.INDEX: 'INDEX'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.CHAR: 'CHAR'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.IS: 'IS'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.TAG: 'TAG'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.CACHE: 'CACHE'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.SHOW: 'SHOW'>, <TokenType.FILE_FORMAT: 'FILE_FORMAT'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.UUID: 'UUID'>, <TokenType.SET: 'SET'>, <TokenType.ALL: 'ALL'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.ROW: 'ROW'>, <TokenType.KILL: 'KILL'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.INT: 'INT'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.END: 'END'>, <TokenType.MODEL: 'MODEL'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.USE: 'USE'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.NESTED: 'NESTED'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.GET: 'GET'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.TABLE: 'TABLE'>, <TokenType.VIEW: 'VIEW'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.VAR: 'VAR'>, <TokenType.UINT256: 'UINT256'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.ROWS: 'ROWS'>, <TokenType.DETACH: 'DETACH'>, <TokenType.DATE: 'DATE'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.XML: 'XML'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.STAGE: 'STAGE'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>}
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
- ALIAS_TOKENS
- COLON_PLACEHOLDER_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
- PIPE_SYNTAX_TRANSFORM_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
- WINDOW_EXCLUDE_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
- RECURSIVE_CTE_SEARCH_KIND
- MODIFIABLES
- PREFIXED_PIVOT_COLUMNS
- IDENTIFY_PIVOT_STRINGS
- 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
- ALTER_RENAME_REQUIRES_COLUMN
- ZONE_AWARE_TIMESTAMP_CONSTRUCTOR
- error_level
- error_message_context
- max_errors
- dialect
- reset
- parse
- parse_into
- check_errors
- raise_error
- expression
- validate_expression
- parse_set_operation
- errors
- sql
488 class Generator(generator.Generator): 489 LIMIT_FETCH = "LIMIT" 490 TABLESAMPLE_WITH_METHOD = False 491 JOIN_HINTS = False 492 TABLE_HINTS = False 493 QUERY_HINTS = False 494 INDEX_ON = "ON TABLE" 495 EXTRACT_ALLOWS_QUOTES = False 496 NVL2_SUPPORTED = False 497 LAST_DAY_SUPPORTS_DATE_PART = False 498 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 499 SUPPORTS_TO_NUMBER = False 500 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 501 PARSE_JSON_NAME: t.Optional[str] = None 502 PAD_FILL_PATTERN_IS_REQUIRED = True 503 SUPPORTS_MEDIAN = False 504 ARRAY_SIZE_NAME = "SIZE" 505 506 EXPRESSIONS_WITHOUT_NESTED_CTES = { 507 exp.Insert, 508 exp.Select, 509 exp.Subquery, 510 exp.SetOperation, 511 } 512 513 SUPPORTED_JSON_PATH_PARTS = { 514 exp.JSONPathKey, 515 exp.JSONPathRoot, 516 exp.JSONPathSubscript, 517 exp.JSONPathWildcard, 518 } 519 520 TYPE_MAPPING = { 521 **generator.Generator.TYPE_MAPPING, 522 exp.DataType.Type.BIT: "BOOLEAN", 523 exp.DataType.Type.BLOB: "BINARY", 524 exp.DataType.Type.DATETIME: "TIMESTAMP", 525 exp.DataType.Type.ROWVERSION: "BINARY", 526 exp.DataType.Type.TEXT: "STRING", 527 exp.DataType.Type.TIME: "TIMESTAMP", 528 exp.DataType.Type.TIMESTAMPNTZ: "TIMESTAMP", 529 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 530 exp.DataType.Type.UTINYINT: "SMALLINT", 531 exp.DataType.Type.VARBINARY: "BINARY", 532 } 533 534 TRANSFORMS = { 535 **generator.Generator.TRANSFORMS, 536 exp.Group: transforms.preprocess([transforms.unalias_group]), 537 exp.Property: property_sql, 538 exp.AnyValue: rename_func("FIRST"), 539 exp.ApproxDistinct: approx_count_distinct_sql, 540 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 541 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 542 exp.ArrayConcat: rename_func("CONCAT"), 543 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 544 exp.ArraySort: _array_sort_sql, 545 exp.With: no_recursive_cte_sql, 546 exp.DateAdd: _add_date_sql, 547 exp.DateDiff: _date_diff_sql, 548 exp.DateStrToDate: datestrtodate_sql, 549 exp.DateSub: _add_date_sql, 550 exp.DateToDi: lambda self, 551 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 552 exp.DiToDate: lambda self, 553 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 554 exp.FileFormatProperty: lambda self, 555 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 556 exp.StorageHandlerProperty: lambda self, e: f"STORED BY {self.sql(e, 'this')}", 557 exp.FromBase64: rename_func("UNBASE64"), 558 exp.GenerateSeries: sequence_sql, 559 exp.GenerateDateArray: sequence_sql, 560 exp.If: if_sql(), 561 exp.ILike: no_ilike_sql, 562 exp.IntDiv: lambda self, e: self.binary(e, "DIV"), 563 exp.IsNan: rename_func("ISNAN"), 564 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 565 exp.JSONExtractScalar: lambda self, e: self.func( 566 "GET_JSON_OBJECT", e.this, e.expression 567 ), 568 exp.JSONFormat: _json_format_sql, 569 exp.Left: left_to_substring_sql, 570 exp.Map: var_map_sql, 571 exp.Max: max_or_greatest, 572 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 573 exp.Min: min_or_least, 574 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 575 exp.NotNullColumnConstraint: lambda _, e: ( 576 "" if e.args.get("allow_null") else "NOT NULL" 577 ), 578 exp.VarMap: var_map_sql, 579 exp.Create: preprocess( 580 [ 581 remove_unique_constraints, 582 ctas_with_tmp_tables_to_create_tmp_view, 583 move_schema_columns_to_partitioned_by, 584 ] 585 ), 586 exp.Quantile: rename_func("PERCENTILE"), 587 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 588 exp.RegexpExtract: regexp_extract_sql, 589 exp.RegexpExtractAll: regexp_extract_sql, 590 exp.RegexpReplace: regexp_replace_sql, 591 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 592 exp.RegexpSplit: rename_func("SPLIT"), 593 exp.Right: right_to_substring_sql, 594 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 595 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 596 exp.Split: lambda self, e: self.func( 597 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 598 ), 599 exp.Select: transforms.preprocess( 600 [ 601 transforms.eliminate_qualify, 602 transforms.eliminate_distinct_on, 603 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 604 transforms.any_to_exists, 605 ] 606 ), 607 exp.StrPosition: lambda self, e: strposition_sql( 608 self, e, func_name="LOCATE", supports_position=True 609 ), 610 exp.StrToDate: _str_to_date_sql, 611 exp.StrToTime: _str_to_time_sql, 612 exp.StrToUnix: _str_to_unix_sql, 613 exp.StructExtract: struct_extract_sql, 614 exp.StarMap: rename_func("MAP"), 615 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 616 exp.TimeStrToDate: rename_func("TO_DATE"), 617 exp.TimeStrToTime: timestrtotime_sql, 618 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 619 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 620 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 621 exp.ToBase64: rename_func("BASE64"), 622 exp.TsOrDiToDi: lambda self, 623 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 624 exp.TsOrDsAdd: _add_date_sql, 625 exp.TsOrDsDiff: _date_diff_sql, 626 exp.TsOrDsToDate: _to_date_sql, 627 exp.TryCast: no_trycast_sql, 628 exp.Unicode: rename_func("ASCII"), 629 exp.UnixToStr: lambda self, e: self.func( 630 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 631 ), 632 exp.UnixToTime: _unix_to_time_sql, 633 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 634 exp.Unnest: rename_func("EXPLODE"), 635 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 636 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 637 exp.National: lambda self, e: self.national_sql(e, prefix=""), 638 exp.ClusteredColumnConstraint: lambda self, 639 e: f"({self.expressions(e, 'this', indent=False)})", 640 exp.NonClusteredColumnConstraint: lambda self, 641 e: f"({self.expressions(e, 'this', indent=False)})", 642 exp.NotForReplicationColumnConstraint: lambda *_: "", 643 exp.OnProperty: lambda *_: "", 644 exp.PartitionedByBucket: lambda self, e: self.func("BUCKET", e.expression, e.this), 645 exp.PartitionByTruncate: lambda self, e: self.func("TRUNCATE", e.expression, e.this), 646 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 647 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 648 exp.DayOfMonth: rename_func("DAYOFMONTH"), 649 exp.DayOfWeek: rename_func("DAYOFWEEK"), 650 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 651 rename_func("LEVENSHTEIN") 652 ), 653 } 654 655 PROPERTIES_LOCATION = { 656 **generator.Generator.PROPERTIES_LOCATION, 657 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 658 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 659 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 660 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 661 } 662 663 def unnest_sql(self, expression: exp.Unnest) -> str: 664 return rename_func("EXPLODE")(self, expression) 665 666 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 667 if isinstance(expression.this, exp.JSONPathWildcard): 668 self.unsupported("Unsupported wildcard in JSONPathKey expression") 669 return "" 670 671 return super()._jsonpathkey_sql(expression) 672 673 def parameter_sql(self, expression: exp.Parameter) -> str: 674 this = self.sql(expression, "this") 675 expression_sql = self.sql(expression, "expression") 676 677 parent = expression.parent 678 this = f"{this}:{expression_sql}" if expression_sql else this 679 680 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 681 # We need to produce SET key = value instead of SET ${key} = value 682 return this 683 684 return f"${{{this}}}" 685 686 def schema_sql(self, expression: exp.Schema) -> str: 687 for ordered in expression.find_all(exp.Ordered): 688 if ordered.args.get("desc") is False: 689 ordered.set("desc", None) 690 691 return super().schema_sql(expression) 692 693 def constraint_sql(self, expression: exp.Constraint) -> str: 694 for prop in list(expression.find_all(exp.Properties)): 695 prop.pop() 696 697 this = self.sql(expression, "this") 698 expressions = self.expressions(expression, sep=" ", flat=True) 699 return f"CONSTRAINT {this} {expressions}" 700 701 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 702 serde_props = self.sql(expression, "serde_properties") 703 serde_props = f" {serde_props}" if serde_props else "" 704 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 705 706 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 707 return self.func( 708 "COLLECT_LIST", 709 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 710 ) 711 712 def datatype_sql(self, expression: exp.DataType) -> str: 713 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 714 not expression.expressions or expression.expressions[0].name == "MAX" 715 ): 716 expression = exp.DataType.build("text") 717 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 718 expression.set("this", exp.DataType.Type.VARCHAR) 719 elif expression.this in exp.DataType.TEMPORAL_TYPES: 720 expression = exp.DataType.build(expression.this) 721 elif expression.is_type("float"): 722 size_expression = expression.find(exp.DataTypeParam) 723 if size_expression: 724 size = int(size_expression.name) 725 expression = ( 726 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 727 ) 728 729 return super().datatype_sql(expression) 730 731 def version_sql(self, expression: exp.Version) -> str: 732 sql = super().version_sql(expression) 733 return sql.replace("FOR ", "", 1) 734 735 def struct_sql(self, expression: exp.Struct) -> str: 736 values = [] 737 738 for i, e in enumerate(expression.expressions): 739 if isinstance(e, exp.PropertyEQ): 740 self.unsupported("Hive does not support named structs.") 741 values.append(e.expression) 742 else: 743 values.append(e) 744 745 return self.func("STRUCT", *values) 746 747 def columndef_sql(self, expression: exp.ColumnDef, sep: str = " ") -> str: 748 return super().columndef_sql( 749 expression, 750 sep=( 751 ": " 752 if isinstance(expression.parent, exp.DataType) 753 and expression.parent.is_type("struct") 754 else sep 755 ), 756 ) 757 758 def alterset_sql(self, expression: exp.AlterSet) -> str: 759 exprs = self.expressions(expression, flat=True) 760 exprs = f" {exprs}" if exprs else "" 761 location = self.sql(expression, "location") 762 location = f" LOCATION {location}" if location else "" 763 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 764 file_format = f" FILEFORMAT {file_format}" if file_format else "" 765 serde = self.sql(expression, "serde") 766 serde = f" SERDE {serde}" if serde else "" 767 tags = self.expressions(expression, key="tag", flat=True, sep="") 768 tags = f" TAGS {tags}" if tags else "" 769 770 return f"SET{serde}{exprs}{location}{file_format}{tags}" 771 772 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 773 prefix = "WITH " if expression.args.get("with") else "" 774 exprs = self.expressions(expression, flat=True) 775 776 return f"{prefix}SERDEPROPERTIES ({exprs})" 777 778 def exists_sql(self, expression: exp.Exists) -> str: 779 if expression.expression: 780 return self.function_fallback_sql(expression) 781 782 return super().exists_sql(expression) 783 784 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 785 this = expression.this 786 if isinstance(this, exp.TimeStrToTime): 787 this = this.this 788 789 return self.func("DATE_FORMAT", this, self.format_time(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.Insert'>, <class 'sqlglot.expressions.SetOperation'>, <class 'sqlglot.expressions.Subquery'>, <class 'sqlglot.expressions.Select'>}
SUPPORTED_JSON_PATH_PARTS =
{<class 'sqlglot.expressions.JSONPathKey'>, <class 'sqlglot.expressions.JSONPathRoot'>, <class 'sqlglot.expressions.JSONPathWildcard'>, <class 'sqlglot.expressions.JSONPathSubscript'>}
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.BLOB: 'BLOB'>: 'BINARY', <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.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>: '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.ConvertToCharset'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CopyGrantsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CredentialsProperty'>: <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.EnviromentProperty'>: <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.Get'>: <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.PartitionedByBucket'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.PartitionByTruncate'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.PivotAny'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ProjectionPolicyColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Put'>: <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.TableColumn'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Tags'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TemporaryProperty'>: <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.UsingTemplateProperty'>: <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.ForceProperty'>: <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.StorageHandlerProperty'>: <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.IntDiv'>: <function Hive.Generator.<lambda>>, <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.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 Hive.Generator.<lambda>>, <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.StarMap'>: <function rename_func.<locals>.<lambda>>, <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.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.EnviromentProperty'>: <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.StorageHandlerProperty'>: <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.UsingTemplateProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <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'>, <class 'sqlglot.expressions.ForceProperty'>: <Location.POST_CREATE: 'POST_CREATE'>}
673 def parameter_sql(self, expression: exp.Parameter) -> str: 674 this = self.sql(expression, "this") 675 expression_sql = self.sql(expression, "expression") 676 677 parent = expression.parent 678 this = f"{this}:{expression_sql}" if expression_sql else this 679 680 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 681 # We need to produce SET key = value instead of SET ${key} = value 682 return this 683 684 return f"${{{this}}}"
def
rowformatserdeproperty_sql(self, expression: sqlglot.expressions.RowFormatSerdeProperty) -> str:
712 def datatype_sql(self, expression: exp.DataType) -> str: 713 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 714 not expression.expressions or expression.expressions[0].name == "MAX" 715 ): 716 expression = exp.DataType.build("text") 717 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 718 expression.set("this", exp.DataType.Type.VARCHAR) 719 elif expression.this in exp.DataType.TEMPORAL_TYPES: 720 expression = exp.DataType.build(expression.this) 721 elif expression.is_type("float"): 722 size_expression = expression.find(exp.DataTypeParam) 723 if size_expression: 724 size = int(size_expression.name) 725 expression = ( 726 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 727 ) 728 729 return super().datatype_sql(expression)
735 def struct_sql(self, expression: exp.Struct) -> str: 736 values = [] 737 738 for i, e in enumerate(expression.expressions): 739 if isinstance(e, exp.PropertyEQ): 740 self.unsupported("Hive does not support named structs.") 741 values.append(e.expression) 742 else: 743 values.append(e) 744 745 return self.func("STRUCT", *values)
758 def alterset_sql(self, expression: exp.AlterSet) -> str: 759 exprs = self.expressions(expression, flat=True) 760 exprs = f" {exprs}" if exprs else "" 761 location = self.sql(expression, "location") 762 location = f" LOCATION {location}" if location else "" 763 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 764 file_format = f" FILEFORMAT {file_format}" if file_format else "" 765 serde = self.sql(expression, "serde") 766 serde = f" SERDE {serde}" if serde else "" 767 tags = self.expressions(expression, key="tag", flat=True, sep="") 768 tags = f" TAGS {tags}" if tags else "" 769 770 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
- SUPPORTS_WINDOW_EXCLUDE
- 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
- ALTER_SET_WRAPPED
- NORMALIZE_EXTRACT_DATE_PARTS
- ALTER_SET_TYPE
- 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
- RESPECT_IGNORE_NULLS_UNSUPPORTED_EXPRESSIONS
- 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
- sanitize_comment
- maybe_comment
- wrap
- no_identify
- normalize_func
- indent
- sql
- uncache_sql
- cache_sql
- characterset_sql
- column_parts
- column_sql
- columnposition_sql
- columnconstraint_sql
- computedcolumnconstraint_sql
- autoincrementcolumnconstraint_sql
- compresscolumnconstraint_sql
- generatedasidentitycolumnconstraint_sql
- generatedasrowcolumnconstraint_sql
- periodforsystemtimeconstraint_sql
- notnullcolumnconstraint_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
- limitoptions_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
- tablefromrows_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
- for_modifiers
- 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
- alterindex_sql
- alterdiststyle_sql
- altersortkey_sql
- alterrename_sql
- renamecolumn_sql
- alter_sql
- add_column_sql
- droppartition_sql
- addconstraint_sql
- addpartition_sql
- distinct_sql
- ignorenulls_sql
- respectnulls_sql
- havingmax_sql
- intdiv_sql
- dpipe_sql
- div_sql
- safedivide_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
- jsoncast_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
- jsonextractquote_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
- xmlkeyvalueoption_sql
- partitionbyrangeproperty_sql
- partitionbyrangepropertydynamic_sql
- unpivotcolumns_sql
- analyzesample_sql
- analyzestatistics_sql
- analyzehistogram_sql
- analyzedelete_sql
- analyzelistchainedrows_sql
- analyzevalidate_sql
- analyze_sql
- xmltable_sql
- xmlnamespace_sql
- export_sql
- declare_sql
- declareitem_sql
- recursivewithsearch_sql
- parameterizedagg_sql
- anonymousaggfunc_sql
- combinedaggfunc_sql
- combinedparameterizedagg_sql
- show_sql
- get_put_sql
- translatecharacters_sql