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 309 FUNCTIONS = { 310 **parser.Parser.FUNCTIONS, 311 "ASCII": exp.Unicode.from_arg_list, 312 "BASE64": exp.ToBase64.from_arg_list, 313 "COLLECT_LIST": lambda args: exp.ArrayAgg(this=seq_get(args, 0), nulls_excluded=True), 314 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 315 "DATE_ADD": lambda args: exp.TsOrDsAdd( 316 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 317 ), 318 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 319 [ 320 exp.TimeStrToTime(this=seq_get(args, 0)), 321 seq_get(args, 1), 322 ] 323 ), 324 "DATE_SUB": lambda args: exp.TsOrDsAdd( 325 this=seq_get(args, 0), 326 expression=exp.Mul(this=seq_get(args, 1), expression=exp.Literal.number(-1)), 327 unit=exp.Literal.string("DAY"), 328 ), 329 "DATEDIFF": lambda args: exp.DateDiff( 330 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 331 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 332 ), 333 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 334 "FIRST": _build_with_ignore_nulls(exp.First), 335 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 336 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 337 "GET_JSON_OBJECT": lambda args, dialect: exp.JSONExtractScalar( 338 this=seq_get(args, 0), expression=dialect.to_json_path(seq_get(args, 1)) 339 ), 340 "LAST": _build_with_ignore_nulls(exp.Last), 341 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 342 "MAP": parser.build_var_map, 343 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 344 "PERCENTILE": exp.Quantile.from_arg_list, 345 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 346 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 347 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 348 "SEQUENCE": exp.GenerateSeries.from_arg_list, 349 "SIZE": exp.ArraySize.from_arg_list, 350 "SPLIT": exp.RegexpSplit.from_arg_list, 351 "STR_TO_MAP": lambda args: exp.StrToMap( 352 this=seq_get(args, 0), 353 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 354 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 355 ), 356 "TO_DATE": _build_to_date, 357 "TO_JSON": exp.JSONFormat.from_arg_list, 358 "TRUNC": exp.TimestampTrunc.from_arg_list, 359 "UNBASE64": exp.FromBase64.from_arg_list, 360 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 361 args or [exp.CurrentTimestamp()] 362 ), 363 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 364 } 365 366 NO_PAREN_FUNCTION_PARSERS = { 367 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 368 "TRANSFORM": lambda self: self._parse_transform(), 369 } 370 371 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 372 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 373 374 PROPERTY_PARSERS = { 375 **parser.Parser.PROPERTY_PARSERS, 376 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 377 expressions=self._parse_wrapped_csv(self._parse_property) 378 ), 379 } 380 381 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 382 if not self._match(TokenType.L_PAREN, advance=False): 383 self._retreat(self._index - 1) 384 return None 385 386 args = self._parse_wrapped_csv(self._parse_lambda) 387 row_format_before = self._parse_row_format(match_row=True) 388 389 record_writer = None 390 if self._match_text_seq("RECORDWRITER"): 391 record_writer = self._parse_string() 392 393 if not self._match(TokenType.USING): 394 return exp.Transform.from_arg_list(args) 395 396 command_script = self._parse_string() 397 398 self._match(TokenType.ALIAS) 399 schema = self._parse_schema() 400 401 row_format_after = self._parse_row_format(match_row=True) 402 record_reader = None 403 if self._match_text_seq("RECORDREADER"): 404 record_reader = self._parse_string() 405 406 return self.expression( 407 exp.QueryTransform, 408 expressions=args, 409 command_script=command_script, 410 schema=schema, 411 row_format_before=row_format_before, 412 record_writer=record_writer, 413 row_format_after=row_format_after, 414 record_reader=record_reader, 415 ) 416 417 def _parse_types( 418 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 419 ) -> t.Optional[exp.Expression]: 420 """ 421 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 422 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 423 424 spark-sql (default)> select cast(1234 as varchar(2)); 425 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 426 char/varchar type and simply treats them as string type. Please use string type 427 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 428 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 429 430 1234 431 Time taken: 4.265 seconds, Fetched 1 row(s) 432 433 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 434 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 435 436 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 437 """ 438 this = super()._parse_types( 439 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 440 ) 441 442 if this and not schema: 443 return this.transform( 444 lambda node: ( 445 node.replace(exp.DataType.build("text")) 446 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 447 else node 448 ), 449 copy=False, 450 ) 451 452 return this 453 454 def _parse_partition_and_order( 455 self, 456 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 457 return ( 458 ( 459 self._parse_csv(self._parse_assignment) 460 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 461 else [] 462 ), 463 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 464 ) 465 466 def _parse_parameter(self) -> exp.Parameter: 467 self._match(TokenType.L_BRACE) 468 this = self._parse_identifier() or self._parse_primary_or_var() 469 expression = self._match(TokenType.COLON) and ( 470 self._parse_identifier() or self._parse_primary_or_var() 471 ) 472 self._match(TokenType.R_BRACE) 473 return self.expression(exp.Parameter, this=this, expression=expression) 474 475 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 476 if expression.is_star: 477 return expression 478 479 if isinstance(expression, exp.Column): 480 key = expression.this 481 else: 482 key = exp.to_identifier(f"col{index + 1}") 483 484 return self.expression(exp.PropertyEQ, this=key, expression=expression) 485 486 class Generator(generator.Generator): 487 LIMIT_FETCH = "LIMIT" 488 TABLESAMPLE_WITH_METHOD = False 489 JOIN_HINTS = False 490 TABLE_HINTS = False 491 QUERY_HINTS = False 492 INDEX_ON = "ON TABLE" 493 EXTRACT_ALLOWS_QUOTES = False 494 NVL2_SUPPORTED = False 495 LAST_DAY_SUPPORTS_DATE_PART = False 496 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 497 SUPPORTS_TO_NUMBER = False 498 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 499 PARSE_JSON_NAME: t.Optional[str] = None 500 PAD_FILL_PATTERN_IS_REQUIRED = True 501 SUPPORTS_MEDIAN = False 502 ARRAY_SIZE_NAME = "SIZE" 503 504 EXPRESSIONS_WITHOUT_NESTED_CTES = { 505 exp.Insert, 506 exp.Select, 507 exp.Subquery, 508 exp.SetOperation, 509 } 510 511 SUPPORTED_JSON_PATH_PARTS = { 512 exp.JSONPathKey, 513 exp.JSONPathRoot, 514 exp.JSONPathSubscript, 515 exp.JSONPathWildcard, 516 } 517 518 TYPE_MAPPING = { 519 **generator.Generator.TYPE_MAPPING, 520 exp.DataType.Type.BIT: "BOOLEAN", 521 exp.DataType.Type.BLOB: "BINARY", 522 exp.DataType.Type.DATETIME: "TIMESTAMP", 523 exp.DataType.Type.ROWVERSION: "BINARY", 524 exp.DataType.Type.TEXT: "STRING", 525 exp.DataType.Type.TIME: "TIMESTAMP", 526 exp.DataType.Type.TIMESTAMPNTZ: "TIMESTAMP", 527 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 528 exp.DataType.Type.UTINYINT: "SMALLINT", 529 exp.DataType.Type.VARBINARY: "BINARY", 530 } 531 532 TRANSFORMS = { 533 **generator.Generator.TRANSFORMS, 534 exp.Group: transforms.preprocess([transforms.unalias_group]), 535 exp.Property: property_sql, 536 exp.AnyValue: rename_func("FIRST"), 537 exp.ApproxDistinct: approx_count_distinct_sql, 538 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 539 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 540 exp.ArrayConcat: rename_func("CONCAT"), 541 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 542 exp.ArraySort: _array_sort_sql, 543 exp.With: no_recursive_cte_sql, 544 exp.DateAdd: _add_date_sql, 545 exp.DateDiff: _date_diff_sql, 546 exp.DateStrToDate: datestrtodate_sql, 547 exp.DateSub: _add_date_sql, 548 exp.DateToDi: lambda self, 549 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 550 exp.DiToDate: lambda self, 551 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 552 exp.FileFormatProperty: lambda self, 553 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 554 exp.StorageHandlerProperty: lambda self, e: f"STORED BY {self.sql(e, 'this')}", 555 exp.FromBase64: rename_func("UNBASE64"), 556 exp.GenerateSeries: sequence_sql, 557 exp.GenerateDateArray: sequence_sql, 558 exp.If: if_sql(), 559 exp.ILike: no_ilike_sql, 560 exp.IsNan: rename_func("ISNAN"), 561 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 562 exp.JSONExtractScalar: lambda self, e: self.func( 563 "GET_JSON_OBJECT", e.this, e.expression 564 ), 565 exp.JSONFormat: _json_format_sql, 566 exp.Left: left_to_substring_sql, 567 exp.Map: var_map_sql, 568 exp.Max: max_or_greatest, 569 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 570 exp.Min: min_or_least, 571 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 572 exp.NotNullColumnConstraint: lambda _, e: ( 573 "" if e.args.get("allow_null") else "NOT NULL" 574 ), 575 exp.VarMap: var_map_sql, 576 exp.Create: preprocess( 577 [ 578 remove_unique_constraints, 579 ctas_with_tmp_tables_to_create_tmp_view, 580 move_schema_columns_to_partitioned_by, 581 ] 582 ), 583 exp.Quantile: rename_func("PERCENTILE"), 584 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 585 exp.RegexpExtract: regexp_extract_sql, 586 exp.RegexpExtractAll: regexp_extract_sql, 587 exp.RegexpReplace: regexp_replace_sql, 588 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 589 exp.RegexpSplit: rename_func("SPLIT"), 590 exp.Right: right_to_substring_sql, 591 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 592 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 593 exp.Split: lambda self, e: self.func( 594 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 595 ), 596 exp.Select: transforms.preprocess( 597 [ 598 transforms.eliminate_qualify, 599 transforms.eliminate_distinct_on, 600 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 601 transforms.any_to_exists, 602 ] 603 ), 604 exp.StrPosition: lambda self, e: strposition_sql( 605 self, e, func_name="LOCATE", supports_position=True 606 ), 607 exp.StrToDate: _str_to_date_sql, 608 exp.StrToTime: _str_to_time_sql, 609 exp.StrToUnix: _str_to_unix_sql, 610 exp.StructExtract: struct_extract_sql, 611 exp.StarMap: rename_func("MAP"), 612 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 613 exp.TimeStrToDate: rename_func("TO_DATE"), 614 exp.TimeStrToTime: timestrtotime_sql, 615 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 616 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 617 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 618 exp.ToBase64: rename_func("BASE64"), 619 exp.TsOrDiToDi: lambda self, 620 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 621 exp.TsOrDsAdd: _add_date_sql, 622 exp.TsOrDsDiff: _date_diff_sql, 623 exp.TsOrDsToDate: _to_date_sql, 624 exp.TryCast: no_trycast_sql, 625 exp.Unicode: rename_func("ASCII"), 626 exp.UnixToStr: lambda self, e: self.func( 627 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 628 ), 629 exp.UnixToTime: _unix_to_time_sql, 630 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 631 exp.Unnest: rename_func("EXPLODE"), 632 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 633 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 634 exp.National: lambda self, e: self.national_sql(e, prefix=""), 635 exp.ClusteredColumnConstraint: lambda self, 636 e: f"({self.expressions(e, 'this', indent=False)})", 637 exp.NonClusteredColumnConstraint: lambda self, 638 e: f"({self.expressions(e, 'this', indent=False)})", 639 exp.NotForReplicationColumnConstraint: lambda *_: "", 640 exp.OnProperty: lambda *_: "", 641 exp.PartitionedByBucket: lambda self, e: self.func("BUCKET", e.expression, e.this), 642 exp.PartitionByTruncate: lambda self, e: self.func("TRUNCATE", e.expression, e.this), 643 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 644 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 645 exp.DayOfMonth: rename_func("DAYOFMONTH"), 646 exp.DayOfWeek: rename_func("DAYOFWEEK"), 647 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 648 rename_func("LEVENSHTEIN") 649 ), 650 } 651 652 PROPERTIES_LOCATION = { 653 **generator.Generator.PROPERTIES_LOCATION, 654 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 655 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 656 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 657 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 658 } 659 660 def unnest_sql(self, expression: exp.Unnest) -> str: 661 return rename_func("EXPLODE")(self, expression) 662 663 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 664 if isinstance(expression.this, exp.JSONPathWildcard): 665 self.unsupported("Unsupported wildcard in JSONPathKey expression") 666 return "" 667 668 return super()._jsonpathkey_sql(expression) 669 670 def parameter_sql(self, expression: exp.Parameter) -> str: 671 this = self.sql(expression, "this") 672 expression_sql = self.sql(expression, "expression") 673 674 parent = expression.parent 675 this = f"{this}:{expression_sql}" if expression_sql else this 676 677 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 678 # We need to produce SET key = value instead of SET ${key} = value 679 return this 680 681 return f"${{{this}}}" 682 683 def schema_sql(self, expression: exp.Schema) -> str: 684 for ordered in expression.find_all(exp.Ordered): 685 if ordered.args.get("desc") is False: 686 ordered.set("desc", None) 687 688 return super().schema_sql(expression) 689 690 def constraint_sql(self, expression: exp.Constraint) -> str: 691 for prop in list(expression.find_all(exp.Properties)): 692 prop.pop() 693 694 this = self.sql(expression, "this") 695 expressions = self.expressions(expression, sep=" ", flat=True) 696 return f"CONSTRAINT {this} {expressions}" 697 698 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 699 serde_props = self.sql(expression, "serde_properties") 700 serde_props = f" {serde_props}" if serde_props else "" 701 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 702 703 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 704 return self.func( 705 "COLLECT_LIST", 706 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 707 ) 708 709 def datatype_sql(self, expression: exp.DataType) -> str: 710 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 711 not expression.expressions or expression.expressions[0].name == "MAX" 712 ): 713 expression = exp.DataType.build("text") 714 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 715 expression.set("this", exp.DataType.Type.VARCHAR) 716 elif expression.this in exp.DataType.TEMPORAL_TYPES: 717 expression = exp.DataType.build(expression.this) 718 elif expression.is_type("float"): 719 size_expression = expression.find(exp.DataTypeParam) 720 if size_expression: 721 size = int(size_expression.name) 722 expression = ( 723 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 724 ) 725 726 return super().datatype_sql(expression) 727 728 def version_sql(self, expression: exp.Version) -> str: 729 sql = super().version_sql(expression) 730 return sql.replace("FOR ", "", 1) 731 732 def struct_sql(self, expression: exp.Struct) -> str: 733 values = [] 734 735 for i, e in enumerate(expression.expressions): 736 if isinstance(e, exp.PropertyEQ): 737 self.unsupported("Hive does not support named structs.") 738 values.append(e.expression) 739 else: 740 values.append(e) 741 742 return self.func("STRUCT", *values) 743 744 def alterset_sql(self, expression: exp.AlterSet) -> str: 745 exprs = self.expressions(expression, flat=True) 746 exprs = f" {exprs}" if exprs else "" 747 location = self.sql(expression, "location") 748 location = f" LOCATION {location}" if location else "" 749 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 750 file_format = f" FILEFORMAT {file_format}" if file_format else "" 751 serde = self.sql(expression, "serde") 752 serde = f" SERDE {serde}" if serde else "" 753 tags = self.expressions(expression, key="tag", flat=True, sep="") 754 tags = f" TAGS {tags}" if tags else "" 755 756 return f"SET{serde}{exprs}{location}{file_format}{tags}" 757 758 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 759 prefix = "WITH " if expression.args.get("with") else "" 760 exprs = self.expressions(expression, flat=True) 761 762 return f"{prefix}SERDEPROPERTIES ({exprs})" 763 764 def exists_sql(self, expression: exp.Exists) -> str: 765 if expression.expression: 766 return self.function_fallback_sql(expression) 767 768 return super().exists_sql(expression) 769 770 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 771 this = expression.this 772 if isinstance(this, exp.TimeStrToTime): 773 this = this.this 774 775 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 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.IsNan: rename_func("ISNAN"), 562 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 563 exp.JSONExtractScalar: lambda self, e: self.func( 564 "GET_JSON_OBJECT", e.this, e.expression 565 ), 566 exp.JSONFormat: _json_format_sql, 567 exp.Left: left_to_substring_sql, 568 exp.Map: var_map_sql, 569 exp.Max: max_or_greatest, 570 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 571 exp.Min: min_or_least, 572 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 573 exp.NotNullColumnConstraint: lambda _, e: ( 574 "" if e.args.get("allow_null") else "NOT NULL" 575 ), 576 exp.VarMap: var_map_sql, 577 exp.Create: preprocess( 578 [ 579 remove_unique_constraints, 580 ctas_with_tmp_tables_to_create_tmp_view, 581 move_schema_columns_to_partitioned_by, 582 ] 583 ), 584 exp.Quantile: rename_func("PERCENTILE"), 585 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 586 exp.RegexpExtract: regexp_extract_sql, 587 exp.RegexpExtractAll: regexp_extract_sql, 588 exp.RegexpReplace: regexp_replace_sql, 589 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 590 exp.RegexpSplit: rename_func("SPLIT"), 591 exp.Right: right_to_substring_sql, 592 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 593 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 594 exp.Split: lambda self, e: self.func( 595 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 596 ), 597 exp.Select: transforms.preprocess( 598 [ 599 transforms.eliminate_qualify, 600 transforms.eliminate_distinct_on, 601 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 602 transforms.any_to_exists, 603 ] 604 ), 605 exp.StrPosition: lambda self, e: strposition_sql( 606 self, e, func_name="LOCATE", supports_position=True 607 ), 608 exp.StrToDate: _str_to_date_sql, 609 exp.StrToTime: _str_to_time_sql, 610 exp.StrToUnix: _str_to_unix_sql, 611 exp.StructExtract: struct_extract_sql, 612 exp.StarMap: rename_func("MAP"), 613 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 614 exp.TimeStrToDate: rename_func("TO_DATE"), 615 exp.TimeStrToTime: timestrtotime_sql, 616 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 617 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 618 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 619 exp.ToBase64: rename_func("BASE64"), 620 exp.TsOrDiToDi: lambda self, 621 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 622 exp.TsOrDsAdd: _add_date_sql, 623 exp.TsOrDsDiff: _date_diff_sql, 624 exp.TsOrDsToDate: _to_date_sql, 625 exp.TryCast: no_trycast_sql, 626 exp.Unicode: rename_func("ASCII"), 627 exp.UnixToStr: lambda self, e: self.func( 628 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 629 ), 630 exp.UnixToTime: _unix_to_time_sql, 631 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 632 exp.Unnest: rename_func("EXPLODE"), 633 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 634 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 635 exp.National: lambda self, e: self.national_sql(e, prefix=""), 636 exp.ClusteredColumnConstraint: lambda self, 637 e: f"({self.expressions(e, 'this', indent=False)})", 638 exp.NonClusteredColumnConstraint: lambda self, 639 e: f"({self.expressions(e, 'this', indent=False)})", 640 exp.NotForReplicationColumnConstraint: lambda *_: "", 641 exp.OnProperty: lambda *_: "", 642 exp.PartitionedByBucket: lambda self, e: self.func("BUCKET", e.expression, e.this), 643 exp.PartitionByTruncate: lambda self, e: self.func("TRUNCATE", e.expression, e.this), 644 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 645 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 646 exp.DayOfMonth: rename_func("DAYOFMONTH"), 647 exp.DayOfWeek: rename_func("DAYOFWEEK"), 648 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 649 rename_func("LEVENSHTEIN") 650 ), 651 } 652 653 PROPERTIES_LOCATION = { 654 **generator.Generator.PROPERTIES_LOCATION, 655 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 656 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 657 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 658 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 659 } 660 661 def unnest_sql(self, expression: exp.Unnest) -> str: 662 return rename_func("EXPLODE")(self, expression) 663 664 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 665 if isinstance(expression.this, exp.JSONPathWildcard): 666 self.unsupported("Unsupported wildcard in JSONPathKey expression") 667 return "" 668 669 return super()._jsonpathkey_sql(expression) 670 671 def parameter_sql(self, expression: exp.Parameter) -> str: 672 this = self.sql(expression, "this") 673 expression_sql = self.sql(expression, "expression") 674 675 parent = expression.parent 676 this = f"{this}:{expression_sql}" if expression_sql else this 677 678 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 679 # We need to produce SET key = value instead of SET ${key} = value 680 return this 681 682 return f"${{{this}}}" 683 684 def schema_sql(self, expression: exp.Schema) -> str: 685 for ordered in expression.find_all(exp.Ordered): 686 if ordered.args.get("desc") is False: 687 ordered.set("desc", None) 688 689 return super().schema_sql(expression) 690 691 def constraint_sql(self, expression: exp.Constraint) -> str: 692 for prop in list(expression.find_all(exp.Properties)): 693 prop.pop() 694 695 this = self.sql(expression, "this") 696 expressions = self.expressions(expression, sep=" ", flat=True) 697 return f"CONSTRAINT {this} {expressions}" 698 699 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 700 serde_props = self.sql(expression, "serde_properties") 701 serde_props = f" {serde_props}" if serde_props else "" 702 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 703 704 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 705 return self.func( 706 "COLLECT_LIST", 707 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 708 ) 709 710 def datatype_sql(self, expression: exp.DataType) -> str: 711 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 712 not expression.expressions or expression.expressions[0].name == "MAX" 713 ): 714 expression = exp.DataType.build("text") 715 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 716 expression.set("this", exp.DataType.Type.VARCHAR) 717 elif expression.this in exp.DataType.TEMPORAL_TYPES: 718 expression = exp.DataType.build(expression.this) 719 elif expression.is_type("float"): 720 size_expression = expression.find(exp.DataTypeParam) 721 if size_expression: 722 size = int(size_expression.name) 723 expression = ( 724 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 725 ) 726 727 return super().datatype_sql(expression) 728 729 def version_sql(self, expression: exp.Version) -> str: 730 sql = super().version_sql(expression) 731 return sql.replace("FOR ", "", 1) 732 733 def struct_sql(self, expression: exp.Struct) -> str: 734 values = [] 735 736 for i, e in enumerate(expression.expressions): 737 if isinstance(e, exp.PropertyEQ): 738 self.unsupported("Hive does not support named structs.") 739 values.append(e.expression) 740 else: 741 values.append(e) 742 743 return self.func("STRUCT", *values) 744 745 def alterset_sql(self, expression: exp.AlterSet) -> str: 746 exprs = self.expressions(expression, flat=True) 747 exprs = f" {exprs}" if exprs else "" 748 location = self.sql(expression, "location") 749 location = f" LOCATION {location}" if location else "" 750 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 751 file_format = f" FILEFORMAT {file_format}" if file_format else "" 752 serde = self.sql(expression, "serde") 753 serde = f" SERDE {serde}" if serde else "" 754 tags = self.expressions(expression, key="tag", flat=True, sep="") 755 tags = f" TAGS {tags}" if tags else "" 756 757 return f"SET{serde}{exprs}{location}{file_format}{tags}" 758 759 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 760 prefix = "WITH " if expression.args.get("with") else "" 761 exprs = self.expressions(expression, flat=True) 762 763 return f"{prefix}SERDEPROPERTIES ({exprs})" 764 765 def exists_sql(self, expression: exp.Exists) -> str: 766 if expression.expression: 767 return self.function_fallback_sql(expression) 768 769 return super().exists_sql(expression) 770 771 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 772 this = expression.this 773 if isinstance(this, exp.TimeStrToTime): 774 this = this.this 775 776 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.ArraySize'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Length'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Boolean'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Between'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.In'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DiToDate'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Date'>: <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.TimeStrToDate'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TsOrDsToDate'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DateFromParts'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.StrToDate'>: <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.DatetimeSub'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentDatetime'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Avg'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Stddev'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Log'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Ln'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.StddevSamp'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.StddevPop'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.SafeDivide'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Variance'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Sqrt'>: <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.VariancePop'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Quantile'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Exp'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Round'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.StrPosition'>: <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.TsOrDiToDi'>: <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.TimestampDiff'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DatetimeDiff'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Sign'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Ceil'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ParseJSON'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentTime'>: <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.TimeSub'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimestampAdd'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeStrToTime'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixToTime'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimestampSub'>: <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.Day'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Week'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Quarter'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Year'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Month'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeToStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Upper'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Trim'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ArrayConcat'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.ConcatWs'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Initcap'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DateToDateStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Substring'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Concat'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TsOrDsToDateStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixToStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixToTimeStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Lower'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.GroupConcat'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.String'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeToTimeStr'>: <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.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.FLOAT: 'FLOAT'>: {<Type.NCHAR: 'NCHAR'>, <Type.DOUBLE: 'DOUBLE'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.DECIMAL: 'DECIMAL'>: {<Type.NCHAR: 'NCHAR'>, <Type.DOUBLE: 'DOUBLE'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.CHAR: 'CHAR'>, <Type.FLOAT: 'FLOAT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>}, <Type.BIGINT: 'BIGINT'>: {<Type.NCHAR: 'NCHAR'>, <Type.DOUBLE: 'DOUBLE'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.DECIMAL: 'DECIMAL'>, <Type.CHAR: 'CHAR'>, <Type.FLOAT: 'FLOAT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>}, <Type.INT: 'INT'>: {<Type.NCHAR: 'NCHAR'>, <Type.DOUBLE: 'DOUBLE'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.DECIMAL: 'DECIMAL'>, <Type.CHAR: 'CHAR'>, <Type.FLOAT: 'FLOAT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.BIGINT: 'BIGINT'>}, <Type.SMALLINT: 'SMALLINT'>: {<Type.NCHAR: 'NCHAR'>, <Type.DOUBLE: 'DOUBLE'>, <Type.TEXT: 'TEXT'>, <Type.INT: 'INT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.DECIMAL: 'DECIMAL'>, <Type.CHAR: 'CHAR'>, <Type.FLOAT: 'FLOAT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.BIGINT: 'BIGINT'>}, <Type.TINYINT: 'TINYINT'>: {<Type.NCHAR: 'NCHAR'>, <Type.SMALLINT: 'SMALLINT'>, <Type.DOUBLE: 'DOUBLE'>, <Type.TEXT: 'TEXT'>, <Type.INT: 'INT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.DECIMAL: 'DECIMAL'>, <Type.CHAR: 'CHAR'>, <Type.FLOAT: 'FLOAT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.BIGINT: 'BIGINT'>}, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>}, <Type.TIMESTAMP: 'TIMESTAMP'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>}, <Type.DATETIME: 'DATETIME'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.TIMESTAMP: 'TIMESTAMP'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>}, <Type.DATE: 'DATE'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NAME: 'NAME'>, <Type.DATETIME: 'DATETIME'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.TIMESTAMP: 'TIMESTAMP'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>}, <Type.NULL: 'NULL'>: {<Type.NCHAR: 'NCHAR'>, <Type.SMALLINT: 'SMALLINT'>, <Type.DOUBLE: 'DOUBLE'>, <Type.TEXT: 'TEXT'>, <Type.INT: 'INT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.DATETIME: 'DATETIME'>, <Type.BIGINT: 'BIGINT'>, <Type.DECIMAL: 'DECIMAL'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.FLOAT: 'FLOAT'>, <Type.TINYINT: 'TINYINT'>, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <Type.TIMESTAMP: 'TIMESTAMP'>, <Type.DATE: 'DATE'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>}, <Type.UINT: 'UINT'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.DECIMAL256: 'DECIMAL256'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.UTINYINT: 'UTINYINT'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.SMALLDATETIME: 'SMALLDATETIME'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.INT256: 'INT256'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.UBIGINT: 'UBIGINT'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.MONEY: 'MONEY'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.MEDIUMINT: 'MEDIUMINT'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.INT128: 'INT128'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.TIME: 'TIME'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.UINT128: 'UINT128'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.DATETIME64: 'DATETIME64'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.BIT: 'BIT'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.DECIMAL128: 'DECIMAL128'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.DECIMAL64: 'DECIMAL64'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.DATE32: 'DATE32'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.BIGDECIMAL: 'BIGDECIMAL'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.TIMETZ: 'TIMETZ'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.UDOUBLE: 'UDOUBLE'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.TIMESTAMP_MS: 'TIMESTAMP_MS'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.TIMESTAMP_NS: 'TIMESTAMP_NS'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.INTERVAL: 'INTERVAL'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.SMALLMONEY: 'SMALLMONEY'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.UDECIMAL: 'UDECIMAL'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.DATETIME2: 'DATETIME2'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.UMEDIUMINT: 'UMEDIUMINT'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.USMALLINT: 'USMALLINT'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.UINT256: 'UINT256'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.DECIMAL32: 'DECIMAL32'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.TIMESTAMP_S: 'TIMESTAMP_S'>: {<Type.NCHAR: 'NCHAR'>, <Type.TEXT: 'TEXT'>, <Type.CHAR: 'CHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.NAME: 'NAME'>, <Type.VARCHAR: 'VARCHAR'>}})
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.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 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)
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_OVERLAPS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayOverlaps'>>, 'ARRAY_SIZE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySize'>>, 'ARRAY_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySize'>>, 'ARRAY_SORT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySort'>>, 'ARRAY_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySum'>>, 'ARRAY_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayToString'>>, 'ARRAY_JOIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayToString'>>, 'ARRAY_UNION_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayUnionAgg'>>, 'ARRAY_UNIQUE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayUniqueAgg'>>, 'AVG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Avg'>>, 'CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Case'>>, 'CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cast'>>, 'CAST_TO_STR_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CastToStrType'>>, 'CBRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cbrt'>>, 'CEIL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ceil'>>, 'CEILING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ceil'>>, 'CHR': <function Parser.<lambda>>, 'CHAR': <function Parser.<lambda>>, 'COALESCE': <function build_coalesce>, 'IFNULL': <function build_coalesce>, 'NVL': <function build_coalesce>, 'COLLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Collate'>>, 'COLUMNS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Columns'>>, 'COMBINED_AGG_FUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CombinedAggFunc'>>, 'COMBINED_PARAMETERIZED_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CombinedParameterizedAgg'>>, 'CONCAT': <function Parser.<lambda>>, 'CONCAT_WS': <function Parser.<lambda>>, 'CONNECT_BY_ROOT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ConnectByRoot'>>, 'CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Contains'>>, 'CONVERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Convert'>>, 'CONVERT_TIMEZONE': <function build_convert_timezone>, '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_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'>>, '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'>>, 'RIGHT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Right'>>, 'ROUND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Round'>>, 'ROW_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RowNumber'>>, 'SHA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA2'>>, 'SAFE_DIVIDE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeDivide'>>, 'SIGN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SIGNUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SORT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SortArray'>>, 'SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpSplit'>>, 'SPLIT_PART': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SplitPart'>>, 'SQRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sqrt'>>, 'STANDARD_HASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StandardHash'>>, 'STAR_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StarMap'>>, 'STARTS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STARTSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STDDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDDEV_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevPop'>>, 'STDDEV_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevSamp'>>, 'STR_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrPosition'>>, 'STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToDate'>>, 'STR_TO_MAP': <function Hive.Parser.<lambda>>, 'STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToTime'>>, 'STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToUnix'>>, 'STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.String'>>, 'STRING_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'SPLIT_BY_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'STRUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Struct'>>, 'STRUCT_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StructExtract'>>, 'STUFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'SUBSTRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Substring'>>, 'SUBSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Substring'>>, 'SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sum'>>, 'TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Time'>>, 'TIME_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeAdd'>>, 'TIME_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeDiff'>>, 'TIME_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'TIMEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeFromParts'>>, 'TIME_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToDate'>>, 'TIME_STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToTime'>>, 'TIME_STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeStrToUnix'>>, 'TIME_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeSub'>>, 'TIME_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeToStr'>>, 'TIME_TO_TIME_STR': <function Parser.<lambda>>, 'TIME_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeToUnix'>>, 'TIME_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimeTrunc'>>, 'TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Timestamp'>>, 'TIMESTAMP_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampAdd'>>, 'TIMESTAMPDIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampDiff'>>, 'TIMESTAMP_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampDiff'>>, 'TIMESTAMP_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampFromParts'>>, 'TIMESTAMPFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampFromParts'>>, 'TIMESTAMP_SUB': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampSub'>>, 'TIMESTAMP_TRUNC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TimestampTrunc'>>, 'TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToArray'>>, 'TO_BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToBase64'>>, 'TO_CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToChar'>>, 'TO_DAYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToDays'>>, 'TO_DOUBLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToDouble'>>, 'TO_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToMap'>>, 'TO_NUMBER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToNumber'>>, 'TRANSFORM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Transform'>>, 'TRIM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Trim'>>, 'TRY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Try'>>, 'TRY_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryCast'>>, 'TS_OR_DI_TO_DI': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDiToDi'>>, 'TS_OR_DS_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsAdd'>>, 'TS_OR_DS_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsDiff'>>, 'TS_OR_DS_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToDate'>>, 'TS_OR_DS_TO_DATE_STR': <function Parser.<lambda>>, 'TS_OR_DS_TO_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToDatetime'>>, 'TS_OR_DS_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToTime'>>, 'TS_OR_DS_TO_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TsOrDsToTimestamp'>>, 'UNHEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Unhex'>>, 'UNICODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Unicode'>>, 'UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixDate'>>, 'UNIX_SECONDS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixSeconds'>>, 'UNIX_TO_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToStr'>>, 'UNIX_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToTime'>>, 'UNIX_TO_TIME_STR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixToTimeStr'>>, 'UNNEST': <function Parser.<lambda>>, 'UPPER': <function build_upper>, 'UCASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Upper'>>, 'UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'GEN_RANDOM_UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'GENERATE_UUID': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'UUID_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Uuid'>>, 'VAR_MAP': <function build_var_map>, 'VARIANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VARIANCE_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VAR_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Variance'>>, 'VARIANCE_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VariancePop'>>, 'VAR_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VariancePop'>>, 'WEEK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Week'>>, 'WEEK_OF_YEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.WeekOfYear'>>, 'WEEKOFYEAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.WeekOfYear'>>, 'XMLELEMENT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.XMLElement'>>, 'X_M_L_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.XMLTable'>>, 'XOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Xor'>>, 'YEAR': <function Hive.Parser.<lambda>>, 'ARRAYAGG': <function Parser.<lambda>>, 'GLOB': <function Parser.<lambda>>, '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.SETTINGS: 'SETTINGS'>, <TokenType.UINT: 'UINT'>, <TokenType.VIEW: 'VIEW'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.END: 'END'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.JSONB: 'JSONB'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.SUPER: 'SUPER'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.INT256: 'INT256'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.ANTI: 'ANTI'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.INT128: 'INT128'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.KILL: 'KILL'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.GET: 'GET'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.ASC: 'ASC'>, <TokenType.TAG: 'TAG'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.FALSE: 'FALSE'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.INT: 'INT'>, <TokenType.SINK: 'SINK'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.DIV: 'DIV'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.ASOF: 'ASOF'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.ROW: 'ROW'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.ALL: 'ALL'>, <TokenType.NEXT: 'NEXT'>, <TokenType.SEMI: 'SEMI'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.VOID: 'VOID'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.BLOB: 'BLOB'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.SET: 'SET'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.CHAR: 'CHAR'>, <TokenType.TOP: 'TOP'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.STAGE: 'STAGE'>, <TokenType.NATURAL: 'NATURAL'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.FILTER: 'FILTER'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.IPV4: 'IPV4'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.DELETE: 'DELETE'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.IPV6: 'IPV6'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.MERGE: 'MERGE'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.LIST: 'LIST'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.RENAME: 'RENAME'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.UUID: 'UUID'>, <TokenType.LOAD: 'LOAD'>, <TokenType.RANGE: 'RANGE'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.ANY: 'ANY'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.UINT256: 'UINT256'>, <TokenType.YEAR: 'YEAR'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.INDEX: 'INDEX'>, <TokenType.MAP: 'MAP'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.ROWS: 'ROWS'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.CUBE: 'CUBE'>, <TokenType.DESC: 'DESC'>, <TokenType.LEFT: 'LEFT'>, <TokenType.SHOW: 'SHOW'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.FIRST: 'FIRST'>, <TokenType.IS: 'IS'>, <TokenType.MONEY: 'MONEY'>, <TokenType.ENUM: 'ENUM'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.NESTED: 'NESTED'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.BIT: 'BIT'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.VAR: 'VAR'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.DATE32: 'DATE32'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.RING: 'RING'>, <TokenType.TEXT: 'TEXT'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.BINARY: 'BINARY'>, <TokenType.TABLE: 'TABLE'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.NAME: 'NAME'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.XML: 'XML'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.FILE_FORMAT: 'FILE_FORMAT'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.INET: 'INET'>, <TokenType.NULL: 'NULL'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.USE: 'USE'>, <TokenType.DATE: 'DATE'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.SOME: 'SOME'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.TRUE: 'TRUE'>, <TokenType.FULL: 'FULL'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.POINT: 'POINT'>, <TokenType.FINAL: 'FINAL'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.TIME: 'TIME'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.UINT128: 'UINT128'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.PUT: 'PUT'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.CASE: 'CASE'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.JSON: 'JSON'>, <TokenType.MODEL: 'MODEL'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.DETACH: 'DETACH'>, <TokenType.KEEP: 'KEEP'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.APPLY: 'APPLY'>, <TokenType.COPY: 'COPY'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.CACHE: 'CACHE'>, <TokenType.SCHEMA: 'SCHEMA'>}
TABLE_ALIAS_TOKENS =
{<TokenType.SETTINGS: 'SETTINGS'>, <TokenType.UINT: 'UINT'>, <TokenType.VIEW: 'VIEW'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.END: 'END'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.JSONB: 'JSONB'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.SUPER: 'SUPER'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.INT256: 'INT256'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.INT128: 'INT128'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.KILL: 'KILL'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.GET: 'GET'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.ASC: 'ASC'>, <TokenType.TAG: 'TAG'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.FALSE: 'FALSE'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.INT: 'INT'>, <TokenType.SINK: 'SINK'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.DIV: 'DIV'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.ROW: 'ROW'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.ALL: 'ALL'>, <TokenType.NEXT: 'NEXT'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.VOID: 'VOID'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.BLOB: 'BLOB'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.SET: 'SET'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.CHAR: 'CHAR'>, <TokenType.TOP: 'TOP'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.STAGE: 'STAGE'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.FILTER: 'FILTER'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.IPV4: 'IPV4'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.DELETE: 'DELETE'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.IPV6: 'IPV6'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.MERGE: 'MERGE'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.LIST: 'LIST'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.RENAME: 'RENAME'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.UUID: 'UUID'>, <TokenType.LOAD: 'LOAD'>, <TokenType.RANGE: 'RANGE'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.ANY: 'ANY'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.UINT256: 'UINT256'>, <TokenType.YEAR: 'YEAR'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.INDEX: 'INDEX'>, <TokenType.MAP: 'MAP'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.ROWS: 'ROWS'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.CUBE: 'CUBE'>, <TokenType.DESC: 'DESC'>, <TokenType.SHOW: 'SHOW'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.FIRST: 'FIRST'>, <TokenType.IS: 'IS'>, <TokenType.MONEY: 'MONEY'>, <TokenType.ENUM: 'ENUM'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.NESTED: 'NESTED'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.BIT: 'BIT'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.VAR: 'VAR'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.DATE32: 'DATE32'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.RING: 'RING'>, <TokenType.TEXT: 'TEXT'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.BINARY: 'BINARY'>, <TokenType.TABLE: 'TABLE'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.NAME: 'NAME'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.XML: 'XML'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.FILE_FORMAT: 'FILE_FORMAT'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.INET: 'INET'>, <TokenType.NULL: 'NULL'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.USE: 'USE'>, <TokenType.DATE: 'DATE'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.SOME: 'SOME'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.TRUE: 'TRUE'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.POINT: 'POINT'>, <TokenType.FINAL: 'FINAL'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.TIME: 'TIME'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.UINT128: 'UINT128'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.PUT: 'PUT'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.CASE: 'CASE'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.JSON: 'JSON'>, <TokenType.MODEL: 'MODEL'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.DETACH: 'DETACH'>, <TokenType.KEEP: 'KEEP'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.COPY: 'COPY'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.CACHE: 'CACHE'>, <TokenType.SCHEMA: 'SCHEMA'>}
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
- 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
- ALTER_TABLE_ADD_REQUIRED_FOR_EACH_COLUMN
- TABLESAMPLE_CSV
- DEFAULT_SAMPLING_METHOD
- SET_REQUIRES_ASSIGNMENT_DELIMITER
- TRIM_PATTERN_FIRST
- STRING_ALIASES
- MODIFIERS_ATTACHED_TO_SET_OP
- SET_OP_MODIFIERS
- NO_PAREN_IF_COMMANDS
- JSON_ARROWS_REQUIRE_JSON_TYPE
- COLON_IS_VARIANT_EXTRACT
- SUPPORTS_IMPLICIT_UNNEST
- INTERVAL_SPANS
- SUPPORTS_PARTITION_SELECTION
- WRAPPED_TRANSFORM_COLUMN_CONSTRAINT
- OPTIONAL_ALIAS_TOKEN_CTE
- error_level
- error_message_context
- max_errors
- dialect
- reset
- parse
- parse_into
- check_errors
- raise_error
- expression
- validate_expression
- parse_set_operation
- errors
- sql
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.IsNan: rename_func("ISNAN"), 562 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 563 exp.JSONExtractScalar: lambda self, e: self.func( 564 "GET_JSON_OBJECT", e.this, e.expression 565 ), 566 exp.JSONFormat: _json_format_sql, 567 exp.Left: left_to_substring_sql, 568 exp.Map: var_map_sql, 569 exp.Max: max_or_greatest, 570 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 571 exp.Min: min_or_least, 572 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 573 exp.NotNullColumnConstraint: lambda _, e: ( 574 "" if e.args.get("allow_null") else "NOT NULL" 575 ), 576 exp.VarMap: var_map_sql, 577 exp.Create: preprocess( 578 [ 579 remove_unique_constraints, 580 ctas_with_tmp_tables_to_create_tmp_view, 581 move_schema_columns_to_partitioned_by, 582 ] 583 ), 584 exp.Quantile: rename_func("PERCENTILE"), 585 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 586 exp.RegexpExtract: regexp_extract_sql, 587 exp.RegexpExtractAll: regexp_extract_sql, 588 exp.RegexpReplace: regexp_replace_sql, 589 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 590 exp.RegexpSplit: rename_func("SPLIT"), 591 exp.Right: right_to_substring_sql, 592 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 593 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 594 exp.Split: lambda self, e: self.func( 595 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 596 ), 597 exp.Select: transforms.preprocess( 598 [ 599 transforms.eliminate_qualify, 600 transforms.eliminate_distinct_on, 601 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 602 transforms.any_to_exists, 603 ] 604 ), 605 exp.StrPosition: lambda self, e: strposition_sql( 606 self, e, func_name="LOCATE", supports_position=True 607 ), 608 exp.StrToDate: _str_to_date_sql, 609 exp.StrToTime: _str_to_time_sql, 610 exp.StrToUnix: _str_to_unix_sql, 611 exp.StructExtract: struct_extract_sql, 612 exp.StarMap: rename_func("MAP"), 613 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 614 exp.TimeStrToDate: rename_func("TO_DATE"), 615 exp.TimeStrToTime: timestrtotime_sql, 616 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 617 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 618 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 619 exp.ToBase64: rename_func("BASE64"), 620 exp.TsOrDiToDi: lambda self, 621 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 622 exp.TsOrDsAdd: _add_date_sql, 623 exp.TsOrDsDiff: _date_diff_sql, 624 exp.TsOrDsToDate: _to_date_sql, 625 exp.TryCast: no_trycast_sql, 626 exp.Unicode: rename_func("ASCII"), 627 exp.UnixToStr: lambda self, e: self.func( 628 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 629 ), 630 exp.UnixToTime: _unix_to_time_sql, 631 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 632 exp.Unnest: rename_func("EXPLODE"), 633 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 634 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 635 exp.National: lambda self, e: self.national_sql(e, prefix=""), 636 exp.ClusteredColumnConstraint: lambda self, 637 e: f"({self.expressions(e, 'this', indent=False)})", 638 exp.NonClusteredColumnConstraint: lambda self, 639 e: f"({self.expressions(e, 'this', indent=False)})", 640 exp.NotForReplicationColumnConstraint: lambda *_: "", 641 exp.OnProperty: lambda *_: "", 642 exp.PartitionedByBucket: lambda self, e: self.func("BUCKET", e.expression, e.this), 643 exp.PartitionByTruncate: lambda self, e: self.func("TRUNCATE", e.expression, e.this), 644 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 645 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 646 exp.DayOfMonth: rename_func("DAYOFMONTH"), 647 exp.DayOfWeek: rename_func("DAYOFWEEK"), 648 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 649 rename_func("LEVENSHTEIN") 650 ), 651 } 652 653 PROPERTIES_LOCATION = { 654 **generator.Generator.PROPERTIES_LOCATION, 655 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 656 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 657 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 658 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 659 } 660 661 def unnest_sql(self, expression: exp.Unnest) -> str: 662 return rename_func("EXPLODE")(self, expression) 663 664 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 665 if isinstance(expression.this, exp.JSONPathWildcard): 666 self.unsupported("Unsupported wildcard in JSONPathKey expression") 667 return "" 668 669 return super()._jsonpathkey_sql(expression) 670 671 def parameter_sql(self, expression: exp.Parameter) -> str: 672 this = self.sql(expression, "this") 673 expression_sql = self.sql(expression, "expression") 674 675 parent = expression.parent 676 this = f"{this}:{expression_sql}" if expression_sql else this 677 678 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 679 # We need to produce SET key = value instead of SET ${key} = value 680 return this 681 682 return f"${{{this}}}" 683 684 def schema_sql(self, expression: exp.Schema) -> str: 685 for ordered in expression.find_all(exp.Ordered): 686 if ordered.args.get("desc") is False: 687 ordered.set("desc", None) 688 689 return super().schema_sql(expression) 690 691 def constraint_sql(self, expression: exp.Constraint) -> str: 692 for prop in list(expression.find_all(exp.Properties)): 693 prop.pop() 694 695 this = self.sql(expression, "this") 696 expressions = self.expressions(expression, sep=" ", flat=True) 697 return f"CONSTRAINT {this} {expressions}" 698 699 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 700 serde_props = self.sql(expression, "serde_properties") 701 serde_props = f" {serde_props}" if serde_props else "" 702 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 703 704 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 705 return self.func( 706 "COLLECT_LIST", 707 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 708 ) 709 710 def datatype_sql(self, expression: exp.DataType) -> str: 711 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 712 not expression.expressions or expression.expressions[0].name == "MAX" 713 ): 714 expression = exp.DataType.build("text") 715 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 716 expression.set("this", exp.DataType.Type.VARCHAR) 717 elif expression.this in exp.DataType.TEMPORAL_TYPES: 718 expression = exp.DataType.build(expression.this) 719 elif expression.is_type("float"): 720 size_expression = expression.find(exp.DataTypeParam) 721 if size_expression: 722 size = int(size_expression.name) 723 expression = ( 724 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 725 ) 726 727 return super().datatype_sql(expression) 728 729 def version_sql(self, expression: exp.Version) -> str: 730 sql = super().version_sql(expression) 731 return sql.replace("FOR ", "", 1) 732 733 def struct_sql(self, expression: exp.Struct) -> str: 734 values = [] 735 736 for i, e in enumerate(expression.expressions): 737 if isinstance(e, exp.PropertyEQ): 738 self.unsupported("Hive does not support named structs.") 739 values.append(e.expression) 740 else: 741 values.append(e) 742 743 return self.func("STRUCT", *values) 744 745 def alterset_sql(self, expression: exp.AlterSet) -> str: 746 exprs = self.expressions(expression, flat=True) 747 exprs = f" {exprs}" if exprs else "" 748 location = self.sql(expression, "location") 749 location = f" LOCATION {location}" if location else "" 750 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 751 file_format = f" FILEFORMAT {file_format}" if file_format else "" 752 serde = self.sql(expression, "serde") 753 serde = f" SERDE {serde}" if serde else "" 754 tags = self.expressions(expression, key="tag", flat=True, sep="") 755 tags = f" TAGS {tags}" if tags else "" 756 757 return f"SET{serde}{exprs}{location}{file_format}{tags}" 758 759 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 760 prefix = "WITH " if expression.args.get("with") else "" 761 exprs = self.expressions(expression, flat=True) 762 763 return f"{prefix}SERDEPROPERTIES ({exprs})" 764 765 def exists_sql(self, expression: exp.Exists) -> str: 766 if expression.expression: 767 return self.function_fallback_sql(expression) 768 769 return super().exists_sql(expression) 770 771 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 772 this = expression.this 773 if isinstance(this, exp.TimeStrToTime): 774 this = this.this 775 776 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.Subquery'>, <class 'sqlglot.expressions.Select'>, <class 'sqlglot.expressions.Insert'>, <class 'sqlglot.expressions.SetOperation'>}
SUPPORTED_JSON_PATH_PARTS =
{<class 'sqlglot.expressions.JSONPathSubscript'>, <class 'sqlglot.expressions.JSONPathWildcard'>, <class 'sqlglot.expressions.JSONPathKey'>, <class 'sqlglot.expressions.JSONPathRoot'>}
TYPE_MAPPING =
{<Type.DATETIME2: 'DATETIME2'>: 'TIMESTAMP', <Type.NCHAR: 'NCHAR'>: 'CHAR', <Type.NVARCHAR: 'NVARCHAR'>: 'VARCHAR', <Type.MEDIUMTEXT: 'MEDIUMTEXT'>: 'TEXT', <Type.LONGTEXT: 'LONGTEXT'>: 'TEXT', <Type.TINYTEXT: 'TINYTEXT'>: 'TEXT', <Type.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.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.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'>}
671 def parameter_sql(self, expression: exp.Parameter) -> str: 672 this = self.sql(expression, "this") 673 expression_sql = self.sql(expression, "expression") 674 675 parent = expression.parent 676 this = f"{this}:{expression_sql}" if expression_sql else this 677 678 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 679 # We need to produce SET key = value instead of SET ${key} = value 680 return this 681 682 return f"${{{this}}}"
def
rowformatserdeproperty_sql(self, expression: sqlglot.expressions.RowFormatSerdeProperty) -> str:
710 def datatype_sql(self, expression: exp.DataType) -> str: 711 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 712 not expression.expressions or expression.expressions[0].name == "MAX" 713 ): 714 expression = exp.DataType.build("text") 715 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 716 expression.set("this", exp.DataType.Type.VARCHAR) 717 elif expression.this in exp.DataType.TEMPORAL_TYPES: 718 expression = exp.DataType.build(expression.this) 719 elif expression.is_type("float"): 720 size_expression = expression.find(exp.DataTypeParam) 721 if size_expression: 722 size = int(size_expression.name) 723 expression = ( 724 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 725 ) 726 727 return super().datatype_sql(expression)
733 def struct_sql(self, expression: exp.Struct) -> str: 734 values = [] 735 736 for i, e in enumerate(expression.expressions): 737 if isinstance(e, exp.PropertyEQ): 738 self.unsupported("Hive does not support named structs.") 739 values.append(e.expression) 740 else: 741 values.append(e) 742 743 return self.func("STRUCT", *values)
745 def alterset_sql(self, expression: exp.AlterSet) -> str: 746 exprs = self.expressions(expression, flat=True) 747 exprs = f" {exprs}" if exprs else "" 748 location = self.sql(expression, "location") 749 location = f" LOCATION {location}" if location else "" 750 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 751 file_format = f" FILEFORMAT {file_format}" if file_format else "" 752 serde = self.sql(expression, "serde") 753 serde = f" SERDE {serde}" if serde else "" 754 tags = self.expressions(expression, key="tag", flat=True, sep="") 755 tags = f" TAGS {tags}" if tags else "" 756 757 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_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
- pad_comment
- maybe_comment
- wrap
- no_identify
- normalize_func
- indent
- sql
- uncache_sql
- cache_sql
- characterset_sql
- column_parts
- column_sql
- columnposition_sql
- columndef_sql
- columnconstraint_sql
- computedcolumnconstraint_sql
- autoincrementcolumnconstraint_sql
- compresscolumnconstraint_sql
- generatedasidentitycolumnconstraint_sql
- generatedasrowcolumnconstraint_sql
- periodforsystemtimeconstraint_sql
- notnullcolumnconstraint_sql
- transformcolumnconstraint_sql
- primarykeycolumnconstraint_sql
- uniquecolumnconstraint_sql
- createable_sql
- create_sql
- sequenceproperties_sql
- clone_sql
- describe_sql
- heredoc_sql
- prepend_ctes
- with_sql
- cte_sql
- tablealias_sql
- bitstring_sql
- hexstring_sql
- bytestring_sql
- unicodestring_sql
- rawstring_sql
- datatypeparam_sql
- directory_sql
- delete_sql
- drop_sql
- set_operation
- set_operations
- fetch_sql
- 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
- 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
- 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
- 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