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 68 69def _add_date_sql(self: Hive.Generator, expression: DATE_ADD_OR_SUB) -> str: 70 if isinstance(expression, exp.TsOrDsAdd) and not expression.unit: 71 return self.func("DATE_ADD", expression.this, expression.expression) 72 73 unit = expression.text("unit").upper() 74 func, multiplier = DATE_DELTA_INTERVAL.get(unit, ("DATE_ADD", 1)) 75 76 if isinstance(expression, exp.DateSub): 77 multiplier *= -1 78 79 increment = expression.expression 80 if isinstance(increment, exp.Literal): 81 value = increment.to_py() if increment.is_number else int(increment.name) 82 increment = exp.Literal.number(value * multiplier) 83 elif multiplier != 1: 84 increment *= exp.Literal.number(multiplier) 85 86 return self.func(func, expression.this, increment) 87 88 89def _date_diff_sql(self: Hive.Generator, expression: exp.DateDiff | exp.TsOrDsDiff) -> str: 90 unit = expression.text("unit").upper() 91 92 factor = TIME_DIFF_FACTOR.get(unit) 93 if factor is not None: 94 left = self.sql(expression, "this") 95 right = self.sql(expression, "expression") 96 sec_diff = f"UNIX_TIMESTAMP({left}) - UNIX_TIMESTAMP({right})" 97 return f"({sec_diff}){factor}" if factor else sec_diff 98 99 months_between = unit in DIFF_MONTH_SWITCH 100 sql_func = "MONTHS_BETWEEN" if months_between else "DATEDIFF" 101 _, multiplier = DATE_DELTA_INTERVAL.get(unit, ("", 1)) 102 multiplier_sql = f" / {multiplier}" if multiplier > 1 else "" 103 diff_sql = f"{sql_func}({self.format_args(expression.this, expression.expression)})" 104 105 if months_between or multiplier_sql: 106 # MONTHS_BETWEEN returns a float, so we need to truncate the fractional part. 107 # For the same reason, we want to truncate if there's a divisor present. 108 diff_sql = f"CAST({diff_sql}{multiplier_sql} AS INT)" 109 110 return diff_sql 111 112 113def _json_format_sql(self: Hive.Generator, expression: exp.JSONFormat) -> str: 114 this = expression.this 115 116 if is_parse_json(this): 117 if this.this.is_string: 118 # Since FROM_JSON requires a nested type, we always wrap the json string with 119 # an array to ensure that "naked" strings like "'a'" will be handled correctly 120 wrapped_json = exp.Literal.string(f"[{this.this.name}]") 121 122 from_json = self.func( 123 "FROM_JSON", wrapped_json, self.func("SCHEMA_OF_JSON", wrapped_json) 124 ) 125 to_json = self.func("TO_JSON", from_json) 126 127 # This strips the [, ] delimiters of the dummy array printed by TO_JSON 128 return self.func("REGEXP_EXTRACT", to_json, "'^.(.*).$'", "1") 129 return self.sql(this) 130 131 return self.func("TO_JSON", this, expression.args.get("options")) 132 133 134@generator.unsupported_args(("expression", "Hive's SORT_ARRAY does not support a comparator.")) 135def _array_sort_sql(self: Hive.Generator, expression: exp.ArraySort) -> str: 136 return self.func("SORT_ARRAY", expression.this) 137 138 139def _str_to_unix_sql(self: Hive.Generator, expression: exp.StrToUnix) -> str: 140 return self.func("UNIX_TIMESTAMP", expression.this, time_format("hive")(self, expression)) 141 142 143def _unix_to_time_sql(self: Hive.Generator, expression: exp.UnixToTime) -> str: 144 timestamp = self.sql(expression, "this") 145 scale = expression.args.get("scale") 146 if scale in (None, exp.UnixToTime.SECONDS): 147 return rename_func("FROM_UNIXTIME")(self, expression) 148 149 return f"FROM_UNIXTIME({timestamp} / POW(10, {scale}))" 150 151 152def _str_to_date_sql(self: Hive.Generator, expression: exp.StrToDate) -> str: 153 this = self.sql(expression, "this") 154 time_format = self.format_time(expression) 155 if time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 156 this = f"FROM_UNIXTIME(UNIX_TIMESTAMP({this}, {time_format}))" 157 return f"CAST({this} AS DATE)" 158 159 160def _str_to_time_sql(self: Hive.Generator, expression: exp.StrToTime) -> str: 161 this = self.sql(expression, "this") 162 time_format = self.format_time(expression) 163 if time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 164 this = f"FROM_UNIXTIME(UNIX_TIMESTAMP({this}, {time_format}))" 165 return f"CAST({this} AS TIMESTAMP)" 166 167 168def _to_date_sql(self: Hive.Generator, expression: exp.TsOrDsToDate) -> str: 169 time_format = self.format_time(expression) 170 if time_format and time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 171 return self.func("TO_DATE", expression.this, time_format) 172 173 if isinstance(expression.parent, self.TS_OR_DS_EXPRESSIONS): 174 return self.sql(expression, "this") 175 176 return self.func("TO_DATE", expression.this) 177 178 179def _build_with_ignore_nulls( 180 exp_class: t.Type[exp.Expression], 181) -> t.Callable[[t.List[exp.Expression]], exp.Expression]: 182 def _parse(args: t.List[exp.Expression]) -> exp.Expression: 183 this = exp_class(this=seq_get(args, 0)) 184 if seq_get(args, 1) == exp.true(): 185 return exp.IgnoreNulls(this=this) 186 return this 187 188 return _parse 189 190 191def _build_to_date(args: t.List) -> exp.TsOrDsToDate: 192 expr = build_formatted_time(exp.TsOrDsToDate, "hive")(args) 193 expr.set("safe", True) 194 return expr 195 196 197def _build_date_add(args: t.List) -> exp.TsOrDsAdd: 198 expression = seq_get(args, 1) 199 if expression: 200 expression = expression * -1 201 202 return exp.TsOrDsAdd( 203 this=seq_get(args, 0), expression=expression, unit=exp.Literal.string("DAY") 204 ) 205 206 207class Hive(Dialect): 208 ALIAS_POST_TABLESAMPLE = True 209 IDENTIFIERS_CAN_START_WITH_DIGIT = True 210 SUPPORTS_USER_DEFINED_TYPES = False 211 SAFE_DIVISION = True 212 ARRAY_AGG_INCLUDES_NULLS = None 213 REGEXP_EXTRACT_DEFAULT_GROUP = 1 214 ALTER_TABLE_SUPPORTS_CASCADE = True 215 216 # https://spark.apache.org/docs/latest/sql-ref-identifier.html#description 217 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 218 219 ANNOTATORS = { 220 **Dialect.ANNOTATORS, 221 exp.If: lambda self, e: self._annotate_by_args(e, "true", "false", promote=True), 222 exp.Coalesce: lambda self, e: self._annotate_by_args( 223 e, "this", "expressions", promote=True 224 ), 225 } 226 227 # Support only the non-ANSI mode (default for Hive, Spark2, Spark) 228 COERCES_TO = defaultdict(set, deepcopy(TypeAnnotator.COERCES_TO)) 229 for target_type in { 230 *exp.DataType.NUMERIC_TYPES, 231 *exp.DataType.TEMPORAL_TYPES, 232 exp.DataType.Type.INTERVAL, 233 }: 234 COERCES_TO[target_type] |= exp.DataType.TEXT_TYPES 235 236 TIME_MAPPING = { 237 "y": "%Y", 238 "Y": "%Y", 239 "YYYY": "%Y", 240 "yyyy": "%Y", 241 "YY": "%y", 242 "yy": "%y", 243 "MMMM": "%B", 244 "MMM": "%b", 245 "MM": "%m", 246 "M": "%-m", 247 "dd": "%d", 248 "d": "%-d", 249 "HH": "%H", 250 "H": "%-H", 251 "hh": "%I", 252 "h": "%-I", 253 "mm": "%M", 254 "m": "%-M", 255 "ss": "%S", 256 "s": "%-S", 257 "SSSSSS": "%f", 258 "a": "%p", 259 "DD": "%j", 260 "D": "%-j", 261 "E": "%a", 262 "EE": "%a", 263 "EEE": "%a", 264 "EEEE": "%A", 265 "z": "%Z", 266 "Z": "%z", 267 } 268 269 DATE_FORMAT = "'yyyy-MM-dd'" 270 DATEINT_FORMAT = "'yyyyMMdd'" 271 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 272 273 class Tokenizer(tokens.Tokenizer): 274 QUOTES = ["'", '"'] 275 IDENTIFIERS = ["`"] 276 STRING_ESCAPES = ["\\"] 277 278 SINGLE_TOKENS = { 279 **tokens.Tokenizer.SINGLE_TOKENS, 280 "$": TokenType.PARAMETER, 281 } 282 283 KEYWORDS = { 284 **tokens.Tokenizer.KEYWORDS, 285 "ADD ARCHIVE": TokenType.COMMAND, 286 "ADD ARCHIVES": TokenType.COMMAND, 287 "ADD FILE": TokenType.COMMAND, 288 "ADD FILES": TokenType.COMMAND, 289 "ADD JAR": TokenType.COMMAND, 290 "ADD JARS": TokenType.COMMAND, 291 "MINUS": TokenType.EXCEPT, 292 "MSCK REPAIR": TokenType.COMMAND, 293 "REFRESH": TokenType.REFRESH, 294 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 295 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 296 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 297 } 298 299 NUMERIC_LITERALS = { 300 "L": "BIGINT", 301 "S": "SMALLINT", 302 "Y": "TINYINT", 303 "D": "DOUBLE", 304 "F": "FLOAT", 305 "BD": "DECIMAL", 306 } 307 308 class Parser(parser.Parser): 309 LOG_DEFAULTS_TO_LN = True 310 STRICT_CAST = False 311 VALUES_FOLLOWED_BY_PAREN = False 312 JOINS_HAVE_EQUAL_PRECEDENCE = True 313 ADD_JOIN_ON_TRUE = True 314 ALTER_TABLE_PARTITIONS = True 315 316 CHANGE_COLUMN_ALTER_SYNTAX = False 317 # Whether the dialect supports using ALTER COLUMN syntax with CHANGE COLUMN. 318 319 FUNCTIONS = { 320 **parser.Parser.FUNCTIONS, 321 "BASE64": exp.ToBase64.from_arg_list, 322 "COLLECT_LIST": lambda args: exp.ArrayAgg(this=seq_get(args, 0), nulls_excluded=True), 323 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 324 "DATE_ADD": lambda args: exp.TsOrDsAdd( 325 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 326 ), 327 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 328 [ 329 exp.TimeStrToTime(this=seq_get(args, 0)), 330 seq_get(args, 1), 331 ] 332 ), 333 "DATE_SUB": _build_date_add, 334 "DATEDIFF": lambda args: exp.DateDiff( 335 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 336 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 337 ), 338 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 339 "FIRST": _build_with_ignore_nulls(exp.First), 340 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 341 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 342 "GET_JSON_OBJECT": lambda args, dialect: exp.JSONExtractScalar( 343 this=seq_get(args, 0), expression=dialect.to_json_path(seq_get(args, 1)) 344 ), 345 "LAST": _build_with_ignore_nulls(exp.Last), 346 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 347 "MAP": parser.build_var_map, 348 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 349 "PERCENTILE": exp.Quantile.from_arg_list, 350 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 351 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 352 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 353 "SEQUENCE": exp.GenerateSeries.from_arg_list, 354 "SIZE": exp.ArraySize.from_arg_list, 355 "SPLIT": exp.RegexpSplit.from_arg_list, 356 "STR_TO_MAP": lambda args: exp.StrToMap( 357 this=seq_get(args, 0), 358 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 359 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 360 ), 361 "TO_DATE": _build_to_date, 362 "TO_JSON": exp.JSONFormat.from_arg_list, 363 "TRUNC": exp.TimestampTrunc.from_arg_list, 364 "UNBASE64": exp.FromBase64.from_arg_list, 365 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 366 args or [exp.CurrentTimestamp()] 367 ), 368 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 369 } 370 371 NO_PAREN_FUNCTION_PARSERS = { 372 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 373 "TRANSFORM": lambda self: self._parse_transform(), 374 } 375 376 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 377 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 378 379 PROPERTY_PARSERS = { 380 **parser.Parser.PROPERTY_PARSERS, 381 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 382 expressions=self._parse_wrapped_csv(self._parse_property) 383 ), 384 } 385 386 ALTER_PARSERS = { 387 **parser.Parser.ALTER_PARSERS, 388 "CHANGE": lambda self: self._parse_alter_table_change(), 389 } 390 391 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 392 if not self._match(TokenType.L_PAREN, advance=False): 393 self._retreat(self._index - 1) 394 return None 395 396 args = self._parse_wrapped_csv(self._parse_lambda) 397 row_format_before = self._parse_row_format(match_row=True) 398 399 record_writer = None 400 if self._match_text_seq("RECORDWRITER"): 401 record_writer = self._parse_string() 402 403 if not self._match(TokenType.USING): 404 return exp.Transform.from_arg_list(args) 405 406 command_script = self._parse_string() 407 408 self._match(TokenType.ALIAS) 409 schema = self._parse_schema() 410 411 row_format_after = self._parse_row_format(match_row=True) 412 record_reader = None 413 if self._match_text_seq("RECORDREADER"): 414 record_reader = self._parse_string() 415 416 return self.expression( 417 exp.QueryTransform, 418 expressions=args, 419 command_script=command_script, 420 schema=schema, 421 row_format_before=row_format_before, 422 record_writer=record_writer, 423 row_format_after=row_format_after, 424 record_reader=record_reader, 425 ) 426 427 def _parse_types( 428 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 429 ) -> t.Optional[exp.Expression]: 430 """ 431 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 432 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 433 434 spark-sql (default)> select cast(1234 as varchar(2)); 435 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 436 char/varchar type and simply treats them as string type. Please use string type 437 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 438 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 439 440 1234 441 Time taken: 4.265 seconds, Fetched 1 row(s) 442 443 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 444 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 445 446 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 447 """ 448 this = super()._parse_types( 449 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 450 ) 451 452 if this and not schema: 453 return this.transform( 454 lambda node: ( 455 node.replace(exp.DataType.build("text")) 456 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 457 else node 458 ), 459 copy=False, 460 ) 461 462 return this 463 464 def _parse_alter_table_change(self) -> t.Optional[exp.Expression]: 465 self._match(TokenType.COLUMN) 466 this = self._parse_field(any_token=True) 467 468 if self.CHANGE_COLUMN_ALTER_SYNTAX and self._match_text_seq("TYPE"): 469 return self.expression( 470 exp.AlterColumn, 471 this=this, 472 dtype=self._parse_types(schema=True), 473 ) 474 475 column_new = self._parse_field(any_token=True) 476 dtype = self._parse_types(schema=True) 477 478 comment = self._match(TokenType.COMMENT) and self._parse_string() 479 480 if not this or not column_new or not dtype: 481 self.raise_error( 482 "Expected 'CHANGE COLUMN' to be followed by 'column_name' 'column_name' 'data_type'" 483 ) 484 485 return self.expression( 486 exp.AlterColumn, 487 this=this, 488 rename_to=column_new, 489 dtype=dtype, 490 comment=comment, 491 ) 492 493 def _parse_partition_and_order( 494 self, 495 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 496 return ( 497 ( 498 self._parse_csv(self._parse_assignment) 499 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 500 else [] 501 ), 502 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 503 ) 504 505 def _parse_parameter(self) -> exp.Parameter: 506 self._match(TokenType.L_BRACE) 507 this = self._parse_identifier() or self._parse_primary_or_var() 508 expression = self._match(TokenType.COLON) and ( 509 self._parse_identifier() or self._parse_primary_or_var() 510 ) 511 self._match(TokenType.R_BRACE) 512 return self.expression(exp.Parameter, this=this, expression=expression) 513 514 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 515 if expression.is_star: 516 return expression 517 518 if isinstance(expression, exp.Column): 519 key = expression.this 520 else: 521 key = exp.to_identifier(f"col{index + 1}") 522 523 return self.expression(exp.PropertyEQ, this=key, expression=expression) 524 525 class Generator(generator.Generator): 526 LIMIT_FETCH = "LIMIT" 527 TABLESAMPLE_WITH_METHOD = False 528 JOIN_HINTS = False 529 TABLE_HINTS = False 530 QUERY_HINTS = False 531 INDEX_ON = "ON TABLE" 532 EXTRACT_ALLOWS_QUOTES = False 533 NVL2_SUPPORTED = False 534 LAST_DAY_SUPPORTS_DATE_PART = False 535 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 536 SUPPORTS_TO_NUMBER = False 537 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 538 PARSE_JSON_NAME: t.Optional[str] = None 539 PAD_FILL_PATTERN_IS_REQUIRED = True 540 SUPPORTS_MEDIAN = False 541 ARRAY_SIZE_NAME = "SIZE" 542 ALTER_SET_TYPE = "" 543 544 EXPRESSIONS_WITHOUT_NESTED_CTES = { 545 exp.Insert, 546 exp.Select, 547 exp.Subquery, 548 exp.SetOperation, 549 } 550 551 SUPPORTED_JSON_PATH_PARTS = { 552 exp.JSONPathKey, 553 exp.JSONPathRoot, 554 exp.JSONPathSubscript, 555 exp.JSONPathWildcard, 556 } 557 558 TYPE_MAPPING = { 559 **generator.Generator.TYPE_MAPPING, 560 exp.DataType.Type.BIT: "BOOLEAN", 561 exp.DataType.Type.BLOB: "BINARY", 562 exp.DataType.Type.DATETIME: "TIMESTAMP", 563 exp.DataType.Type.ROWVERSION: "BINARY", 564 exp.DataType.Type.TEXT: "STRING", 565 exp.DataType.Type.TIME: "TIMESTAMP", 566 exp.DataType.Type.TIMESTAMPNTZ: "TIMESTAMP", 567 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 568 exp.DataType.Type.UTINYINT: "SMALLINT", 569 exp.DataType.Type.VARBINARY: "BINARY", 570 } 571 572 TRANSFORMS = { 573 **generator.Generator.TRANSFORMS, 574 exp.Property: property_sql, 575 exp.AnyValue: rename_func("FIRST"), 576 exp.ApproxDistinct: approx_count_distinct_sql, 577 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 578 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 579 exp.ArrayConcat: rename_func("CONCAT"), 580 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 581 exp.ArraySort: _array_sort_sql, 582 exp.With: no_recursive_cte_sql, 583 exp.DateAdd: _add_date_sql, 584 exp.DateDiff: _date_diff_sql, 585 exp.DateStrToDate: datestrtodate_sql, 586 exp.DateSub: _add_date_sql, 587 exp.DateToDi: lambda self, 588 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 589 exp.DiToDate: lambda self, 590 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 591 exp.StorageHandlerProperty: lambda self, e: f"STORED BY {self.sql(e, 'this')}", 592 exp.FromBase64: rename_func("UNBASE64"), 593 exp.GenerateSeries: sequence_sql, 594 exp.GenerateDateArray: sequence_sql, 595 exp.If: if_sql(), 596 exp.ILike: no_ilike_sql, 597 exp.IntDiv: lambda self, e: self.binary(e, "DIV"), 598 exp.IsNan: rename_func("ISNAN"), 599 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 600 exp.JSONExtractScalar: lambda self, e: self.func( 601 "GET_JSON_OBJECT", e.this, e.expression 602 ), 603 exp.JSONFormat: _json_format_sql, 604 exp.Left: left_to_substring_sql, 605 exp.Map: var_map_sql, 606 exp.Max: max_or_greatest, 607 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 608 exp.Min: min_or_least, 609 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 610 exp.NotNullColumnConstraint: lambda _, e: ( 611 "" if e.args.get("allow_null") else "NOT NULL" 612 ), 613 exp.VarMap: var_map_sql, 614 exp.Create: preprocess( 615 [ 616 remove_unique_constraints, 617 ctas_with_tmp_tables_to_create_tmp_view, 618 move_schema_columns_to_partitioned_by, 619 ] 620 ), 621 exp.Quantile: rename_func("PERCENTILE"), 622 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 623 exp.RegexpExtract: regexp_extract_sql, 624 exp.RegexpExtractAll: regexp_extract_sql, 625 exp.RegexpReplace: regexp_replace_sql, 626 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 627 exp.RegexpSplit: rename_func("SPLIT"), 628 exp.Right: right_to_substring_sql, 629 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 630 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 631 exp.Split: lambda self, e: self.func( 632 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 633 ), 634 exp.Select: transforms.preprocess( 635 [ 636 transforms.eliminate_qualify, 637 transforms.eliminate_distinct_on, 638 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 639 transforms.any_to_exists, 640 ] 641 ), 642 exp.StrPosition: lambda self, e: strposition_sql( 643 self, e, func_name="LOCATE", supports_position=True 644 ), 645 exp.StrToDate: _str_to_date_sql, 646 exp.StrToTime: _str_to_time_sql, 647 exp.StrToUnix: _str_to_unix_sql, 648 exp.StructExtract: struct_extract_sql, 649 exp.StarMap: rename_func("MAP"), 650 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 651 exp.TimeStrToDate: rename_func("TO_DATE"), 652 exp.TimeStrToTime: timestrtotime_sql, 653 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 654 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 655 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 656 exp.ToBase64: rename_func("BASE64"), 657 exp.TsOrDiToDi: lambda self, 658 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 659 exp.TsOrDsAdd: _add_date_sql, 660 exp.TsOrDsDiff: _date_diff_sql, 661 exp.TsOrDsToDate: _to_date_sql, 662 exp.TryCast: no_trycast_sql, 663 exp.Unicode: rename_func("ASCII"), 664 exp.UnixToStr: lambda self, e: self.func( 665 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 666 ), 667 exp.UnixToTime: _unix_to_time_sql, 668 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 669 exp.Unnest: rename_func("EXPLODE"), 670 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 671 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 672 exp.National: lambda self, e: self.national_sql(e, prefix=""), 673 exp.ClusteredColumnConstraint: lambda self, 674 e: f"({self.expressions(e, 'this', indent=False)})", 675 exp.NonClusteredColumnConstraint: lambda self, 676 e: f"({self.expressions(e, 'this', indent=False)})", 677 exp.NotForReplicationColumnConstraint: lambda *_: "", 678 exp.OnProperty: lambda *_: "", 679 exp.PartitionedByBucket: lambda self, e: self.func("BUCKET", e.expression, e.this), 680 exp.PartitionByTruncate: lambda self, e: self.func("TRUNCATE", e.expression, e.this), 681 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 682 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 683 exp.DayOfMonth: rename_func("DAYOFMONTH"), 684 exp.DayOfWeek: rename_func("DAYOFWEEK"), 685 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 686 rename_func("LEVENSHTEIN") 687 ), 688 } 689 690 PROPERTIES_LOCATION = { 691 **generator.Generator.PROPERTIES_LOCATION, 692 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 693 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 694 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 695 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 696 } 697 698 TS_OR_DS_EXPRESSIONS: t.Tuple[t.Type[exp.Expression], ...] = ( 699 exp.DateDiff, 700 exp.Day, 701 exp.Month, 702 exp.Year, 703 ) 704 705 def unnest_sql(self, expression: exp.Unnest) -> str: 706 return rename_func("EXPLODE")(self, expression) 707 708 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 709 if isinstance(expression.this, exp.JSONPathWildcard): 710 self.unsupported("Unsupported wildcard in JSONPathKey expression") 711 return "" 712 713 return super()._jsonpathkey_sql(expression) 714 715 def parameter_sql(self, expression: exp.Parameter) -> str: 716 this = self.sql(expression, "this") 717 expression_sql = self.sql(expression, "expression") 718 719 parent = expression.parent 720 this = f"{this}:{expression_sql}" if expression_sql else this 721 722 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 723 # We need to produce SET key = value instead of SET ${key} = value 724 return this 725 726 return f"${{{this}}}" 727 728 def schema_sql(self, expression: exp.Schema) -> str: 729 for ordered in expression.find_all(exp.Ordered): 730 if ordered.args.get("desc") is False: 731 ordered.set("desc", None) 732 733 return super().schema_sql(expression) 734 735 def constraint_sql(self, expression: exp.Constraint) -> str: 736 for prop in list(expression.find_all(exp.Properties)): 737 prop.pop() 738 739 this = self.sql(expression, "this") 740 expressions = self.expressions(expression, sep=" ", flat=True) 741 return f"CONSTRAINT {this} {expressions}" 742 743 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 744 serde_props = self.sql(expression, "serde_properties") 745 serde_props = f" {serde_props}" if serde_props else "" 746 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 747 748 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 749 return self.func( 750 "COLLECT_LIST", 751 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 752 ) 753 754 def datatype_sql(self, expression: exp.DataType) -> str: 755 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 756 not expression.expressions or expression.expressions[0].name == "MAX" 757 ): 758 expression = exp.DataType.build("text") 759 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 760 expression.set("this", exp.DataType.Type.VARCHAR) 761 elif expression.this in exp.DataType.TEMPORAL_TYPES: 762 expression = exp.DataType.build(expression.this) 763 elif expression.is_type("float"): 764 size_expression = expression.find(exp.DataTypeParam) 765 if size_expression: 766 size = int(size_expression.name) 767 expression = ( 768 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 769 ) 770 771 return super().datatype_sql(expression) 772 773 def version_sql(self, expression: exp.Version) -> str: 774 sql = super().version_sql(expression) 775 return sql.replace("FOR ", "", 1) 776 777 def struct_sql(self, expression: exp.Struct) -> str: 778 values = [] 779 780 for i, e in enumerate(expression.expressions): 781 if isinstance(e, exp.PropertyEQ): 782 self.unsupported("Hive does not support named structs.") 783 values.append(e.expression) 784 else: 785 values.append(e) 786 787 return self.func("STRUCT", *values) 788 789 def columndef_sql(self, expression: exp.ColumnDef, sep: str = " ") -> str: 790 return super().columndef_sql( 791 expression, 792 sep=( 793 ": " 794 if isinstance(expression.parent, exp.DataType) 795 and expression.parent.is_type("struct") 796 else sep 797 ), 798 ) 799 800 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 801 this = self.sql(expression, "this") 802 new_name = self.sql(expression, "rename_to") or this 803 dtype = self.sql(expression, "dtype") 804 comment = ( 805 f" COMMENT {self.sql(expression, 'comment')}" 806 if self.sql(expression, "comment") 807 else "" 808 ) 809 default = self.sql(expression, "default") 810 visible = expression.args.get("visible") 811 allow_null = expression.args.get("allow_null") 812 drop = expression.args.get("drop") 813 814 if any([default, drop, visible, allow_null, drop]): 815 self.unsupported("Unsupported CHANGE COLUMN syntax") 816 817 if not dtype: 818 self.unsupported("CHANGE COLUMN without a type is not supported") 819 820 return f"CHANGE COLUMN {this} {new_name} {dtype}{comment}" 821 822 def renamecolumn_sql(self, expression: exp.RenameColumn) -> str: 823 self.unsupported("Cannot rename columns without data type defined in Hive") 824 return "" 825 826 def alterset_sql(self, expression: exp.AlterSet) -> str: 827 exprs = self.expressions(expression, flat=True) 828 exprs = f" {exprs}" if exprs else "" 829 location = self.sql(expression, "location") 830 location = f" LOCATION {location}" if location else "" 831 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 832 file_format = f" FILEFORMAT {file_format}" if file_format else "" 833 serde = self.sql(expression, "serde") 834 serde = f" SERDE {serde}" if serde else "" 835 tags = self.expressions(expression, key="tag", flat=True, sep="") 836 tags = f" TAGS {tags}" if tags else "" 837 838 return f"SET{serde}{exprs}{location}{file_format}{tags}" 839 840 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 841 prefix = "WITH " if expression.args.get("with") else "" 842 exprs = self.expressions(expression, flat=True) 843 844 return f"{prefix}SERDEPROPERTIES ({exprs})" 845 846 def exists_sql(self, expression: exp.Exists) -> str: 847 if expression.expression: 848 return self.function_fallback_sql(expression) 849 850 return super().exists_sql(expression) 851 852 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 853 this = expression.this 854 if isinstance(this, exp.TimeStrToTime): 855 this = this.this 856 857 return self.func("DATE_FORMAT", this, self.format_time(expression)) 858 859 def fileformatproperty_sql(self, expression: exp.FileFormatProperty) -> str: 860 if isinstance(expression.this, exp.InputOutputFormat): 861 this = self.sql(expression, "this") 862 else: 863 this = expression.name.upper() 864 865 return f"STORED AS {this}"
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')
class
Hive(sqlglot.dialects.dialect.Dialect):
208class Hive(Dialect): 209 ALIAS_POST_TABLESAMPLE = True 210 IDENTIFIERS_CAN_START_WITH_DIGIT = True 211 SUPPORTS_USER_DEFINED_TYPES = False 212 SAFE_DIVISION = True 213 ARRAY_AGG_INCLUDES_NULLS = None 214 REGEXP_EXTRACT_DEFAULT_GROUP = 1 215 ALTER_TABLE_SUPPORTS_CASCADE = True 216 217 # https://spark.apache.org/docs/latest/sql-ref-identifier.html#description 218 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 219 220 ANNOTATORS = { 221 **Dialect.ANNOTATORS, 222 exp.If: lambda self, e: self._annotate_by_args(e, "true", "false", promote=True), 223 exp.Coalesce: lambda self, e: self._annotate_by_args( 224 e, "this", "expressions", promote=True 225 ), 226 } 227 228 # Support only the non-ANSI mode (default for Hive, Spark2, Spark) 229 COERCES_TO = defaultdict(set, deepcopy(TypeAnnotator.COERCES_TO)) 230 for target_type in { 231 *exp.DataType.NUMERIC_TYPES, 232 *exp.DataType.TEMPORAL_TYPES, 233 exp.DataType.Type.INTERVAL, 234 }: 235 COERCES_TO[target_type] |= exp.DataType.TEXT_TYPES 236 237 TIME_MAPPING = { 238 "y": "%Y", 239 "Y": "%Y", 240 "YYYY": "%Y", 241 "yyyy": "%Y", 242 "YY": "%y", 243 "yy": "%y", 244 "MMMM": "%B", 245 "MMM": "%b", 246 "MM": "%m", 247 "M": "%-m", 248 "dd": "%d", 249 "d": "%-d", 250 "HH": "%H", 251 "H": "%-H", 252 "hh": "%I", 253 "h": "%-I", 254 "mm": "%M", 255 "m": "%-M", 256 "ss": "%S", 257 "s": "%-S", 258 "SSSSSS": "%f", 259 "a": "%p", 260 "DD": "%j", 261 "D": "%-j", 262 "E": "%a", 263 "EE": "%a", 264 "EEE": "%a", 265 "EEEE": "%A", 266 "z": "%Z", 267 "Z": "%z", 268 } 269 270 DATE_FORMAT = "'yyyy-MM-dd'" 271 DATEINT_FORMAT = "'yyyyMMdd'" 272 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 273 274 class Tokenizer(tokens.Tokenizer): 275 QUOTES = ["'", '"'] 276 IDENTIFIERS = ["`"] 277 STRING_ESCAPES = ["\\"] 278 279 SINGLE_TOKENS = { 280 **tokens.Tokenizer.SINGLE_TOKENS, 281 "$": TokenType.PARAMETER, 282 } 283 284 KEYWORDS = { 285 **tokens.Tokenizer.KEYWORDS, 286 "ADD ARCHIVE": TokenType.COMMAND, 287 "ADD ARCHIVES": TokenType.COMMAND, 288 "ADD FILE": TokenType.COMMAND, 289 "ADD FILES": TokenType.COMMAND, 290 "ADD JAR": TokenType.COMMAND, 291 "ADD JARS": TokenType.COMMAND, 292 "MINUS": TokenType.EXCEPT, 293 "MSCK REPAIR": TokenType.COMMAND, 294 "REFRESH": TokenType.REFRESH, 295 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 296 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 297 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 298 } 299 300 NUMERIC_LITERALS = { 301 "L": "BIGINT", 302 "S": "SMALLINT", 303 "Y": "TINYINT", 304 "D": "DOUBLE", 305 "F": "FLOAT", 306 "BD": "DECIMAL", 307 } 308 309 class Parser(parser.Parser): 310 LOG_DEFAULTS_TO_LN = True 311 STRICT_CAST = False 312 VALUES_FOLLOWED_BY_PAREN = False 313 JOINS_HAVE_EQUAL_PRECEDENCE = True 314 ADD_JOIN_ON_TRUE = True 315 ALTER_TABLE_PARTITIONS = True 316 317 CHANGE_COLUMN_ALTER_SYNTAX = False 318 # Whether the dialect supports using ALTER COLUMN syntax with CHANGE COLUMN. 319 320 FUNCTIONS = { 321 **parser.Parser.FUNCTIONS, 322 "BASE64": exp.ToBase64.from_arg_list, 323 "COLLECT_LIST": lambda args: exp.ArrayAgg(this=seq_get(args, 0), nulls_excluded=True), 324 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 325 "DATE_ADD": lambda args: exp.TsOrDsAdd( 326 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 327 ), 328 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 329 [ 330 exp.TimeStrToTime(this=seq_get(args, 0)), 331 seq_get(args, 1), 332 ] 333 ), 334 "DATE_SUB": _build_date_add, 335 "DATEDIFF": lambda args: exp.DateDiff( 336 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 337 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 338 ), 339 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 340 "FIRST": _build_with_ignore_nulls(exp.First), 341 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 342 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 343 "GET_JSON_OBJECT": lambda args, dialect: exp.JSONExtractScalar( 344 this=seq_get(args, 0), expression=dialect.to_json_path(seq_get(args, 1)) 345 ), 346 "LAST": _build_with_ignore_nulls(exp.Last), 347 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 348 "MAP": parser.build_var_map, 349 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 350 "PERCENTILE": exp.Quantile.from_arg_list, 351 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 352 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 353 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 354 "SEQUENCE": exp.GenerateSeries.from_arg_list, 355 "SIZE": exp.ArraySize.from_arg_list, 356 "SPLIT": exp.RegexpSplit.from_arg_list, 357 "STR_TO_MAP": lambda args: exp.StrToMap( 358 this=seq_get(args, 0), 359 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 360 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 361 ), 362 "TO_DATE": _build_to_date, 363 "TO_JSON": exp.JSONFormat.from_arg_list, 364 "TRUNC": exp.TimestampTrunc.from_arg_list, 365 "UNBASE64": exp.FromBase64.from_arg_list, 366 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 367 args or [exp.CurrentTimestamp()] 368 ), 369 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 370 } 371 372 NO_PAREN_FUNCTION_PARSERS = { 373 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 374 "TRANSFORM": lambda self: self._parse_transform(), 375 } 376 377 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 378 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 379 380 PROPERTY_PARSERS = { 381 **parser.Parser.PROPERTY_PARSERS, 382 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 383 expressions=self._parse_wrapped_csv(self._parse_property) 384 ), 385 } 386 387 ALTER_PARSERS = { 388 **parser.Parser.ALTER_PARSERS, 389 "CHANGE": lambda self: self._parse_alter_table_change(), 390 } 391 392 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 393 if not self._match(TokenType.L_PAREN, advance=False): 394 self._retreat(self._index - 1) 395 return None 396 397 args = self._parse_wrapped_csv(self._parse_lambda) 398 row_format_before = self._parse_row_format(match_row=True) 399 400 record_writer = None 401 if self._match_text_seq("RECORDWRITER"): 402 record_writer = self._parse_string() 403 404 if not self._match(TokenType.USING): 405 return exp.Transform.from_arg_list(args) 406 407 command_script = self._parse_string() 408 409 self._match(TokenType.ALIAS) 410 schema = self._parse_schema() 411 412 row_format_after = self._parse_row_format(match_row=True) 413 record_reader = None 414 if self._match_text_seq("RECORDREADER"): 415 record_reader = self._parse_string() 416 417 return self.expression( 418 exp.QueryTransform, 419 expressions=args, 420 command_script=command_script, 421 schema=schema, 422 row_format_before=row_format_before, 423 record_writer=record_writer, 424 row_format_after=row_format_after, 425 record_reader=record_reader, 426 ) 427 428 def _parse_types( 429 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 430 ) -> t.Optional[exp.Expression]: 431 """ 432 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 433 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 434 435 spark-sql (default)> select cast(1234 as varchar(2)); 436 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 437 char/varchar type and simply treats them as string type. Please use string type 438 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 439 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 440 441 1234 442 Time taken: 4.265 seconds, Fetched 1 row(s) 443 444 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 445 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 446 447 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 448 """ 449 this = super()._parse_types( 450 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 451 ) 452 453 if this and not schema: 454 return this.transform( 455 lambda node: ( 456 node.replace(exp.DataType.build("text")) 457 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 458 else node 459 ), 460 copy=False, 461 ) 462 463 return this 464 465 def _parse_alter_table_change(self) -> t.Optional[exp.Expression]: 466 self._match(TokenType.COLUMN) 467 this = self._parse_field(any_token=True) 468 469 if self.CHANGE_COLUMN_ALTER_SYNTAX and self._match_text_seq("TYPE"): 470 return self.expression( 471 exp.AlterColumn, 472 this=this, 473 dtype=self._parse_types(schema=True), 474 ) 475 476 column_new = self._parse_field(any_token=True) 477 dtype = self._parse_types(schema=True) 478 479 comment = self._match(TokenType.COMMENT) and self._parse_string() 480 481 if not this or not column_new or not dtype: 482 self.raise_error( 483 "Expected 'CHANGE COLUMN' to be followed by 'column_name' 'column_name' 'data_type'" 484 ) 485 486 return self.expression( 487 exp.AlterColumn, 488 this=this, 489 rename_to=column_new, 490 dtype=dtype, 491 comment=comment, 492 ) 493 494 def _parse_partition_and_order( 495 self, 496 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 497 return ( 498 ( 499 self._parse_csv(self._parse_assignment) 500 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 501 else [] 502 ), 503 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 504 ) 505 506 def _parse_parameter(self) -> exp.Parameter: 507 self._match(TokenType.L_BRACE) 508 this = self._parse_identifier() or self._parse_primary_or_var() 509 expression = self._match(TokenType.COLON) and ( 510 self._parse_identifier() or self._parse_primary_or_var() 511 ) 512 self._match(TokenType.R_BRACE) 513 return self.expression(exp.Parameter, this=this, expression=expression) 514 515 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 516 if expression.is_star: 517 return expression 518 519 if isinstance(expression, exp.Column): 520 key = expression.this 521 else: 522 key = exp.to_identifier(f"col{index + 1}") 523 524 return self.expression(exp.PropertyEQ, this=key, expression=expression) 525 526 class Generator(generator.Generator): 527 LIMIT_FETCH = "LIMIT" 528 TABLESAMPLE_WITH_METHOD = False 529 JOIN_HINTS = False 530 TABLE_HINTS = False 531 QUERY_HINTS = False 532 INDEX_ON = "ON TABLE" 533 EXTRACT_ALLOWS_QUOTES = False 534 NVL2_SUPPORTED = False 535 LAST_DAY_SUPPORTS_DATE_PART = False 536 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 537 SUPPORTS_TO_NUMBER = False 538 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 539 PARSE_JSON_NAME: t.Optional[str] = None 540 PAD_FILL_PATTERN_IS_REQUIRED = True 541 SUPPORTS_MEDIAN = False 542 ARRAY_SIZE_NAME = "SIZE" 543 ALTER_SET_TYPE = "" 544 545 EXPRESSIONS_WITHOUT_NESTED_CTES = { 546 exp.Insert, 547 exp.Select, 548 exp.Subquery, 549 exp.SetOperation, 550 } 551 552 SUPPORTED_JSON_PATH_PARTS = { 553 exp.JSONPathKey, 554 exp.JSONPathRoot, 555 exp.JSONPathSubscript, 556 exp.JSONPathWildcard, 557 } 558 559 TYPE_MAPPING = { 560 **generator.Generator.TYPE_MAPPING, 561 exp.DataType.Type.BIT: "BOOLEAN", 562 exp.DataType.Type.BLOB: "BINARY", 563 exp.DataType.Type.DATETIME: "TIMESTAMP", 564 exp.DataType.Type.ROWVERSION: "BINARY", 565 exp.DataType.Type.TEXT: "STRING", 566 exp.DataType.Type.TIME: "TIMESTAMP", 567 exp.DataType.Type.TIMESTAMPNTZ: "TIMESTAMP", 568 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 569 exp.DataType.Type.UTINYINT: "SMALLINT", 570 exp.DataType.Type.VARBINARY: "BINARY", 571 } 572 573 TRANSFORMS = { 574 **generator.Generator.TRANSFORMS, 575 exp.Property: property_sql, 576 exp.AnyValue: rename_func("FIRST"), 577 exp.ApproxDistinct: approx_count_distinct_sql, 578 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 579 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 580 exp.ArrayConcat: rename_func("CONCAT"), 581 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 582 exp.ArraySort: _array_sort_sql, 583 exp.With: no_recursive_cte_sql, 584 exp.DateAdd: _add_date_sql, 585 exp.DateDiff: _date_diff_sql, 586 exp.DateStrToDate: datestrtodate_sql, 587 exp.DateSub: _add_date_sql, 588 exp.DateToDi: lambda self, 589 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 590 exp.DiToDate: lambda self, 591 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 592 exp.StorageHandlerProperty: lambda self, e: f"STORED BY {self.sql(e, 'this')}", 593 exp.FromBase64: rename_func("UNBASE64"), 594 exp.GenerateSeries: sequence_sql, 595 exp.GenerateDateArray: sequence_sql, 596 exp.If: if_sql(), 597 exp.ILike: no_ilike_sql, 598 exp.IntDiv: lambda self, e: self.binary(e, "DIV"), 599 exp.IsNan: rename_func("ISNAN"), 600 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 601 exp.JSONExtractScalar: lambda self, e: self.func( 602 "GET_JSON_OBJECT", e.this, e.expression 603 ), 604 exp.JSONFormat: _json_format_sql, 605 exp.Left: left_to_substring_sql, 606 exp.Map: var_map_sql, 607 exp.Max: max_or_greatest, 608 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 609 exp.Min: min_or_least, 610 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 611 exp.NotNullColumnConstraint: lambda _, e: ( 612 "" if e.args.get("allow_null") else "NOT NULL" 613 ), 614 exp.VarMap: var_map_sql, 615 exp.Create: preprocess( 616 [ 617 remove_unique_constraints, 618 ctas_with_tmp_tables_to_create_tmp_view, 619 move_schema_columns_to_partitioned_by, 620 ] 621 ), 622 exp.Quantile: rename_func("PERCENTILE"), 623 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 624 exp.RegexpExtract: regexp_extract_sql, 625 exp.RegexpExtractAll: regexp_extract_sql, 626 exp.RegexpReplace: regexp_replace_sql, 627 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 628 exp.RegexpSplit: rename_func("SPLIT"), 629 exp.Right: right_to_substring_sql, 630 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 631 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 632 exp.Split: lambda self, e: self.func( 633 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 634 ), 635 exp.Select: transforms.preprocess( 636 [ 637 transforms.eliminate_qualify, 638 transforms.eliminate_distinct_on, 639 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 640 transforms.any_to_exists, 641 ] 642 ), 643 exp.StrPosition: lambda self, e: strposition_sql( 644 self, e, func_name="LOCATE", supports_position=True 645 ), 646 exp.StrToDate: _str_to_date_sql, 647 exp.StrToTime: _str_to_time_sql, 648 exp.StrToUnix: _str_to_unix_sql, 649 exp.StructExtract: struct_extract_sql, 650 exp.StarMap: rename_func("MAP"), 651 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 652 exp.TimeStrToDate: rename_func("TO_DATE"), 653 exp.TimeStrToTime: timestrtotime_sql, 654 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 655 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 656 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 657 exp.ToBase64: rename_func("BASE64"), 658 exp.TsOrDiToDi: lambda self, 659 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 660 exp.TsOrDsAdd: _add_date_sql, 661 exp.TsOrDsDiff: _date_diff_sql, 662 exp.TsOrDsToDate: _to_date_sql, 663 exp.TryCast: no_trycast_sql, 664 exp.Unicode: rename_func("ASCII"), 665 exp.UnixToStr: lambda self, e: self.func( 666 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 667 ), 668 exp.UnixToTime: _unix_to_time_sql, 669 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 670 exp.Unnest: rename_func("EXPLODE"), 671 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 672 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 673 exp.National: lambda self, e: self.national_sql(e, prefix=""), 674 exp.ClusteredColumnConstraint: lambda self, 675 e: f"({self.expressions(e, 'this', indent=False)})", 676 exp.NonClusteredColumnConstraint: lambda self, 677 e: f"({self.expressions(e, 'this', indent=False)})", 678 exp.NotForReplicationColumnConstraint: lambda *_: "", 679 exp.OnProperty: lambda *_: "", 680 exp.PartitionedByBucket: lambda self, e: self.func("BUCKET", e.expression, e.this), 681 exp.PartitionByTruncate: lambda self, e: self.func("TRUNCATE", e.expression, e.this), 682 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 683 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 684 exp.DayOfMonth: rename_func("DAYOFMONTH"), 685 exp.DayOfWeek: rename_func("DAYOFWEEK"), 686 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 687 rename_func("LEVENSHTEIN") 688 ), 689 } 690 691 PROPERTIES_LOCATION = { 692 **generator.Generator.PROPERTIES_LOCATION, 693 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 694 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 695 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 696 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 697 } 698 699 TS_OR_DS_EXPRESSIONS: t.Tuple[t.Type[exp.Expression], ...] = ( 700 exp.DateDiff, 701 exp.Day, 702 exp.Month, 703 exp.Year, 704 ) 705 706 def unnest_sql(self, expression: exp.Unnest) -> str: 707 return rename_func("EXPLODE")(self, expression) 708 709 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 710 if isinstance(expression.this, exp.JSONPathWildcard): 711 self.unsupported("Unsupported wildcard in JSONPathKey expression") 712 return "" 713 714 return super()._jsonpathkey_sql(expression) 715 716 def parameter_sql(self, expression: exp.Parameter) -> str: 717 this = self.sql(expression, "this") 718 expression_sql = self.sql(expression, "expression") 719 720 parent = expression.parent 721 this = f"{this}:{expression_sql}" if expression_sql else this 722 723 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 724 # We need to produce SET key = value instead of SET ${key} = value 725 return this 726 727 return f"${{{this}}}" 728 729 def schema_sql(self, expression: exp.Schema) -> str: 730 for ordered in expression.find_all(exp.Ordered): 731 if ordered.args.get("desc") is False: 732 ordered.set("desc", None) 733 734 return super().schema_sql(expression) 735 736 def constraint_sql(self, expression: exp.Constraint) -> str: 737 for prop in list(expression.find_all(exp.Properties)): 738 prop.pop() 739 740 this = self.sql(expression, "this") 741 expressions = self.expressions(expression, sep=" ", flat=True) 742 return f"CONSTRAINT {this} {expressions}" 743 744 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 745 serde_props = self.sql(expression, "serde_properties") 746 serde_props = f" {serde_props}" if serde_props else "" 747 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 748 749 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 750 return self.func( 751 "COLLECT_LIST", 752 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 753 ) 754 755 def datatype_sql(self, expression: exp.DataType) -> str: 756 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 757 not expression.expressions or expression.expressions[0].name == "MAX" 758 ): 759 expression = exp.DataType.build("text") 760 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 761 expression.set("this", exp.DataType.Type.VARCHAR) 762 elif expression.this in exp.DataType.TEMPORAL_TYPES: 763 expression = exp.DataType.build(expression.this) 764 elif expression.is_type("float"): 765 size_expression = expression.find(exp.DataTypeParam) 766 if size_expression: 767 size = int(size_expression.name) 768 expression = ( 769 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 770 ) 771 772 return super().datatype_sql(expression) 773 774 def version_sql(self, expression: exp.Version) -> str: 775 sql = super().version_sql(expression) 776 return sql.replace("FOR ", "", 1) 777 778 def struct_sql(self, expression: exp.Struct) -> str: 779 values = [] 780 781 for i, e in enumerate(expression.expressions): 782 if isinstance(e, exp.PropertyEQ): 783 self.unsupported("Hive does not support named structs.") 784 values.append(e.expression) 785 else: 786 values.append(e) 787 788 return self.func("STRUCT", *values) 789 790 def columndef_sql(self, expression: exp.ColumnDef, sep: str = " ") -> str: 791 return super().columndef_sql( 792 expression, 793 sep=( 794 ": " 795 if isinstance(expression.parent, exp.DataType) 796 and expression.parent.is_type("struct") 797 else sep 798 ), 799 ) 800 801 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 802 this = self.sql(expression, "this") 803 new_name = self.sql(expression, "rename_to") or this 804 dtype = self.sql(expression, "dtype") 805 comment = ( 806 f" COMMENT {self.sql(expression, 'comment')}" 807 if self.sql(expression, "comment") 808 else "" 809 ) 810 default = self.sql(expression, "default") 811 visible = expression.args.get("visible") 812 allow_null = expression.args.get("allow_null") 813 drop = expression.args.get("drop") 814 815 if any([default, drop, visible, allow_null, drop]): 816 self.unsupported("Unsupported CHANGE COLUMN syntax") 817 818 if not dtype: 819 self.unsupported("CHANGE COLUMN without a type is not supported") 820 821 return f"CHANGE COLUMN {this} {new_name} {dtype}{comment}" 822 823 def renamecolumn_sql(self, expression: exp.RenameColumn) -> str: 824 self.unsupported("Cannot rename columns without data type defined in Hive") 825 return "" 826 827 def alterset_sql(self, expression: exp.AlterSet) -> str: 828 exprs = self.expressions(expression, flat=True) 829 exprs = f" {exprs}" if exprs else "" 830 location = self.sql(expression, "location") 831 location = f" LOCATION {location}" if location else "" 832 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 833 file_format = f" FILEFORMAT {file_format}" if file_format else "" 834 serde = self.sql(expression, "serde") 835 serde = f" SERDE {serde}" if serde else "" 836 tags = self.expressions(expression, key="tag", flat=True, sep="") 837 tags = f" TAGS {tags}" if tags else "" 838 839 return f"SET{serde}{exprs}{location}{file_format}{tags}" 840 841 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 842 prefix = "WITH " if expression.args.get("with") else "" 843 exprs = self.expressions(expression, flat=True) 844 845 return f"{prefix}SERDEPROPERTIES ({exprs})" 846 847 def exists_sql(self, expression: exp.Exists) -> str: 848 if expression.expression: 849 return self.function_fallback_sql(expression) 850 851 return super().exists_sql(expression) 852 853 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 854 this = expression.this 855 if isinstance(this, exp.TimeStrToTime): 856 this = this.this 857 858 return self.func("DATE_FORMAT", this, self.format_time(expression)) 859 860 def fileformatproperty_sql(self, expression: exp.FileFormatProperty) -> str: 861 if isinstance(expression.this, exp.InputOutputFormat): 862 this = self.sql(expression, "this") 863 else: 864 this = expression.name.upper() 865 866 return f"STORED AS {this}"
ALTER_TABLE_SUPPORTS_CASCADE =
True
Hive by default does not update the schema of existing partitions when a column is changed. the CASCADE clause is used to indicate that the change should be propagated to all existing partitions. the Spark dialect, while derived from Hive, does not support the CASCADE clause.
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.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.JSONBContainsAllTopKeys'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.JSONBContainsAnyTopKeys'>: <function Dialect.<dictcomp>.<lambda>>, <class 'sqlglot.expressions.JSONBDeleteAtPath'>: <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.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.RegexpFullMatch'>: <function Dialect.<dictcomp>.<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.Int64'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixMillis'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ApproxDistinct'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Length'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixMicros'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.CountIf'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ArraySize'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixSeconds'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixDate'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.FromBase32'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.FromBase64'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.EndsWith'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Between'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.LogicalAnd'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.StartsWith'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.LogicalOr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Boolean'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Contains'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.In'>: <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.DiToDate'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeStrToDate'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DateFromParts'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.LastDay'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TsOrDsToDate'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Date'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.StrToDate'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DatetimeSub'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DatetimeAdd'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Datetime'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentDatetime'>: <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.StddevPop'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Stddev'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.VariancePop'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Sqrt'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Variance'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ApproxQuantile'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ToDouble'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Log'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Quantile'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.SafeDivide'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Ln'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Avg'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.StddevSamp'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DateToDi'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Ceil'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Unicode'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.StrPosition'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimestampDiff'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DateDiff'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Sign'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeDiff'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.DatetimeDiff'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Ascii'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Levenshtein'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TsOrDiToDi'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Interval'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.JustifyDays'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.MakeInterval'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.JustifyInterval'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.JustifyHours'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ParseJSON'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Time'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentTime'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeSub'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeAdd'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentTimestampLTZ'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeStrToTime'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimestampSub'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimestampAdd'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixToTime'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.CurrentTimestamp'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.StrToTime'>: <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.Quarter'>: <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.DateToDateStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ArrayToString'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Lower'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixToStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ToBase32'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeToTimeStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Substring'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ConcatWs'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.ArrayConcat'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Initcap'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Chr'>: <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.ToBase64'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.GroupConcat'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixToTimeStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeToStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.TsOrDsToDateStr'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.Concat'>: <function annotate_with_type_lambda.<locals>.<lambda>>, <class 'sqlglot.expressions.String'>: <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.AnyValue'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.ArrayAgg'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.ArrayConcatAgg'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.ArrayFirst'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.ArrayLast'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.ArrayReverse'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.ArraySlice'>: <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.GenerateSeries'>: <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.Least'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.Literal'>: <function Dialect.<lambda>>, <class 'sqlglot.expressions.LastValue'>: <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>>, <class 'sqlglot.expressions.Window'>: <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.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>}, <Type.NCHAR: 'NCHAR'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.CHAR: 'CHAR'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.NCHAR: 'NCHAR'>, <Type.VARCHAR: 'VARCHAR'>}, <Type.DOUBLE: 'DOUBLE'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.FLOAT: 'FLOAT'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.DOUBLE: 'DOUBLE'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.DECIMAL: 'DECIMAL'>: {<Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.FLOAT: 'FLOAT'>, <Type.DOUBLE: 'DOUBLE'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.BIGINT: 'BIGINT'>: {<Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.FLOAT: 'FLOAT'>, <Type.DECIMAL: 'DECIMAL'>, <Type.DOUBLE: 'DOUBLE'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.INT: 'INT'>: {<Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.BIGINT: 'BIGINT'>, <Type.FLOAT: 'FLOAT'>, <Type.DECIMAL: 'DECIMAL'>, <Type.DOUBLE: 'DOUBLE'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.SMALLINT: 'SMALLINT'>: {<Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.BIGINT: 'BIGINT'>, <Type.INT: 'INT'>, <Type.FLOAT: 'FLOAT'>, <Type.DECIMAL: 'DECIMAL'>, <Type.DOUBLE: 'DOUBLE'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.TINYINT: 'TINYINT'>: {<Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.SMALLINT: 'SMALLINT'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.BIGINT: 'BIGINT'>, <Type.INT: 'INT'>, <Type.FLOAT: 'FLOAT'>, <Type.DECIMAL: 'DECIMAL'>, <Type.DOUBLE: 'DOUBLE'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.TIMESTAMP: 'TIMESTAMP'>: {<Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.DATETIME: 'DATETIME'>: {<Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <Type.TIMESTAMP: 'TIMESTAMP'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.DATE: 'DATE'>: {<Type.TEXT: 'TEXT'>, <Type.DATETIME: 'DATETIME'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <Type.TIMESTAMP: 'TIMESTAMP'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.NULL: 'NULL'>: {<Type.TEXT: 'TEXT'>, <Type.DATETIME: 'DATETIME'>, <Type.VARCHAR: 'VARCHAR'>, <Type.TINYINT: 'TINYINT'>, <Type.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <Type.NVARCHAR: 'NVARCHAR'>, <Type.SMALLINT: 'SMALLINT'>, <Type.BIGINT: 'BIGINT'>, <Type.INT: 'INT'>, <Type.FLOAT: 'FLOAT'>, <Type.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <Type.DECIMAL: 'DECIMAL'>, <Type.DOUBLE: 'DOUBLE'>, <Type.DATE: 'DATE'>, <Type.NCHAR: 'NCHAR'>, <Type.CHAR: 'CHAR'>, <Type.TIMESTAMP: 'TIMESTAMP'>}, <Type.INT256: 'INT256'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.UMEDIUMINT: 'UMEDIUMINT'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.DECIMAL256: 'DECIMAL256'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.DECIMAL64: 'DECIMAL64'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.BIGDECIMAL: 'BIGDECIMAL'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.DATE32: 'DATE32'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.TIME: 'TIME'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.UDOUBLE: 'UDOUBLE'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.DATETIME64: 'DATETIME64'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.TIMESTAMP_MS: 'TIMESTAMP_MS'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.TIMESTAMP_NS: 'TIMESTAMP_NS'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.MONEY: 'MONEY'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.DATETIME2: 'DATETIME2'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.UINT128: 'UINT128'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.USMALLINT: 'USMALLINT'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.SMALLMONEY: 'SMALLMONEY'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.TIMESTAMP_S: 'TIMESTAMP_S'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.DECIMAL128: 'DECIMAL128'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.SMALLDATETIME: 'SMALLDATETIME'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.UTINYINT: 'UTINYINT'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.UDECIMAL: 'UDECIMAL'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.TIMETZ: 'TIMETZ'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.BIT: 'BIT'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.UINT: 'UINT'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.DECIMAL32: 'DECIMAL32'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.UBIGINT: 'UBIGINT'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.MEDIUMINT: 'MEDIUMINT'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.INTERVAL: 'INTERVAL'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.INT128: 'INT128'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}, <Type.UINT256: 'UINT256'>: {<Type.NVARCHAR: 'NVARCHAR'>, <Type.TEXT: 'TEXT'>, <Type.VARCHAR: 'VARCHAR'>, <Type.NCHAR: 'NCHAR'>, <Type.NAME: 'NAME'>, <Type.CHAR: 'CHAR'>}})
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}}}
ESCAPED_SEQUENCES: Dict[str, str] =
{'\x07': '\\a', '\x08': '\\b', '\x0c': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t', '\x0b': '\\v', '\\': '\\\\'}
VALID_INTERVAL_UNITS: Set[str] =
{'MONTH', 'MICROSECS', 'MONTHS', 'QUARTERS', 'WEEKOFYEAR', 'TIMEZONE_MINUTE', 'D', 'MON', 'MSECOND', 'YEAR', 'DW', 'MILLISECON', 'TIMEZONE_HOUR', 'DOY', 'MS', 'C', 'MILLENIUM', 'NSEC', 'YEARS', 'WEEKOFYEAR_ISO', 'HOURS', 'NS', 'MICROSECOND', 'DECADES', 'M', 'SECONDS', 'EPOCH_SECONDS', 'MILLISECS', 'EPOCH_MILLISECONDS', 'EPOCH_SECOND', 'QUARTER', 'NANOSECS', 'WEEKOFYEARISO', 'YY', 'MSECONDS', 'YRS', 'WK', 'SECS', 'MILLISECONDS', 'WOY', 'WEEKDAY', 'TZH', 'YYY', 'WEEK_ISO', 'MINUTES', 'MSEC', 'DAYOFMONTH', 'NANOSEC', 'DEC', 'HR', 'MILLISECOND', 'MIN', 'MONS', 'QTRS', 'EPOCH_MICROSECONDS', 'H', 'DAY', 'SECOND', 'CENTS', 'EPOCH_MILLISECOND', 'US', 'MIL', 'MINUTE', 'DECADE', 'DAYOFYEAR', 'EPOCH_NANOSECOND', 'TZM', 'WEEKISO', 'DECS', 'S', 'WEEK', 'MICROSEC', 'MINS', 'YYYY', 'CENTURY', 'YR', 'USEC', 'CENTURIES', 'DAYOFWEEKISO', 'DAYOFWEEK', 'DAYS', 'WEEKDAY_ISO', 'Y', 'MM', 'SEC', 'DY', 'DOW', 'MI', 'CENT', 'USECS', 'EPOCH_MICROSECOND', 'Q', 'MILLISEC', 'EPOCH', 'QTR', 'DD', 'MILLENIA', 'DW_ISO', 'NSECOND', 'MICROSECONDS', 'W', 'USECONDS', 'DOW_ISO', 'EPOCH_NANOSECONDS', 'DAY OF YEAR', 'HOUR', 'NSECONDS', 'USECOND', 'MSECS', 'HH', 'HRS', 'NANOSECOND', 'WY', 'DAY OF WEEK', 'MILS'}
274 class Tokenizer(tokens.Tokenizer): 275 QUOTES = ["'", '"'] 276 IDENTIFIERS = ["`"] 277 STRING_ESCAPES = ["\\"] 278 279 SINGLE_TOKENS = { 280 **tokens.Tokenizer.SINGLE_TOKENS, 281 "$": TokenType.PARAMETER, 282 } 283 284 KEYWORDS = { 285 **tokens.Tokenizer.KEYWORDS, 286 "ADD ARCHIVE": TokenType.COMMAND, 287 "ADD ARCHIVES": TokenType.COMMAND, 288 "ADD FILE": TokenType.COMMAND, 289 "ADD FILES": TokenType.COMMAND, 290 "ADD JAR": TokenType.COMMAND, 291 "ADD JARS": TokenType.COMMAND, 292 "MINUS": TokenType.EXCEPT, 293 "MSCK REPAIR": TokenType.COMMAND, 294 "REFRESH": TokenType.REFRESH, 295 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 296 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 297 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 298 } 299 300 NUMERIC_LITERALS = { 301 "L": "BIGINT", 302 "S": "SMALLINT", 303 "Y": "TINYINT", 304 "D": "DOUBLE", 305 "F": "FLOAT", 306 "BD": "DECIMAL", 307 }
SINGLE_TOKENS =
{'(': <TokenType.L_PAREN: 'L_PAREN'>, ')': <TokenType.R_PAREN: 'R_PAREN'>, '[': <TokenType.L_BRACKET: 'L_BRACKET'>, ']': <TokenType.R_BRACKET: 'R_BRACKET'>, '{': <TokenType.L_BRACE: 'L_BRACE'>, '}': <TokenType.R_BRACE: 'R_BRACE'>, '&': <TokenType.AMP: 'AMP'>, '^': <TokenType.CARET: 'CARET'>, ':': <TokenType.COLON: 'COLON'>, ',': <TokenType.COMMA: 'COMMA'>, '.': <TokenType.DOT: 'DOT'>, '-': <TokenType.DASH: 'DASH'>, '=': <TokenType.EQ: 'EQ'>, '>': <TokenType.GT: 'GT'>, '<': <TokenType.LT: 'LT'>, '%': <TokenType.MOD: 'MOD'>, '!': <TokenType.NOT: 'NOT'>, '|': <TokenType.PIPE: 'PIPE'>, '+': <TokenType.PLUS: 'PLUS'>, ';': <TokenType.SEMICOLON: 'SEMICOLON'>, '/': <TokenType.SLASH: 'SLASH'>, '\\': <TokenType.BACKSLASH: 'BACKSLASH'>, '*': <TokenType.STAR: 'STAR'>, '~': <TokenType.TILDA: 'TILDA'>, '?': <TokenType.PLACEHOLDER: 'PLACEHOLDER'>, '@': <TokenType.PARAMETER: 'PARAMETER'>, '#': <TokenType.HASH: 'HASH'>, "'": <TokenType.UNKNOWN: 'UNKNOWN'>, '`': <TokenType.UNKNOWN: 'UNKNOWN'>, '"': <TokenType.UNKNOWN: 'UNKNOWN'>, '$': <TokenType.PARAMETER: 'PARAMETER'>}
KEYWORDS =
{'{%': <TokenType.BLOCK_START: 'BLOCK_START'>, '{%+': <TokenType.BLOCK_START: 'BLOCK_START'>, '{%-': <TokenType.BLOCK_START: 'BLOCK_START'>, '%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '+%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '-%}': <TokenType.BLOCK_END: 'BLOCK_END'>, '{{+': <TokenType.BLOCK_START: 'BLOCK_START'>, '{{-': <TokenType.BLOCK_START: 'BLOCK_START'>, '+}}': <TokenType.BLOCK_END: 'BLOCK_END'>, '-}}': <TokenType.BLOCK_END: 'BLOCK_END'>, '/*+': <TokenType.HINT: 'HINT'>, '==': <TokenType.EQ: 'EQ'>, '::': <TokenType.DCOLON: 'DCOLON'>, '||': <TokenType.DPIPE: 'DPIPE'>, '|>': <TokenType.PIPE_GT: 'PIPE_GT'>, '>=': <TokenType.GTE: 'GTE'>, '<=': <TokenType.LTE: 'LTE'>, '<>': <TokenType.NEQ: 'NEQ'>, '!=': <TokenType.NEQ: 'NEQ'>, ':=': <TokenType.COLON_EQ: 'COLON_EQ'>, '<=>': <TokenType.NULLSAFE_EQ: 'NULLSAFE_EQ'>, '->': <TokenType.ARROW: 'ARROW'>, '->>': <TokenType.DARROW: 'DARROW'>, '=>': <TokenType.FARROW: 'FARROW'>, '#>': <TokenType.HASH_ARROW: 'HASH_ARROW'>, '#>>': <TokenType.DHASH_ARROW: 'DHASH_ARROW'>, '<->': <TokenType.LR_ARROW: 'LR_ARROW'>, '&&': <TokenType.DAMP: 'DAMP'>, '??': <TokenType.DQMARK: 'DQMARK'>, '~~~': <TokenType.GLOB: 'GLOB'>, '~~': <TokenType.LIKE: 'LIKE'>, '~~*': <TokenType.ILIKE: 'ILIKE'>, '~*': <TokenType.IRLIKE: 'IRLIKE'>, 'ALL': <TokenType.ALL: 'ALL'>, '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'>, 'SESSION': <TokenType.SESSION: 'SESSION'>, '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'>, 'REVOKE': <TokenType.REVOKE: 'REVOKE'>, '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
309 class Parser(parser.Parser): 310 LOG_DEFAULTS_TO_LN = True 311 STRICT_CAST = False 312 VALUES_FOLLOWED_BY_PAREN = False 313 JOINS_HAVE_EQUAL_PRECEDENCE = True 314 ADD_JOIN_ON_TRUE = True 315 ALTER_TABLE_PARTITIONS = True 316 317 CHANGE_COLUMN_ALTER_SYNTAX = False 318 # Whether the dialect supports using ALTER COLUMN syntax with CHANGE COLUMN. 319 320 FUNCTIONS = { 321 **parser.Parser.FUNCTIONS, 322 "BASE64": exp.ToBase64.from_arg_list, 323 "COLLECT_LIST": lambda args: exp.ArrayAgg(this=seq_get(args, 0), nulls_excluded=True), 324 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 325 "DATE_ADD": lambda args: exp.TsOrDsAdd( 326 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 327 ), 328 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 329 [ 330 exp.TimeStrToTime(this=seq_get(args, 0)), 331 seq_get(args, 1), 332 ] 333 ), 334 "DATE_SUB": _build_date_add, 335 "DATEDIFF": lambda args: exp.DateDiff( 336 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 337 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 338 ), 339 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 340 "FIRST": _build_with_ignore_nulls(exp.First), 341 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 342 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 343 "GET_JSON_OBJECT": lambda args, dialect: exp.JSONExtractScalar( 344 this=seq_get(args, 0), expression=dialect.to_json_path(seq_get(args, 1)) 345 ), 346 "LAST": _build_with_ignore_nulls(exp.Last), 347 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 348 "MAP": parser.build_var_map, 349 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 350 "PERCENTILE": exp.Quantile.from_arg_list, 351 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 352 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 353 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 354 "SEQUENCE": exp.GenerateSeries.from_arg_list, 355 "SIZE": exp.ArraySize.from_arg_list, 356 "SPLIT": exp.RegexpSplit.from_arg_list, 357 "STR_TO_MAP": lambda args: exp.StrToMap( 358 this=seq_get(args, 0), 359 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 360 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 361 ), 362 "TO_DATE": _build_to_date, 363 "TO_JSON": exp.JSONFormat.from_arg_list, 364 "TRUNC": exp.TimestampTrunc.from_arg_list, 365 "UNBASE64": exp.FromBase64.from_arg_list, 366 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 367 args or [exp.CurrentTimestamp()] 368 ), 369 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 370 } 371 372 NO_PAREN_FUNCTION_PARSERS = { 373 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 374 "TRANSFORM": lambda self: self._parse_transform(), 375 } 376 377 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 378 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 379 380 PROPERTY_PARSERS = { 381 **parser.Parser.PROPERTY_PARSERS, 382 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 383 expressions=self._parse_wrapped_csv(self._parse_property) 384 ), 385 } 386 387 ALTER_PARSERS = { 388 **parser.Parser.ALTER_PARSERS, 389 "CHANGE": lambda self: self._parse_alter_table_change(), 390 } 391 392 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 393 if not self._match(TokenType.L_PAREN, advance=False): 394 self._retreat(self._index - 1) 395 return None 396 397 args = self._parse_wrapped_csv(self._parse_lambda) 398 row_format_before = self._parse_row_format(match_row=True) 399 400 record_writer = None 401 if self._match_text_seq("RECORDWRITER"): 402 record_writer = self._parse_string() 403 404 if not self._match(TokenType.USING): 405 return exp.Transform.from_arg_list(args) 406 407 command_script = self._parse_string() 408 409 self._match(TokenType.ALIAS) 410 schema = self._parse_schema() 411 412 row_format_after = self._parse_row_format(match_row=True) 413 record_reader = None 414 if self._match_text_seq("RECORDREADER"): 415 record_reader = self._parse_string() 416 417 return self.expression( 418 exp.QueryTransform, 419 expressions=args, 420 command_script=command_script, 421 schema=schema, 422 row_format_before=row_format_before, 423 record_writer=record_writer, 424 row_format_after=row_format_after, 425 record_reader=record_reader, 426 ) 427 428 def _parse_types( 429 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 430 ) -> t.Optional[exp.Expression]: 431 """ 432 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 433 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 434 435 spark-sql (default)> select cast(1234 as varchar(2)); 436 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 437 char/varchar type and simply treats them as string type. Please use string type 438 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 439 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 440 441 1234 442 Time taken: 4.265 seconds, Fetched 1 row(s) 443 444 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 445 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 446 447 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 448 """ 449 this = super()._parse_types( 450 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 451 ) 452 453 if this and not schema: 454 return this.transform( 455 lambda node: ( 456 node.replace(exp.DataType.build("text")) 457 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 458 else node 459 ), 460 copy=False, 461 ) 462 463 return this 464 465 def _parse_alter_table_change(self) -> t.Optional[exp.Expression]: 466 self._match(TokenType.COLUMN) 467 this = self._parse_field(any_token=True) 468 469 if self.CHANGE_COLUMN_ALTER_SYNTAX and self._match_text_seq("TYPE"): 470 return self.expression( 471 exp.AlterColumn, 472 this=this, 473 dtype=self._parse_types(schema=True), 474 ) 475 476 column_new = self._parse_field(any_token=True) 477 dtype = self._parse_types(schema=True) 478 479 comment = self._match(TokenType.COMMENT) and self._parse_string() 480 481 if not this or not column_new or not dtype: 482 self.raise_error( 483 "Expected 'CHANGE COLUMN' to be followed by 'column_name' 'column_name' 'data_type'" 484 ) 485 486 return self.expression( 487 exp.AlterColumn, 488 this=this, 489 rename_to=column_new, 490 dtype=dtype, 491 comment=comment, 492 ) 493 494 def _parse_partition_and_order( 495 self, 496 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 497 return ( 498 ( 499 self._parse_csv(self._parse_assignment) 500 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 501 else [] 502 ), 503 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 504 ) 505 506 def _parse_parameter(self) -> exp.Parameter: 507 self._match(TokenType.L_BRACE) 508 this = self._parse_identifier() or self._parse_primary_or_var() 509 expression = self._match(TokenType.COLON) and ( 510 self._parse_identifier() or self._parse_primary_or_var() 511 ) 512 self._match(TokenType.R_BRACE) 513 return self.expression(exp.Parameter, this=this, expression=expression) 514 515 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 516 if expression.is_star: 517 return expression 518 519 if isinstance(expression, exp.Column): 520 key = expression.this 521 else: 522 key = exp.to_identifier(f"col{index + 1}") 523 524 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 =
{'AI_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AIAgg'>>, 'AI_CLASSIFY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AIClassify'>>, 'AI_SUMMARIZE_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.AISummarizeAgg'>>, 'ABS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Abs'>>, 'ACOS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Acos'>>, 'ACOSH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Acosh'>>, '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_QUANTILES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxQuantiles'>>, 'APPROX_TOP_K': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxTopK'>>, 'APPROX_TOP_SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ApproxTopSum'>>, '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_FIRST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayFirst'>>, 'ARRAY_INTERSECT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayIntersect'>>, 'ARRAY_INTERSECTION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayIntersect'>>, 'ARRAY_LAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayLast'>>, 'ARRAY_OVERLAPS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayOverlaps'>>, 'ARRAY_REMOVE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayRemove'>>, 'ARRAY_REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayReverse'>>, '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_SLICE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArraySlice'>>, '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'>>, 'ASCII': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ascii'>>, 'ASIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Asin'>>, 'ASINH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Asinh'>>, 'ATAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Atan'>>, 'ATAN2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Atan2'>>, 'ATANH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Atanh'>>, 'AVG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Avg'>>, 'BASE64_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Base64DecodeBinary'>>, 'BASE64_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Base64DecodeString'>>, 'BASE64_ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Base64Encode'>>, 'BIT_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitLength'>>, 'BITWISE_AND_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseAndAgg'>>, 'BITWISE_COUNT_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseCountAgg'>>, 'BITWISE_OR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseOrAgg'>>, 'BITWISE_XOR_AGG': <bound method Func.from_arg_list of <class 'sqlglot.expressions.BitwiseXorAgg'>>, 'BYTE_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ByteLength'>>, '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>, 'CODE_POINTS_TO_BYTES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CodePointsToBytes'>>, 'CODE_POINTS_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CodePointsToString'>>, 'COLLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Collate'>>, 'COLLATION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Collation'>>, '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'>>, 'COMPRESS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Compress'>>, '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'>>, 'COS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cos'>>, 'COSH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cosh'>>, 'COSINE_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CosineDistance'>>, 'COT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Cot'>>, 'COTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Coth'>>, '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'>>, 'CSC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Csc'>>, 'CSCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Csch'>>, 'CUME_DIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CumeDist'>>, 'CURRENT_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentDate'>>, 'CURRENT_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentDatetime'>>, 'CURRENT_SCHEMA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentSchema'>>, 'CURRENT_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTime'>>, 'CURRENT_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTimestamp'>>, 'CURRENT_TIMESTAMP_L_T_Z': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentTimestampLTZ'>>, 'CURRENT_USER': <bound method Func.from_arg_list of <class 'sqlglot.expressions.CurrentUser'>>, 'DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Date'>>, 'DATE_ADD': <function Hive.Parser.<lambda>>, 'DATE_BIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateBin'>>, 'DATEDIFF': <function Hive.Parser.<lambda>>, 'DATE_DIFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateDiff'>>, 'DATE_FROM_PARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromParts'>>, 'DATEFROMPARTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromParts'>>, 'DATE_FROM_UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateFromUnixDate'>>, 'DATE_STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DateStrToDate'>>, 'DATE_SUB': <function _build_date_add>, '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'>>, 'DECODE_CASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DecodeCase'>>, 'DECOMPRESS_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DecompressBinary'>>, 'DECOMPRESS_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DecompressString'>>, 'DEGREES': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Degrees'>>, 'DENSE_RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DenseRank'>>, 'DI_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.DiToDate'>>, 'ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Encode'>>, 'ENDS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.EndsWith'>>, 'ENDSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.EndsWith'>>, 'EUCLIDEAN_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.EuclideanDistance'>>, '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'>>, 'FACTORIAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Factorial'>>, 'FARM_FINGERPRINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FarmFingerprint'>>, 'FARMFINGERPRINT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FarmFingerprint'>>, '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'>>, 'FLOAT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Float64'>>, 'FLOOR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Floor'>>, 'FORMAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Format'>>, 'FROM_BASE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase'>>, 'FROM_BASE32': <bound method Func.from_arg_list of <class 'sqlglot.expressions.FromBase32'>>, '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_EMBEDDING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GenerateEmbedding'>>, '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'>>, 'GET_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.GetExtract'>>, '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'>>, 'GROUPING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Grouping'>>, 'HEX': <function build_hex>, 'HEX_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.HexDecodeString'>>, 'HEX_ENCODE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.HexEncode'>>, '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_APPEND': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayAppend'>>, 'JSON_ARRAY_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayContains'>>, 'JSON_ARRAY_INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONArrayInsert'>>, 'JSONB_CONTAINS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBContains'>>, 'J_S_O_N_B_CONTAINS_ALL_TOP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBContainsAllTopKeys'>>, 'J_S_O_N_B_CONTAINS_ANY_TOP_KEYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBContainsAnyTopKeys'>>, 'J_S_O_N_B_DELETE_AT_PATH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBDeleteAtPath'>>, '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_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONBool'>>, '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_KEYS_AT_DEPTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONKeysAtDepth'>>, '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'>>, 'JSON_REMOVE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONRemove'>>, 'JSON_SET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONSet'>>, 'JSON_STRIP_NULLS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONStripNulls'>>, 'J_S_O_N_TABLE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONTable'>>, 'JSON_TYPE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONType'>>, 'J_S_O_N_VALUE_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONValueArray'>>, 'JAROWINKLER_SIMILARITY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JarowinklerSimilarity'>>, 'JUSTIFY_DAYS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JustifyDays'>>, 'JUSTIFY_HOURS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JustifyHours'>>, 'JUSTIFY_INTERVAL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JustifyInterval'>>, '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>, 'LAX_BOOL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LaxBool'>>, 'LAX_FLOAT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LaxFloat64'>>, 'LAX_INT64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LaxInt64'>>, 'LAX_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.LaxString'>>, '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'>>, 'M_D5_NUMBER_LOWER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5NumberLower64'>>, 'M_D5_NUMBER_UPPER64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MD5NumberUpper64'>>, 'M_L_FORECAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MLForecast'>>, 'M_L_TRANSLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.MLTranslate'>>, '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'>>, 'NTILE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Ntile'>>, '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_BIGNUMERIC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseBignumeric'>>, 'PARSE_DATETIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseDatetime'>>, 'PARSE_IP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseIp'>>, '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'>>, 'PARSE_NUMERIC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseNumeric'>>, 'PARSE_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseTime'>>, 'PARSE_URL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ParseUrl'>>, 'PERCENT_RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.PercentRank'>>, '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_BUCKET': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RangeBucket'>>, 'RANGE_N': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RangeN'>>, 'RANK': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Rank'>>, '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_COUNT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpCount'>>, 'REGEXP_EXTRACT': <function build_regexp_extract.<locals>._builder>, 'REGEXP_EXTRACT_ALL': <function build_regexp_extract.<locals>._builder>, 'REGEXP_FULL_MATCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpFullMatch'>>, 'REGEXP_I_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpILike'>>, 'REGEXP_INSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpInstr'>>, 'REGEXP_LIKE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpLike'>>, 'REGEXP_REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpReplace'>>, 'REGEXP_SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpSplit'>>, 'REPEAT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Repeat'>>, 'REPLACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Replace'>>, 'REVERSE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Reverse'>>, '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'>>, 'RTRIMMED_LENGTH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RtrimmedLength'>>, 'SHA': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'SHA1': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA'>>, 'S_H_A1_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA1Digest'>>, 'SHA2': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA2'>>, 'S_H_A2_DIGEST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SHA2Digest'>>, 'SAFE_ADD': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeAdd'>>, 'SAFE_CONVERT_BYTES_TO_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeConvertBytesToString'>>, 'SAFE_DIVIDE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeDivide'>>, 'SAFE_MULTIPLY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeMultiply'>>, 'SAFE_NEGATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeNegate'>>, 'SAFE_SUBTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SafeSubtract'>>, 'SEARCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Search'>>, 'SEC': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sec'>>, 'SECH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sech'>>, 'SIGN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SIGNUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sign'>>, 'SIN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sin'>>, 'SINH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sinh'>>, 'SORT_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SortArray'>>, 'SOUNDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Soundex'>>, 'SOUNDEX_P123': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SoundexP123'>>, 'SPACE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Space'>>, 'SPLIT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.RegexpSplit'>>, 'SPLIT_PART': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SplitPart'>>, 'SQRT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sqrt'>>, 'ST_DISTANCE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StDistance'>>, 'ST_POINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StPoint'>>, 'ST_MAKEPOINT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StPoint'>>, 'STANDARD_HASH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StandardHash'>>, 'STAR_MAP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StarMap'>>, 'STARTS_WITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STARTSWITH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StartsWith'>>, 'STDDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDEV': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stddev'>>, 'STDDEV_POP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevPop'>>, 'STDDEV_SAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StddevSamp'>>, 'STR_POSITION': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrPosition'>>, 'STR_TO_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToDate'>>, 'STR_TO_MAP': <function Hive.Parser.<lambda>>, 'STR_TO_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToTime'>>, 'STR_TO_UNIX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StrToUnix'>>, 'STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.String'>>, 'STRING_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'SPLIT_BY_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'STRTOK_TO_ARRAY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StringToArray'>>, 'STRUCT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Struct'>>, 'STRUCT_EXTRACT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.StructExtract'>>, 'STUFF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'INSERT': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Stuff'>>, 'SUBSTRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Substring'>>, 'SUBSTR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Substring'>>, 'SUBSTRING_INDEX': <bound method Func.from_arg_list of <class 'sqlglot.expressions.SubstringIndex'>>, 'SUM': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Sum'>>, 'TAN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Tan'>>, '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_BASE32': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToBase32'>>, '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_CODE_POINTS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToCodePoints'>>, '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'>>, 'TRANSLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Translate'>>, '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_BASE64_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryBase64DecodeBinary'>>, 'TRY_BASE64_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryBase64DecodeString'>>, 'TRY_CAST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryCast'>>, 'TRY_HEX_DECODE_BINARY': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryHexDecodeBinary'>>, 'TRY_HEX_DECODE_STRING': <bound method Func.from_arg_list of <class 'sqlglot.expressions.TryHexDecodeString'>>, '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'>>, 'TYPEOF': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Typeof'>>, '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_MICROS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixMicros'>>, 'UNIX_MILLIS': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixMillis'>>, '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'>>, 'UTC_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UtcDate'>>, 'UTC_TIME': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UtcTime'>>, 'UTC_TIMESTAMP': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UtcTimestamp'>>, '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'>>, 'VECTOR_SEARCH': <bound method Func.from_arg_list of <class 'sqlglot.expressions.VectorSearch'>>, '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>, '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>>}
ALTER_PARSERS =
{'ADD': <function Parser.<lambda>>, 'AS': <function Parser.<lambda>>, 'ALTER': <function Parser.<lambda>>, 'CLUSTER BY': <function Parser.<lambda>>, 'DELETE': <function Parser.<lambda>>, 'DROP': <function Parser.<lambda>>, 'RENAME': <function Parser.<lambda>>, 'SET': <function Parser.<lambda>>, 'SWAP': <function Parser.<lambda>>, 'CHANGE': <function Hive.Parser.<lambda>>}
ID_VAR_TOKENS =
{<TokenType.RIGHT: 'RIGHT'>, <TokenType.INDEX: 'INDEX'>, <TokenType.POINT: 'POINT'>, <TokenType.INT256: 'INT256'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.DATE32: 'DATE32'>, <TokenType.TABLE: 'TABLE'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.YEAR: 'YEAR'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.CHAR: 'CHAR'>, <TokenType.COPY: 'COPY'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.ENUM: 'ENUM'>, <TokenType.NESTED: 'NESTED'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.FILTER: 'FILTER'>, <TokenType.IPV6: 'IPV6'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.MONEY: 'MONEY'>, <TokenType.RANGE: 'RANGE'>, <TokenType.LOAD: 'LOAD'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.MODEL: 'MODEL'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.CACHE: 'CACHE'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.NATURAL: 'NATURAL'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.FULL: 'FULL'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.LEFT: 'LEFT'>, <TokenType.INT128: 'INT128'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.IPV4: 'IPV4'>, <TokenType.MAP: 'MAP'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.APPLY: 'APPLY'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.USE: 'USE'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.TIME: 'TIME'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.KEEP: 'KEEP'>, <TokenType.TOP: 'TOP'>, <TokenType.DATE: 'DATE'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.GEOGRAPHYPOINT: 'GEOGRAPHYPOINT'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.LIST: 'LIST'>, <TokenType.RING: 'RING'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.SHOW: 'SHOW'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.RENAME: 'RENAME'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.VOID: 'VOID'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.SUPER: 'SUPER'>, <TokenType.SEMI: 'SEMI'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.END: 'END'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.INT: 'INT'>, <TokenType.STAGE: 'STAGE'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.ALL: 'ALL'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.DIV: 'DIV'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.MERGE: 'MERGE'>, <TokenType.FALSE: 'FALSE'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.TRUE: 'TRUE'>, <TokenType.NAME: 'NAME'>, <TokenType.NULL: 'NULL'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.NEXT: 'NEXT'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.JSON: 'JSON'>, <TokenType.SINK: 'SINK'>, <TokenType.LOCK: 'LOCK'>, <TokenType.TEXT: 'TEXT'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.SOME: 'SOME'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.KILL: 'KILL'>, <TokenType.SESSION: 'SESSION'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.ASC: 'ASC'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.UINT128: 'UINT128'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.VAR: 'VAR'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.ROWS: 'ROWS'>, <TokenType.SET: 'SET'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.ANY: 'ANY'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.ASOF: 'ASOF'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.BIT: 'BIT'>, <TokenType.UINT: 'UINT'>, <TokenType.SEMANTIC_VIEW: 'SEMANTIC_VIEW'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.JSONB: 'JSONB'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.ANTI: 'ANTI'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.DESC: 'DESC'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.UINT256: 'UINT256'>, <TokenType.IS: 'IS'>, <TokenType.TAG: 'TAG'>, <TokenType.ROW: 'ROW'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.CASE: 'CASE'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.DELETE: 'DELETE'>, <TokenType.FIRST: 'FIRST'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.FINAL: 'FINAL'>, <TokenType.INET: 'INET'>, <TokenType.GET: 'GET'>, <TokenType.DETACH: 'DETACH'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.VIEW: 'VIEW'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.XML: 'XML'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.CUBE: 'CUBE'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.UUID: 'UUID'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.FILE_FORMAT: 'FILE_FORMAT'>, <TokenType.BLOB: 'BLOB'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.BINARY: 'BINARY'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.PUT: 'PUT'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.COMMENT: 'COMMENT'>}
TABLE_ALIAS_TOKENS =
{<TokenType.INDEX: 'INDEX'>, <TokenType.POINT: 'POINT'>, <TokenType.INT256: 'INT256'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.DATE32: 'DATE32'>, <TokenType.TABLE: 'TABLE'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.YEAR: 'YEAR'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.CHAR: 'CHAR'>, <TokenType.COPY: 'COPY'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.NOTHING: 'NOTHING'>, <TokenType.ENUM: 'ENUM'>, <TokenType.NESTED: 'NESTED'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.FILTER: 'FILTER'>, <TokenType.IPV6: 'IPV6'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.MONEY: 'MONEY'>, <TokenType.RANGE: 'RANGE'>, <TokenType.LOAD: 'LOAD'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.MODEL: 'MODEL'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.CACHE: 'CACHE'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.INT128: 'INT128'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.IPV4: 'IPV4'>, <TokenType.MAP: 'MAP'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.APPLY: 'APPLY'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.USE: 'USE'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.TIME: 'TIME'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.KEEP: 'KEEP'>, <TokenType.TOP: 'TOP'>, <TokenType.DATE: 'DATE'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.GEOGRAPHYPOINT: 'GEOGRAPHYPOINT'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.LIST: 'LIST'>, <TokenType.RING: 'RING'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.SHOW: 'SHOW'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.RENAME: 'RENAME'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.VOID: 'VOID'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.SUPER: 'SUPER'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.END: 'END'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.INT: 'INT'>, <TokenType.STAGE: 'STAGE'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.ALL: 'ALL'>, <TokenType.DIV: 'DIV'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.MERGE: 'MERGE'>, <TokenType.FALSE: 'FALSE'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.TRUE: 'TRUE'>, <TokenType.NAME: 'NAME'>, <TokenType.NULL: 'NULL'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.NEXT: 'NEXT'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.JSON: 'JSON'>, <TokenType.SINK: 'SINK'>, <TokenType.TEXT: 'TEXT'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.SOME: 'SOME'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.KILL: 'KILL'>, <TokenType.SESSION: 'SESSION'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.ASC: 'ASC'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.UINT128: 'UINT128'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.VAR: 'VAR'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.ROWS: 'ROWS'>, <TokenType.SET: 'SET'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.ANY: 'ANY'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.BIT: 'BIT'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.UINT: 'UINT'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.SEMANTIC_VIEW: 'SEMANTIC_VIEW'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.JSONB: 'JSONB'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.DESC: 'DESC'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.UINT256: 'UINT256'>, <TokenType.IS: 'IS'>, <TokenType.TAG: 'TAG'>, <TokenType.ROW: 'ROW'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.CASE: 'CASE'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.DELETE: 'DELETE'>, <TokenType.FIRST: 'FIRST'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.FINAL: 'FINAL'>, <TokenType.INET: 'INET'>, <TokenType.GET: 'GET'>, <TokenType.DETACH: 'DETACH'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.VIEW: 'VIEW'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.XML: 'XML'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.CUBE: 'CUBE'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.UUID: 'UUID'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.FILE_FORMAT: 'FILE_FORMAT'>, <TokenType.BLOB: 'BLOB'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.BINARY: 'BINARY'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.PUT: 'PUT'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.COMMENT: 'COMMENT'>}
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
- CAST_COLUMN_OPERATORS
- EXPRESSION_PARSERS
- STATEMENT_PARSERS
- UNARY_PARSERS
- STRING_PARSERS
- NUMERIC_PARSERS
- PRIMARY_PARSERS
- PLACEHOLDER_PARSERS
- RANGE_PARSERS
- PIPE_SYNTAX_TRANSFORM_PARSERS
- CONSTRAINT_PARSERS
- ALTER_ALTER_PARSERS
- SCHEMA_UNNAMED_CONSTRAINTS
- INVALID_FUNC_NAME_TOKENS
- FUNCTIONS_WITH_ALIASED_ARGS
- KEY_VALUE_DEFINITIONS
- FUNCTION_PARSERS
- QUERY_MODIFIER_PARSERS
- QUERY_MODIFIER_TOKENS
- 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
- UNNEST_OFFSET_ALIAS_TOKENS
- SELECT_START_TOKENS
- COPY_INTO_VARLEN_OPTIONS
- IS_JSON_PREDICATE_KIND
- ODBC_DATETIME_LITERALS
- ON_CONDITION_TOKENS
- PRIVILEGE_FOLLOW_TOKENS
- DESCRIBE_STYLES
- ANALYZE_STYLES
- ANALYZE_EXPRESSION_PARSERS
- PARTITION_KEYWORDS
- AMBIGUOUS_ALIAS_TOKENS
- OPERATION_MODIFIERS
- RECURSIVE_CTE_SEARCH_KIND
- MODIFIABLES
- PREFIXED_PIVOT_COLUMNS
- IDENTIFY_PIVOT_STRINGS
- TABLESAMPLE_CSV
- DEFAULT_SAMPLING_METHOD
- SET_REQUIRES_ASSIGNMENT_DELIMITER
- TRIM_PATTERN_FIRST
- STRING_ALIASES
- MODIFIERS_ATTACHED_TO_SET_OP
- SET_OP_MODIFIERS
- NO_PAREN_IF_COMMANDS
- JSON_ARROWS_REQUIRE_JSON_TYPE
- COLON_IS_VARIANT_EXTRACT
- SUPPORTS_IMPLICIT_UNNEST
- INTERVAL_SPANS
- SUPPORTS_PARTITION_SELECTION
- WRAPPED_TRANSFORM_COLUMN_CONSTRAINT
- OPTIONAL_ALIAS_TOKEN_CTE
- ALTER_RENAME_REQUIRES_COLUMN
- ZONE_AWARE_TIMESTAMP_CONSTRUCTOR
- MAP_KEYS_ARE_ARBITRARY_EXPRESSIONS
- JSON_EXTRACT_REQUIRES_JSON_EXPRESSION
- SUPPORTS_OMITTED_INTERVAL_SPAN_UNIT
- error_level
- error_message_context
- max_errors
- dialect
- reset
- parse
- parse_into
- check_errors
- raise_error
- expression
- validate_expression
- parse_set_operation
- build_cast
- errors
- sql
526 class Generator(generator.Generator): 527 LIMIT_FETCH = "LIMIT" 528 TABLESAMPLE_WITH_METHOD = False 529 JOIN_HINTS = False 530 TABLE_HINTS = False 531 QUERY_HINTS = False 532 INDEX_ON = "ON TABLE" 533 EXTRACT_ALLOWS_QUOTES = False 534 NVL2_SUPPORTED = False 535 LAST_DAY_SUPPORTS_DATE_PART = False 536 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 537 SUPPORTS_TO_NUMBER = False 538 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 539 PARSE_JSON_NAME: t.Optional[str] = None 540 PAD_FILL_PATTERN_IS_REQUIRED = True 541 SUPPORTS_MEDIAN = False 542 ARRAY_SIZE_NAME = "SIZE" 543 ALTER_SET_TYPE = "" 544 545 EXPRESSIONS_WITHOUT_NESTED_CTES = { 546 exp.Insert, 547 exp.Select, 548 exp.Subquery, 549 exp.SetOperation, 550 } 551 552 SUPPORTED_JSON_PATH_PARTS = { 553 exp.JSONPathKey, 554 exp.JSONPathRoot, 555 exp.JSONPathSubscript, 556 exp.JSONPathWildcard, 557 } 558 559 TYPE_MAPPING = { 560 **generator.Generator.TYPE_MAPPING, 561 exp.DataType.Type.BIT: "BOOLEAN", 562 exp.DataType.Type.BLOB: "BINARY", 563 exp.DataType.Type.DATETIME: "TIMESTAMP", 564 exp.DataType.Type.ROWVERSION: "BINARY", 565 exp.DataType.Type.TEXT: "STRING", 566 exp.DataType.Type.TIME: "TIMESTAMP", 567 exp.DataType.Type.TIMESTAMPNTZ: "TIMESTAMP", 568 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 569 exp.DataType.Type.UTINYINT: "SMALLINT", 570 exp.DataType.Type.VARBINARY: "BINARY", 571 } 572 573 TRANSFORMS = { 574 **generator.Generator.TRANSFORMS, 575 exp.Property: property_sql, 576 exp.AnyValue: rename_func("FIRST"), 577 exp.ApproxDistinct: approx_count_distinct_sql, 578 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 579 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 580 exp.ArrayConcat: rename_func("CONCAT"), 581 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 582 exp.ArraySort: _array_sort_sql, 583 exp.With: no_recursive_cte_sql, 584 exp.DateAdd: _add_date_sql, 585 exp.DateDiff: _date_diff_sql, 586 exp.DateStrToDate: datestrtodate_sql, 587 exp.DateSub: _add_date_sql, 588 exp.DateToDi: lambda self, 589 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 590 exp.DiToDate: lambda self, 591 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 592 exp.StorageHandlerProperty: lambda self, e: f"STORED BY {self.sql(e, 'this')}", 593 exp.FromBase64: rename_func("UNBASE64"), 594 exp.GenerateSeries: sequence_sql, 595 exp.GenerateDateArray: sequence_sql, 596 exp.If: if_sql(), 597 exp.ILike: no_ilike_sql, 598 exp.IntDiv: lambda self, e: self.binary(e, "DIV"), 599 exp.IsNan: rename_func("ISNAN"), 600 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 601 exp.JSONExtractScalar: lambda self, e: self.func( 602 "GET_JSON_OBJECT", e.this, e.expression 603 ), 604 exp.JSONFormat: _json_format_sql, 605 exp.Left: left_to_substring_sql, 606 exp.Map: var_map_sql, 607 exp.Max: max_or_greatest, 608 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 609 exp.Min: min_or_least, 610 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 611 exp.NotNullColumnConstraint: lambda _, e: ( 612 "" if e.args.get("allow_null") else "NOT NULL" 613 ), 614 exp.VarMap: var_map_sql, 615 exp.Create: preprocess( 616 [ 617 remove_unique_constraints, 618 ctas_with_tmp_tables_to_create_tmp_view, 619 move_schema_columns_to_partitioned_by, 620 ] 621 ), 622 exp.Quantile: rename_func("PERCENTILE"), 623 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 624 exp.RegexpExtract: regexp_extract_sql, 625 exp.RegexpExtractAll: regexp_extract_sql, 626 exp.RegexpReplace: regexp_replace_sql, 627 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 628 exp.RegexpSplit: rename_func("SPLIT"), 629 exp.Right: right_to_substring_sql, 630 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 631 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 632 exp.Split: lambda self, e: self.func( 633 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 634 ), 635 exp.Select: transforms.preprocess( 636 [ 637 transforms.eliminate_qualify, 638 transforms.eliminate_distinct_on, 639 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 640 transforms.any_to_exists, 641 ] 642 ), 643 exp.StrPosition: lambda self, e: strposition_sql( 644 self, e, func_name="LOCATE", supports_position=True 645 ), 646 exp.StrToDate: _str_to_date_sql, 647 exp.StrToTime: _str_to_time_sql, 648 exp.StrToUnix: _str_to_unix_sql, 649 exp.StructExtract: struct_extract_sql, 650 exp.StarMap: rename_func("MAP"), 651 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 652 exp.TimeStrToDate: rename_func("TO_DATE"), 653 exp.TimeStrToTime: timestrtotime_sql, 654 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 655 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 656 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 657 exp.ToBase64: rename_func("BASE64"), 658 exp.TsOrDiToDi: lambda self, 659 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 660 exp.TsOrDsAdd: _add_date_sql, 661 exp.TsOrDsDiff: _date_diff_sql, 662 exp.TsOrDsToDate: _to_date_sql, 663 exp.TryCast: no_trycast_sql, 664 exp.Unicode: rename_func("ASCII"), 665 exp.UnixToStr: lambda self, e: self.func( 666 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 667 ), 668 exp.UnixToTime: _unix_to_time_sql, 669 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 670 exp.Unnest: rename_func("EXPLODE"), 671 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 672 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 673 exp.National: lambda self, e: self.national_sql(e, prefix=""), 674 exp.ClusteredColumnConstraint: lambda self, 675 e: f"({self.expressions(e, 'this', indent=False)})", 676 exp.NonClusteredColumnConstraint: lambda self, 677 e: f"({self.expressions(e, 'this', indent=False)})", 678 exp.NotForReplicationColumnConstraint: lambda *_: "", 679 exp.OnProperty: lambda *_: "", 680 exp.PartitionedByBucket: lambda self, e: self.func("BUCKET", e.expression, e.this), 681 exp.PartitionByTruncate: lambda self, e: self.func("TRUNCATE", e.expression, e.this), 682 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 683 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 684 exp.DayOfMonth: rename_func("DAYOFMONTH"), 685 exp.DayOfWeek: rename_func("DAYOFWEEK"), 686 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 687 rename_func("LEVENSHTEIN") 688 ), 689 } 690 691 PROPERTIES_LOCATION = { 692 **generator.Generator.PROPERTIES_LOCATION, 693 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 694 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 695 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 696 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 697 } 698 699 TS_OR_DS_EXPRESSIONS: t.Tuple[t.Type[exp.Expression], ...] = ( 700 exp.DateDiff, 701 exp.Day, 702 exp.Month, 703 exp.Year, 704 ) 705 706 def unnest_sql(self, expression: exp.Unnest) -> str: 707 return rename_func("EXPLODE")(self, expression) 708 709 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 710 if isinstance(expression.this, exp.JSONPathWildcard): 711 self.unsupported("Unsupported wildcard in JSONPathKey expression") 712 return "" 713 714 return super()._jsonpathkey_sql(expression) 715 716 def parameter_sql(self, expression: exp.Parameter) -> str: 717 this = self.sql(expression, "this") 718 expression_sql = self.sql(expression, "expression") 719 720 parent = expression.parent 721 this = f"{this}:{expression_sql}" if expression_sql else this 722 723 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 724 # We need to produce SET key = value instead of SET ${key} = value 725 return this 726 727 return f"${{{this}}}" 728 729 def schema_sql(self, expression: exp.Schema) -> str: 730 for ordered in expression.find_all(exp.Ordered): 731 if ordered.args.get("desc") is False: 732 ordered.set("desc", None) 733 734 return super().schema_sql(expression) 735 736 def constraint_sql(self, expression: exp.Constraint) -> str: 737 for prop in list(expression.find_all(exp.Properties)): 738 prop.pop() 739 740 this = self.sql(expression, "this") 741 expressions = self.expressions(expression, sep=" ", flat=True) 742 return f"CONSTRAINT {this} {expressions}" 743 744 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 745 serde_props = self.sql(expression, "serde_properties") 746 serde_props = f" {serde_props}" if serde_props else "" 747 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 748 749 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 750 return self.func( 751 "COLLECT_LIST", 752 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 753 ) 754 755 def datatype_sql(self, expression: exp.DataType) -> str: 756 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 757 not expression.expressions or expression.expressions[0].name == "MAX" 758 ): 759 expression = exp.DataType.build("text") 760 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 761 expression.set("this", exp.DataType.Type.VARCHAR) 762 elif expression.this in exp.DataType.TEMPORAL_TYPES: 763 expression = exp.DataType.build(expression.this) 764 elif expression.is_type("float"): 765 size_expression = expression.find(exp.DataTypeParam) 766 if size_expression: 767 size = int(size_expression.name) 768 expression = ( 769 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 770 ) 771 772 return super().datatype_sql(expression) 773 774 def version_sql(self, expression: exp.Version) -> str: 775 sql = super().version_sql(expression) 776 return sql.replace("FOR ", "", 1) 777 778 def struct_sql(self, expression: exp.Struct) -> str: 779 values = [] 780 781 for i, e in enumerate(expression.expressions): 782 if isinstance(e, exp.PropertyEQ): 783 self.unsupported("Hive does not support named structs.") 784 values.append(e.expression) 785 else: 786 values.append(e) 787 788 return self.func("STRUCT", *values) 789 790 def columndef_sql(self, expression: exp.ColumnDef, sep: str = " ") -> str: 791 return super().columndef_sql( 792 expression, 793 sep=( 794 ": " 795 if isinstance(expression.parent, exp.DataType) 796 and expression.parent.is_type("struct") 797 else sep 798 ), 799 ) 800 801 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 802 this = self.sql(expression, "this") 803 new_name = self.sql(expression, "rename_to") or this 804 dtype = self.sql(expression, "dtype") 805 comment = ( 806 f" COMMENT {self.sql(expression, 'comment')}" 807 if self.sql(expression, "comment") 808 else "" 809 ) 810 default = self.sql(expression, "default") 811 visible = expression.args.get("visible") 812 allow_null = expression.args.get("allow_null") 813 drop = expression.args.get("drop") 814 815 if any([default, drop, visible, allow_null, drop]): 816 self.unsupported("Unsupported CHANGE COLUMN syntax") 817 818 if not dtype: 819 self.unsupported("CHANGE COLUMN without a type is not supported") 820 821 return f"CHANGE COLUMN {this} {new_name} {dtype}{comment}" 822 823 def renamecolumn_sql(self, expression: exp.RenameColumn) -> str: 824 self.unsupported("Cannot rename columns without data type defined in Hive") 825 return "" 826 827 def alterset_sql(self, expression: exp.AlterSet) -> str: 828 exprs = self.expressions(expression, flat=True) 829 exprs = f" {exprs}" if exprs else "" 830 location = self.sql(expression, "location") 831 location = f" LOCATION {location}" if location else "" 832 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 833 file_format = f" FILEFORMAT {file_format}" if file_format else "" 834 serde = self.sql(expression, "serde") 835 serde = f" SERDE {serde}" if serde else "" 836 tags = self.expressions(expression, key="tag", flat=True, sep="") 837 tags = f" TAGS {tags}" if tags else "" 838 839 return f"SET{serde}{exprs}{location}{file_format}{tags}" 840 841 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 842 prefix = "WITH " if expression.args.get("with") else "" 843 exprs = self.expressions(expression, flat=True) 844 845 return f"{prefix}SERDEPROPERTIES ({exprs})" 846 847 def exists_sql(self, expression: exp.Exists) -> str: 848 if expression.expression: 849 return self.function_fallback_sql(expression) 850 851 return super().exists_sql(expression) 852 853 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 854 this = expression.this 855 if isinstance(this, exp.TimeStrToTime): 856 this = this.this 857 858 return self.func("DATE_FORMAT", this, self.format_time(expression)) 859 860 def fileformatproperty_sql(self, expression: exp.FileFormatProperty) -> str: 861 if isinstance(expression.this, exp.InputOutputFormat): 862 this = self.sql(expression, "this") 863 else: 864 this = expression.name.upper() 865 866 return f"STORED AS {this}"
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.SetOperation'>, <class 'sqlglot.expressions.Select'>, <class 'sqlglot.expressions.Insert'>}
SUPPORTED_JSON_PATH_PARTS =
{<class 'sqlglot.expressions.JSONPathSubscript'>, <class 'sqlglot.expressions.JSONPathRoot'>, <class 'sqlglot.expressions.JSONPathKey'>, <class 'sqlglot.expressions.JSONPathWildcard'>}
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.JSONBContainsAnyTopKeys'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.JSONBContainsAllTopKeys'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.JSONBDeleteAtPath'>: <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.PositionalColumn'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ProjectionPolicyColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Put'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.RemoteWithConnectionModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ReturnsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SampleProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SecureProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SecurityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SetConfigProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SetProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SettingsProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SharingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SqlReadWriteProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SqlSecurityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StabilityProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Stream'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StreamingTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.StrictProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.SwapTable'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TableColumn'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Tags'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TemporaryProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TitleColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ToMap'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.ToTableProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TransformModelProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TransientProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Union'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UnloggedProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UsingTemplateProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UsingData'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Uuid'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UppercaseColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UtcDate'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UtcTime'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UtcTimestamp'>: <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.WeekStart'>: <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.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.StorageHandlerProperty'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.FromBase64'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.GenerateSeries'>: <function sequence_sql>, <class 'sqlglot.expressions.GenerateDateArray'>: <function sequence_sql>, <class 'sqlglot.expressions.If'>: <function if_sql.<locals>._if_sql>, <class 'sqlglot.expressions.ILike'>: <function no_ilike_sql>, <class 'sqlglot.expressions.IntDiv'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.IsNan'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.JSONExtract'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.JSONExtractScalar'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.JSONFormat'>: <function _json_format_sql>, <class 'sqlglot.expressions.Left'>: <function left_to_substring_sql>, <class 'sqlglot.expressions.Map'>: <function var_map_sql>, <class 'sqlglot.expressions.Max'>: <function max_or_greatest>, <class 'sqlglot.expressions.MD5Digest'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.Min'>: <function min_or_least>, <class 'sqlglot.expressions.MonthsBetween'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.NotNullColumnConstraint'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.Create'>: <function preprocess.<locals>._to_sql>, <class 'sqlglot.expressions.Quantile'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.ApproxQuantile'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.RegexpExtract'>: <function regexp_extract_sql>, <class 'sqlglot.expressions.RegexpExtractAll'>: <function regexp_extract_sql>, <class 'sqlglot.expressions.RegexpReplace'>: <function regexp_replace_sql>, <class 'sqlglot.expressions.RegexpLike'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.RegexpSplit'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Right'>: <function right_to_substring_sql>, <class 'sqlglot.expressions.SchemaCommentProperty'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.ArrayUniqueAgg'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Split'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.Select'>: <function preprocess.<locals>._to_sql>, <class 'sqlglot.expressions.StrPosition'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.StrToDate'>: <function _str_to_date_sql>, <class 'sqlglot.expressions.StrToTime'>: <function _str_to_time_sql>, <class 'sqlglot.expressions.StrToUnix'>: <function _str_to_unix_sql>, <class 'sqlglot.expressions.StructExtract'>: <function struct_extract_sql>, <class 'sqlglot.expressions.StarMap'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Table'>: <function preprocess.<locals>._to_sql>, <class 'sqlglot.expressions.TimeStrToDate'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TimeStrToTime'>: <function timestrtotime_sql>, <class 'sqlglot.expressions.TimeStrToUnix'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TimestampTrunc'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.TimeToUnix'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.ToBase64'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.TsOrDiToDi'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.TsOrDsAdd'>: <function _add_date_sql>, <class 'sqlglot.expressions.TsOrDsDiff'>: <function _date_diff_sql>, <class 'sqlglot.expressions.TsOrDsToDate'>: <function _to_date_sql>, <class 'sqlglot.expressions.TryCast'>: <function no_trycast_sql>, <class 'sqlglot.expressions.Unicode'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.UnixToStr'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.UnixToTime'>: <function _unix_to_time_sql>, <class 'sqlglot.expressions.UnixToTimeStr'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Unnest'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.PartitionedByProperty'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.NumberToStr'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.National'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.PrimaryKeyColumnConstraint'>: <function Hive.Generator.<lambda>>, <class 'sqlglot.expressions.WeekOfYear'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.DayOfMonth'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.DayOfWeek'>: <function rename_func.<locals>.<lambda>>, <class 'sqlglot.expressions.Levenshtein'>: <function rename_func.<locals>.<lambda>>}
PROPERTIES_LOCATION =
{<class 'sqlglot.expressions.AllowedValuesProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.AlgorithmProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.AutoIncrementProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.AutoRefreshProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.BackupProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.BlockCompressionProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.CharacterSetProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ChecksumProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.CollateProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.CopyGrantsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Cluster'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ClusteredByProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DistributedByProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DuplicateKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DataBlocksizeProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.DataDeletionProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DefinerProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.DictRange'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DictProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DynamicProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.DistKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.DistStyleProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EmptyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EncodeProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.EngineProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.EnviromentProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ExecuteAsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ExternalProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.FallbackProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.FileFormatProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.FreespaceProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.GlobalProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.HeapProperty'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.InheritsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.IcebergProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.IncludeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.InputModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.IsolatedLoadingProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.JournalProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.LanguageProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LikeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LocationProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LockProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.LockingProperty'>: <Location.POST_ALIAS: 'POST_ALIAS'>, <class 'sqlglot.expressions.LogProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.MaterializedProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.MergeBlockRatioProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.NoPrimaryIndexProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.OnProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.OnCommitProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.Order'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.OutputModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PartitionedByProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PartitionedOfProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.PrimaryKey'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Property'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.RemoteWithConnectionModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ReturnsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatDelimitedProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.RowFormatSerdeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SampleProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SchemaCommentProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SecureProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.SecurityProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SerdeProperties'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Set'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SettingsProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SetProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.SetConfigProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SharingProperty'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.SequenceProperties'>: <Location.POST_EXPRESSION: 'POST_EXPRESSION'>, <class 'sqlglot.expressions.SortKeyProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SqlReadWriteProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.SqlSecurityProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.StabilityProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.StorageHandlerProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.StreamingTableProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.StrictProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.Tags'>: <Location.POST_WITH: 'POST_WITH'>, <class 'sqlglot.expressions.TemporaryProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.ToTableProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.TransientProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.TransformModelProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.MergeTreeTTL'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.UnloggedProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.UsingTemplateProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ViewAttributeProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.VolatileProperty'>: <Location.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.WithDataProperty'>: <Location.UNSUPPORTED: 'UNSUPPORTED'>, <class 'sqlglot.expressions.WithJournalTableProperty'>: <Location.POST_NAME: 'POST_NAME'>, <class 'sqlglot.expressions.WithProcedureOptions'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.WithSchemaBindingProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.WithSystemVersioningProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.ForceProperty'>: <Location.POST_CREATE: 'POST_CREATE'>}
TS_OR_DS_EXPRESSIONS: Tuple[Type[sqlglot.expressions.Expression], ...] =
(<class 'sqlglot.expressions.DateDiff'>, <class 'sqlglot.expressions.Day'>, <class 'sqlglot.expressions.Month'>, <class 'sqlglot.expressions.Year'>)
716 def parameter_sql(self, expression: exp.Parameter) -> str: 717 this = self.sql(expression, "this") 718 expression_sql = self.sql(expression, "expression") 719 720 parent = expression.parent 721 this = f"{this}:{expression_sql}" if expression_sql else this 722 723 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 724 # We need to produce SET key = value instead of SET ${key} = value 725 return this 726 727 return f"${{{this}}}"
def
rowformatserdeproperty_sql(self, expression: sqlglot.expressions.RowFormatSerdeProperty) -> str:
755 def datatype_sql(self, expression: exp.DataType) -> str: 756 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 757 not expression.expressions or expression.expressions[0].name == "MAX" 758 ): 759 expression = exp.DataType.build("text") 760 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 761 expression.set("this", exp.DataType.Type.VARCHAR) 762 elif expression.this in exp.DataType.TEMPORAL_TYPES: 763 expression = exp.DataType.build(expression.this) 764 elif expression.is_type("float"): 765 size_expression = expression.find(exp.DataTypeParam) 766 if size_expression: 767 size = int(size_expression.name) 768 expression = ( 769 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 770 ) 771 772 return super().datatype_sql(expression)
778 def struct_sql(self, expression: exp.Struct) -> str: 779 values = [] 780 781 for i, e in enumerate(expression.expressions): 782 if isinstance(e, exp.PropertyEQ): 783 self.unsupported("Hive does not support named structs.") 784 values.append(e.expression) 785 else: 786 values.append(e) 787 788 return self.func("STRUCT", *values)
801 def altercolumn_sql(self, expression: exp.AlterColumn) -> str: 802 this = self.sql(expression, "this") 803 new_name = self.sql(expression, "rename_to") or this 804 dtype = self.sql(expression, "dtype") 805 comment = ( 806 f" COMMENT {self.sql(expression, 'comment')}" 807 if self.sql(expression, "comment") 808 else "" 809 ) 810 default = self.sql(expression, "default") 811 visible = expression.args.get("visible") 812 allow_null = expression.args.get("allow_null") 813 drop = expression.args.get("drop") 814 815 if any([default, drop, visible, allow_null, drop]): 816 self.unsupported("Unsupported CHANGE COLUMN syntax") 817 818 if not dtype: 819 self.unsupported("CHANGE COLUMN without a type is not supported") 820 821 return f"CHANGE COLUMN {this} {new_name} {dtype}{comment}"
827 def alterset_sql(self, expression: exp.AlterSet) -> str: 828 exprs = self.expressions(expression, flat=True) 829 exprs = f" {exprs}" if exprs else "" 830 location = self.sql(expression, "location") 831 location = f" LOCATION {location}" if location else "" 832 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 833 file_format = f" FILEFORMAT {file_format}" if file_format else "" 834 serde = self.sql(expression, "serde") 835 serde = f" SERDE {serde}" if serde else "" 836 tags = self.expressions(expression, key="tag", flat=True, sep="") 837 tags = f" TAGS {tags}" if tags else "" 838 839 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
- UNICODE_SUBSTITUTE
- STAR_EXCEPT
- HEX_FUNC
- QUOTE_JSON_PATH
- SUPPORTS_EXPLODING_PROJECTIONS
- ARRAY_CONCAT_IS_VAR_LEN
- SUPPORTS_CONVERT_TIMEZONE
- SUPPORTS_UNIX_SECONDS
- ALTER_SET_WRAPPED
- NORMALIZE_EXTRACT_DATE_PARTS
- ARRAY_SIZE_DIM_REQUIRED
- SUPPORTS_BETWEEN_FLAGS
- SUPPORTS_LIKE_QUANTIFIERS
- MATCH_AGAINST_TABLE_PREFIX
- UNSUPPORTED_TYPES
- 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
- SAFE_JSON_PATH_KEY_RE
- SENTINEL_LINE_BREAK
- pretty
- identify
- normalize
- pad
- unsupported_level
- max_unsupported
- leading_comma
- max_text_width
- comments
- dialect
- normalize_functions
- unsupported_messages
- generate
- preprocess
- unsupported
- sep
- seg
- sanitize_comment
- maybe_comment
- wrap
- no_identify
- normalize_func
- indent
- sql
- uncache_sql
- cache_sql
- characterset_sql
- column_parts
- column_sql
- columnposition_sql
- columnconstraint_sql
- computedcolumnconstraint_sql
- autoincrementcolumnconstraint_sql
- compresscolumnconstraint_sql
- generatedasidentitycolumnconstraint_sql
- generatedasrowcolumnconstraint_sql
- periodforsystemtimeconstraint_sql
- notnullcolumnconstraint_sql
- primarykeycolumnconstraint_sql
- uniquecolumnconstraint_sql
- createable_sql
- create_sql
- sequenceproperties_sql
- clone_sql
- describe_sql
- heredoc_sql
- prepend_ctes
- with_sql
- cte_sql
- tablealias_sql
- bitstring_sql
- hexstring_sql
- bytestring_sql
- unicodestring_sql
- rawstring_sql
- datatypeparam_sql
- directory_sql
- delete_sql
- drop_sql
- set_operation
- set_operations
- fetch_sql
- limitoptions_sql
- filter_sql
- hint_sql
- indexparameters_sql
- index_sql
- identifier_sql
- hex_sql
- lowerhex_sql
- inputoutputformat_sql
- national_sql
- partition_sql
- properties_sql
- root_properties
- properties
- with_properties
- locate_properties
- property_name
- property_sql
- likeproperty_sql
- fallbackproperty_sql
- journalproperty_sql
- freespaceproperty_sql
- checksumproperty_sql
- mergeblockratioproperty_sql
- datablocksizeproperty_sql
- blockcompressionproperty_sql
- isolatedloadingproperty_sql
- partitionboundspec_sql
- partitionedofproperty_sql
- lockingproperty_sql
- withdataproperty_sql
- withsystemversioningproperty_sql
- insert_sql
- introducer_sql
- kill_sql
- pseudotype_sql
- objectidentifier_sql
- onconflict_sql
- returning_sql
- rowformatdelimitedproperty_sql
- withtablehint_sql
- indextablehint_sql
- historicaldata_sql
- table_parts
- table_sql
- tablefromrows_sql
- tablesample_sql
- pivot_sql
- tuple_sql
- update_sql
- values_sql
- var_sql
- into_sql
- from_sql
- groupingsets_sql
- rollup_sql
- cube_sql
- group_sql
- having_sql
- connect_sql
- prior_sql
- join_sql
- lambda_sql
- lateral_op
- lateral_sql
- limit_sql
- offset_sql
- setitem_sql
- set_sql
- queryband_sql
- pragma_sql
- lock_sql
- literal_sql
- escape_str
- loaddata_sql
- null_sql
- boolean_sql
- order_sql
- withfill_sql
- cluster_sql
- distribute_sql
- sort_sql
- ordered_sql
- matchrecognizemeasure_sql
- matchrecognize_sql
- query_modifiers
- options_modifier
- for_modifiers
- queryoption_sql
- offset_limit_modifiers
- after_limit_modifiers
- select_sql
- schema_columns_sql
- star_sql
- sessionparameter_sql
- placeholder_sql
- subquery_sql
- qualify_sql
- prewhere_sql
- where_sql
- window_sql
- partition_by_sql
- windowspec_sql
- withingroup_sql
- between_sql
- bracket_offset_expressions
- bracket_sql
- all_sql
- any_sql
- case_sql
- nextvaluefor_sql
- extract_sql
- trim_sql
- convert_concat_args
- concat_sql
- concatws_sql
- check_sql
- foreignkey_sql
- primarykey_sql
- if_sql
- matchagainst_sql
- jsonkeyvalue_sql
- jsonpath_sql
- json_path_part
- formatjson_sql
- formatphrase_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
- alterindex_sql
- alterdiststyle_sql
- altersortkey_sql
- alterrename_sql
- alter_sql
- altersession_sql
- add_column_sql
- droppartition_sql
- addconstraint_sql
- addpartition_sql
- distinct_sql
- ignorenulls_sql
- respectnulls_sql
- havingmax_sql
- intdiv_sql
- dpipe_sql
- div_sql
- safedivide_sql
- overlaps_sql
- distance_sql
- dot_sql
- eq_sql
- propertyeq_sql
- escape_sql
- glob_sql
- gt_sql
- gte_sql
- is_sql
- like_sql
- ilike_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
- generateembedding_sql
- mltranslate_sql
- mlforecast_sql
- featuresattime_sql
- vectorsearch_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
- revoke_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
- watermarkcolumnconstraint_sql
- encodeproperty_sql
- includeproperty_sql
- xmlelement_sql
- xmlkeyvalueoption_sql
- partitionbyrangeproperty_sql
- partitionbyrangepropertydynamic_sql
- unpivotcolumns_sql
- analyzesample_sql
- analyzestatistics_sql
- analyzehistogram_sql
- analyzedelete_sql
- analyzelistchainedrows_sql
- analyzevalidate_sql
- analyze_sql
- xmltable_sql
- xmlnamespace_sql
- export_sql
- declare_sql
- declareitem_sql
- recursivewithsearch_sql
- parameterizedagg_sql
- anonymousaggfunc_sql
- combinedaggfunc_sql
- combinedparameterizedagg_sql
- show_sql
- install_sql
- get_put_sql
- translatecharacters_sql
- decodecase_sql
- semanticview_sql
- getextract_sql
- datefromunixdate_sql
- space_sql
- buildproperty_sql
- refreshtriggerproperty_sql
- modelattribute_sql
- directorystage_sql