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