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 65 66def _add_date_sql(self: Hive.Generator, expression: DATE_ADD_OR_SUB) -> str: 67 if isinstance(expression, exp.TsOrDsAdd) and not expression.unit: 68 return self.func("DATE_ADD", expression.this, expression.expression) 69 70 unit = expression.text("unit").upper() 71 func, multiplier = DATE_DELTA_INTERVAL.get(unit, ("DATE_ADD", 1)) 72 73 if isinstance(expression, exp.DateSub): 74 multiplier *= -1 75 76 increment = expression.expression 77 if isinstance(increment, exp.Literal): 78 value = increment.to_py() if increment.is_number else int(increment.name) 79 increment = exp.Literal.number(value * multiplier) 80 elif multiplier != 1: 81 increment *= exp.Literal.number(multiplier) 82 83 return self.func(func, expression.this, increment) 84 85 86def _date_diff_sql(self: Hive.Generator, expression: exp.DateDiff | exp.TsOrDsDiff) -> str: 87 unit = expression.text("unit").upper() 88 89 factor = TIME_DIFF_FACTOR.get(unit) 90 if factor is not None: 91 left = self.sql(expression, "this") 92 right = self.sql(expression, "expression") 93 sec_diff = f"UNIX_TIMESTAMP({left}) - UNIX_TIMESTAMP({right})" 94 return f"({sec_diff}){factor}" if factor else sec_diff 95 96 months_between = unit in DIFF_MONTH_SWITCH 97 sql_func = "MONTHS_BETWEEN" if months_between else "DATEDIFF" 98 _, multiplier = DATE_DELTA_INTERVAL.get(unit, ("", 1)) 99 multiplier_sql = f" / {multiplier}" if multiplier > 1 else "" 100 diff_sql = f"{sql_func}({self.format_args(expression.this, expression.expression)})" 101 102 if months_between or multiplier_sql: 103 # MONTHS_BETWEEN returns a float, so we need to truncate the fractional part. 104 # For the same reason, we want to truncate if there's a divisor present. 105 diff_sql = f"CAST({diff_sql}{multiplier_sql} AS INT)" 106 107 return diff_sql 108 109 110def _json_format_sql(self: Hive.Generator, expression: exp.JSONFormat) -> str: 111 this = expression.this 112 113 if is_parse_json(this): 114 if this.this.is_string: 115 # Since FROM_JSON requires a nested type, we always wrap the json string with 116 # an array to ensure that "naked" strings like "'a'" will be handled correctly 117 wrapped_json = exp.Literal.string(f"[{this.this.name}]") 118 119 from_json = self.func( 120 "FROM_JSON", wrapped_json, self.func("SCHEMA_OF_JSON", wrapped_json) 121 ) 122 to_json = self.func("TO_JSON", from_json) 123 124 # This strips the [, ] delimiters of the dummy array printed by TO_JSON 125 return self.func("REGEXP_EXTRACT", to_json, "'^.(.*).$'", "1") 126 return self.sql(this) 127 128 return self.func("TO_JSON", this, expression.args.get("options")) 129 130 131@generator.unsupported_args(("expression", "Hive's SORT_ARRAY does not support a comparator.")) 132def _array_sort_sql(self: Hive.Generator, expression: exp.ArraySort) -> str: 133 return self.func("SORT_ARRAY", expression.this) 134 135 136def _str_to_unix_sql(self: Hive.Generator, expression: exp.StrToUnix) -> str: 137 return self.func("UNIX_TIMESTAMP", expression.this, time_format("hive")(self, expression)) 138 139 140def _unix_to_time_sql(self: Hive.Generator, expression: exp.UnixToTime) -> str: 141 timestamp = self.sql(expression, "this") 142 scale = expression.args.get("scale") 143 if scale in (None, exp.UnixToTime.SECONDS): 144 return rename_func("FROM_UNIXTIME")(self, expression) 145 146 return f"FROM_UNIXTIME({timestamp} / POW(10, {scale}))" 147 148 149def _str_to_date_sql(self: Hive.Generator, expression: exp.StrToDate) -> str: 150 this = self.sql(expression, "this") 151 time_format = self.format_time(expression) 152 if time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 153 this = f"FROM_UNIXTIME(UNIX_TIMESTAMP({this}, {time_format}))" 154 return f"CAST({this} AS DATE)" 155 156 157def _str_to_time_sql(self: Hive.Generator, expression: exp.StrToTime) -> str: 158 this = self.sql(expression, "this") 159 time_format = self.format_time(expression) 160 if time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 161 this = f"FROM_UNIXTIME(UNIX_TIMESTAMP({this}, {time_format}))" 162 return f"CAST({this} AS TIMESTAMP)" 163 164 165def _to_date_sql(self: Hive.Generator, expression: exp.TsOrDsToDate) -> str: 166 time_format = self.format_time(expression) 167 if time_format and time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 168 return self.func("TO_DATE", expression.this, time_format) 169 170 if isinstance(expression.this, exp.TsOrDsToDate): 171 return self.sql(expression, "this") 172 173 return self.func("TO_DATE", expression.this) 174 175 176def _build_with_ignore_nulls( 177 exp_class: t.Type[exp.Expression], 178) -> t.Callable[[t.List[exp.Expression]], exp.Expression]: 179 def _parse(args: t.List[exp.Expression]) -> exp.Expression: 180 this = exp_class(this=seq_get(args, 0)) 181 if seq_get(args, 1) == exp.true(): 182 return exp.IgnoreNulls(this=this) 183 return this 184 185 return _parse 186 187 188def _build_to_date(args: t.List) -> exp.TsOrDsToDate: 189 expr = build_formatted_time(exp.TsOrDsToDate, "hive")(args) 190 expr.set("safe", True) 191 return expr 192 193 194class Hive(Dialect): 195 ALIAS_POST_TABLESAMPLE = True 196 IDENTIFIERS_CAN_START_WITH_DIGIT = True 197 SUPPORTS_USER_DEFINED_TYPES = False 198 SAFE_DIVISION = True 199 ARRAY_AGG_INCLUDES_NULLS = None 200 REGEXP_EXTRACT_DEFAULT_GROUP = 1 201 202 # https://spark.apache.org/docs/latest/sql-ref-identifier.html#description 203 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 204 205 TIME_MAPPING = { 206 "y": "%Y", 207 "Y": "%Y", 208 "YYYY": "%Y", 209 "yyyy": "%Y", 210 "YY": "%y", 211 "yy": "%y", 212 "MMMM": "%B", 213 "MMM": "%b", 214 "MM": "%m", 215 "M": "%-m", 216 "dd": "%d", 217 "d": "%-d", 218 "HH": "%H", 219 "H": "%-H", 220 "hh": "%I", 221 "h": "%-I", 222 "mm": "%M", 223 "m": "%-M", 224 "ss": "%S", 225 "s": "%-S", 226 "SSSSSS": "%f", 227 "a": "%p", 228 "DD": "%j", 229 "D": "%-j", 230 "E": "%a", 231 "EE": "%a", 232 "EEE": "%a", 233 "EEEE": "%A", 234 "z": "%Z", 235 "Z": "%z", 236 } 237 238 DATE_FORMAT = "'yyyy-MM-dd'" 239 DATEINT_FORMAT = "'yyyyMMdd'" 240 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 241 242 class Tokenizer(tokens.Tokenizer): 243 QUOTES = ["'", '"'] 244 IDENTIFIERS = ["`"] 245 STRING_ESCAPES = ["\\"] 246 247 SINGLE_TOKENS = { 248 **tokens.Tokenizer.SINGLE_TOKENS, 249 "$": TokenType.PARAMETER, 250 } 251 252 KEYWORDS = { 253 **tokens.Tokenizer.KEYWORDS, 254 "ADD ARCHIVE": TokenType.COMMAND, 255 "ADD ARCHIVES": TokenType.COMMAND, 256 "ADD FILE": TokenType.COMMAND, 257 "ADD FILES": TokenType.COMMAND, 258 "ADD JAR": TokenType.COMMAND, 259 "ADD JARS": TokenType.COMMAND, 260 "MINUS": TokenType.EXCEPT, 261 "MSCK REPAIR": TokenType.COMMAND, 262 "REFRESH": TokenType.REFRESH, 263 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 264 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 265 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 266 } 267 268 NUMERIC_LITERALS = { 269 "L": "BIGINT", 270 "S": "SMALLINT", 271 "Y": "TINYINT", 272 "D": "DOUBLE", 273 "F": "FLOAT", 274 "BD": "DECIMAL", 275 } 276 277 class Parser(parser.Parser): 278 LOG_DEFAULTS_TO_LN = True 279 STRICT_CAST = False 280 VALUES_FOLLOWED_BY_PAREN = False 281 282 FUNCTIONS = { 283 **parser.Parser.FUNCTIONS, 284 "ASCII": exp.Unicode.from_arg_list, 285 "BASE64": exp.ToBase64.from_arg_list, 286 "COLLECT_LIST": lambda args: exp.ArrayAgg(this=seq_get(args, 0), nulls_excluded=True), 287 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 288 "DATE_ADD": lambda args: exp.TsOrDsAdd( 289 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 290 ), 291 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 292 [ 293 exp.TimeStrToTime(this=seq_get(args, 0)), 294 seq_get(args, 1), 295 ] 296 ), 297 "DATE_SUB": lambda args: exp.TsOrDsAdd( 298 this=seq_get(args, 0), 299 expression=exp.Mul(this=seq_get(args, 1), expression=exp.Literal.number(-1)), 300 unit=exp.Literal.string("DAY"), 301 ), 302 "DATEDIFF": lambda args: exp.DateDiff( 303 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 304 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 305 ), 306 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 307 "FIRST": _build_with_ignore_nulls(exp.First), 308 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 309 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 310 "GET_JSON_OBJECT": lambda args, dialect: exp.JSONExtractScalar( 311 this=seq_get(args, 0), expression=dialect.to_json_path(seq_get(args, 1)) 312 ), 313 "LAST": _build_with_ignore_nulls(exp.Last), 314 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 315 "MAP": parser.build_var_map, 316 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 317 "PERCENTILE": exp.Quantile.from_arg_list, 318 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 319 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 320 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 321 "SEQUENCE": exp.GenerateSeries.from_arg_list, 322 "SIZE": exp.ArraySize.from_arg_list, 323 "SPLIT": exp.RegexpSplit.from_arg_list, 324 "STR_TO_MAP": lambda args: exp.StrToMap( 325 this=seq_get(args, 0), 326 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 327 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 328 ), 329 "TO_DATE": _build_to_date, 330 "TO_JSON": exp.JSONFormat.from_arg_list, 331 "TRUNC": exp.TimestampTrunc.from_arg_list, 332 "UNBASE64": exp.FromBase64.from_arg_list, 333 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 334 args or [exp.CurrentTimestamp()] 335 ), 336 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 337 } 338 339 NO_PAREN_FUNCTION_PARSERS = { 340 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 341 "TRANSFORM": lambda self: self._parse_transform(), 342 } 343 344 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 345 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 346 347 PROPERTY_PARSERS = { 348 **parser.Parser.PROPERTY_PARSERS, 349 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 350 expressions=self._parse_wrapped_csv(self._parse_property) 351 ), 352 } 353 354 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 355 if not self._match(TokenType.L_PAREN, advance=False): 356 self._retreat(self._index - 1) 357 return None 358 359 args = self._parse_wrapped_csv(self._parse_lambda) 360 row_format_before = self._parse_row_format(match_row=True) 361 362 record_writer = None 363 if self._match_text_seq("RECORDWRITER"): 364 record_writer = self._parse_string() 365 366 if not self._match(TokenType.USING): 367 return exp.Transform.from_arg_list(args) 368 369 command_script = self._parse_string() 370 371 self._match(TokenType.ALIAS) 372 schema = self._parse_schema() 373 374 row_format_after = self._parse_row_format(match_row=True) 375 record_reader = None 376 if self._match_text_seq("RECORDREADER"): 377 record_reader = self._parse_string() 378 379 return self.expression( 380 exp.QueryTransform, 381 expressions=args, 382 command_script=command_script, 383 schema=schema, 384 row_format_before=row_format_before, 385 record_writer=record_writer, 386 row_format_after=row_format_after, 387 record_reader=record_reader, 388 ) 389 390 def _parse_types( 391 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 392 ) -> t.Optional[exp.Expression]: 393 """ 394 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 395 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 396 397 spark-sql (default)> select cast(1234 as varchar(2)); 398 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 399 char/varchar type and simply treats them as string type. Please use string type 400 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 401 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 402 403 1234 404 Time taken: 4.265 seconds, Fetched 1 row(s) 405 406 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 407 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 408 409 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 410 """ 411 this = super()._parse_types( 412 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 413 ) 414 415 if this and not schema: 416 return this.transform( 417 lambda node: ( 418 node.replace(exp.DataType.build("text")) 419 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 420 else node 421 ), 422 copy=False, 423 ) 424 425 return this 426 427 def _parse_partition_and_order( 428 self, 429 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 430 return ( 431 ( 432 self._parse_csv(self._parse_assignment) 433 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 434 else [] 435 ), 436 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 437 ) 438 439 def _parse_parameter(self) -> exp.Parameter: 440 self._match(TokenType.L_BRACE) 441 this = self._parse_identifier() or self._parse_primary_or_var() 442 expression = self._match(TokenType.COLON) and ( 443 self._parse_identifier() or self._parse_primary_or_var() 444 ) 445 self._match(TokenType.R_BRACE) 446 return self.expression(exp.Parameter, this=this, expression=expression) 447 448 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 449 if expression.is_star: 450 return expression 451 452 if isinstance(expression, exp.Column): 453 key = expression.this 454 else: 455 key = exp.to_identifier(f"col{index + 1}") 456 457 return self.expression(exp.PropertyEQ, this=key, expression=expression) 458 459 class Generator(generator.Generator): 460 LIMIT_FETCH = "LIMIT" 461 TABLESAMPLE_WITH_METHOD = False 462 JOIN_HINTS = False 463 TABLE_HINTS = False 464 QUERY_HINTS = False 465 INDEX_ON = "ON TABLE" 466 EXTRACT_ALLOWS_QUOTES = False 467 NVL2_SUPPORTED = False 468 LAST_DAY_SUPPORTS_DATE_PART = False 469 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 470 SUPPORTS_TO_NUMBER = False 471 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 472 PARSE_JSON_NAME: t.Optional[str] = None 473 PAD_FILL_PATTERN_IS_REQUIRED = True 474 SUPPORTS_MEDIAN = False 475 ARRAY_SIZE_NAME = "SIZE" 476 477 EXPRESSIONS_WITHOUT_NESTED_CTES = { 478 exp.Insert, 479 exp.Select, 480 exp.Subquery, 481 exp.SetOperation, 482 } 483 484 SUPPORTED_JSON_PATH_PARTS = { 485 exp.JSONPathKey, 486 exp.JSONPathRoot, 487 exp.JSONPathSubscript, 488 exp.JSONPathWildcard, 489 } 490 491 TYPE_MAPPING = { 492 **generator.Generator.TYPE_MAPPING, 493 exp.DataType.Type.BIT: "BOOLEAN", 494 exp.DataType.Type.BLOB: "BINARY", 495 exp.DataType.Type.DATETIME: "TIMESTAMP", 496 exp.DataType.Type.ROWVERSION: "BINARY", 497 exp.DataType.Type.TEXT: "STRING", 498 exp.DataType.Type.TIME: "TIMESTAMP", 499 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 500 exp.DataType.Type.UTINYINT: "SMALLINT", 501 exp.DataType.Type.VARBINARY: "BINARY", 502 } 503 504 TRANSFORMS = { 505 **generator.Generator.TRANSFORMS, 506 exp.Group: transforms.preprocess([transforms.unalias_group]), 507 exp.Property: property_sql, 508 exp.AnyValue: rename_func("FIRST"), 509 exp.ApproxDistinct: approx_count_distinct_sql, 510 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 511 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 512 exp.ArrayConcat: rename_func("CONCAT"), 513 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 514 exp.ArraySort: _array_sort_sql, 515 exp.With: no_recursive_cte_sql, 516 exp.DateAdd: _add_date_sql, 517 exp.DateDiff: _date_diff_sql, 518 exp.DateStrToDate: datestrtodate_sql, 519 exp.DateSub: _add_date_sql, 520 exp.DateToDi: lambda self, 521 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 522 exp.DiToDate: lambda self, 523 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 524 exp.FileFormatProperty: lambda self, 525 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 526 exp.StorageHandlerProperty: lambda self, e: f"STORED BY {self.sql(e, 'this')}", 527 exp.FromBase64: rename_func("UNBASE64"), 528 exp.GenerateSeries: sequence_sql, 529 exp.GenerateDateArray: sequence_sql, 530 exp.If: if_sql(), 531 exp.ILike: no_ilike_sql, 532 exp.IsNan: rename_func("ISNAN"), 533 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 534 exp.JSONExtractScalar: lambda self, e: self.func( 535 "GET_JSON_OBJECT", e.this, e.expression 536 ), 537 exp.JSONFormat: _json_format_sql, 538 exp.Left: left_to_substring_sql, 539 exp.Map: var_map_sql, 540 exp.Max: max_or_greatest, 541 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 542 exp.Min: min_or_least, 543 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 544 exp.NotNullColumnConstraint: lambda _, e: ( 545 "" if e.args.get("allow_null") else "NOT NULL" 546 ), 547 exp.VarMap: var_map_sql, 548 exp.Create: preprocess( 549 [ 550 remove_unique_constraints, 551 ctas_with_tmp_tables_to_create_tmp_view, 552 move_schema_columns_to_partitioned_by, 553 ] 554 ), 555 exp.Quantile: rename_func("PERCENTILE"), 556 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 557 exp.RegexpExtract: regexp_extract_sql, 558 exp.RegexpExtractAll: regexp_extract_sql, 559 exp.RegexpReplace: regexp_replace_sql, 560 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 561 exp.RegexpSplit: rename_func("SPLIT"), 562 exp.Right: right_to_substring_sql, 563 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 564 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 565 exp.Split: lambda self, e: self.func( 566 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 567 ), 568 exp.Select: transforms.preprocess( 569 [ 570 transforms.eliminate_qualify, 571 transforms.eliminate_distinct_on, 572 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 573 transforms.any_to_exists, 574 ] 575 ), 576 exp.StrPosition: lambda self, e: strposition_sql( 577 self, e, func_name="LOCATE", supports_position=True 578 ), 579 exp.StrToDate: _str_to_date_sql, 580 exp.StrToTime: _str_to_time_sql, 581 exp.StrToUnix: _str_to_unix_sql, 582 exp.StructExtract: struct_extract_sql, 583 exp.StarMap: rename_func("MAP"), 584 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 585 exp.TimeStrToDate: rename_func("TO_DATE"), 586 exp.TimeStrToTime: timestrtotime_sql, 587 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 588 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 589 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 590 exp.ToBase64: rename_func("BASE64"), 591 exp.TsOrDiToDi: lambda self, 592 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 593 exp.TsOrDsAdd: _add_date_sql, 594 exp.TsOrDsDiff: _date_diff_sql, 595 exp.TsOrDsToDate: _to_date_sql, 596 exp.TryCast: no_trycast_sql, 597 exp.Unicode: rename_func("ASCII"), 598 exp.UnixToStr: lambda self, e: self.func( 599 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 600 ), 601 exp.UnixToTime: _unix_to_time_sql, 602 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 603 exp.Unnest: rename_func("EXPLODE"), 604 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 605 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 606 exp.National: lambda self, e: self.national_sql(e, prefix=""), 607 exp.ClusteredColumnConstraint: lambda self, 608 e: f"({self.expressions(e, 'this', indent=False)})", 609 exp.NonClusteredColumnConstraint: lambda self, 610 e: f"({self.expressions(e, 'this', indent=False)})", 611 exp.NotForReplicationColumnConstraint: lambda *_: "", 612 exp.OnProperty: lambda *_: "", 613 exp.PartitionedByBucket: lambda self, e: self.func("BUCKET", e.expression, e.this), 614 exp.PartitionByTruncate: lambda self, e: self.func("TRUNCATE", e.expression, e.this), 615 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 616 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 617 exp.DayOfMonth: rename_func("DAYOFMONTH"), 618 exp.DayOfWeek: rename_func("DAYOFWEEK"), 619 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 620 rename_func("LEVENSHTEIN") 621 ), 622 } 623 624 PROPERTIES_LOCATION = { 625 **generator.Generator.PROPERTIES_LOCATION, 626 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 627 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 628 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 629 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 630 } 631 632 def unnest_sql(self, expression: exp.Unnest) -> str: 633 return rename_func("EXPLODE")(self, expression) 634 635 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 636 if isinstance(expression.this, exp.JSONPathWildcard): 637 self.unsupported("Unsupported wildcard in JSONPathKey expression") 638 return "" 639 640 return super()._jsonpathkey_sql(expression) 641 642 def parameter_sql(self, expression: exp.Parameter) -> str: 643 this = self.sql(expression, "this") 644 expression_sql = self.sql(expression, "expression") 645 646 parent = expression.parent 647 this = f"{this}:{expression_sql}" if expression_sql else this 648 649 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 650 # We need to produce SET key = value instead of SET ${key} = value 651 return this 652 653 return f"${{{this}}}" 654 655 def schema_sql(self, expression: exp.Schema) -> str: 656 for ordered in expression.find_all(exp.Ordered): 657 if ordered.args.get("desc") is False: 658 ordered.set("desc", None) 659 660 return super().schema_sql(expression) 661 662 def constraint_sql(self, expression: exp.Constraint) -> str: 663 for prop in list(expression.find_all(exp.Properties)): 664 prop.pop() 665 666 this = self.sql(expression, "this") 667 expressions = self.expressions(expression, sep=" ", flat=True) 668 return f"CONSTRAINT {this} {expressions}" 669 670 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 671 serde_props = self.sql(expression, "serde_properties") 672 serde_props = f" {serde_props}" if serde_props else "" 673 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 674 675 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 676 return self.func( 677 "COLLECT_LIST", 678 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 679 ) 680 681 def datatype_sql(self, expression: exp.DataType) -> str: 682 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 683 not expression.expressions or expression.expressions[0].name == "MAX" 684 ): 685 expression = exp.DataType.build("text") 686 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 687 expression.set("this", exp.DataType.Type.VARCHAR) 688 elif expression.this in exp.DataType.TEMPORAL_TYPES: 689 expression = exp.DataType.build(expression.this) 690 elif expression.is_type("float"): 691 size_expression = expression.find(exp.DataTypeParam) 692 if size_expression: 693 size = int(size_expression.name) 694 expression = ( 695 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 696 ) 697 698 return super().datatype_sql(expression) 699 700 def version_sql(self, expression: exp.Version) -> str: 701 sql = super().version_sql(expression) 702 return sql.replace("FOR ", "", 1) 703 704 def struct_sql(self, expression: exp.Struct) -> str: 705 values = [] 706 707 for i, e in enumerate(expression.expressions): 708 if isinstance(e, exp.PropertyEQ): 709 self.unsupported("Hive does not support named structs.") 710 values.append(e.expression) 711 else: 712 values.append(e) 713 714 return self.func("STRUCT", *values) 715 716 def alterset_sql(self, expression: exp.AlterSet) -> str: 717 exprs = self.expressions(expression, flat=True) 718 exprs = f" {exprs}" if exprs else "" 719 location = self.sql(expression, "location") 720 location = f" LOCATION {location}" if location else "" 721 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 722 file_format = f" FILEFORMAT {file_format}" if file_format else "" 723 serde = self.sql(expression, "serde") 724 serde = f" SERDE {serde}" if serde else "" 725 tags = self.expressions(expression, key="tag", flat=True, sep="") 726 tags = f" TAGS {tags}" if tags else "" 727 728 return f"SET{serde}{exprs}{location}{file_format}{tags}" 729 730 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 731 prefix = "WITH " if expression.args.get("with") else "" 732 exprs = self.expressions(expression, flat=True) 733 734 return f"{prefix}SERDEPROPERTIES ({exprs})" 735 736 def exists_sql(self, expression: exp.Exists) -> str: 737 if expression.expression: 738 return self.function_fallback_sql(expression) 739 740 return super().exists_sql(expression) 741 742 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 743 this = expression.this 744 if isinstance(this, exp.TimeStrToTime): 745 this = this.this 746 747 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')
class
Hive(sqlglot.dialects.dialect.Dialect):
195class Hive(Dialect): 196 ALIAS_POST_TABLESAMPLE = True 197 IDENTIFIERS_CAN_START_WITH_DIGIT = True 198 SUPPORTS_USER_DEFINED_TYPES = False 199 SAFE_DIVISION = True 200 ARRAY_AGG_INCLUDES_NULLS = None 201 REGEXP_EXTRACT_DEFAULT_GROUP = 1 202 203 # https://spark.apache.org/docs/latest/sql-ref-identifier.html#description 204 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 205 206 TIME_MAPPING = { 207 "y": "%Y", 208 "Y": "%Y", 209 "YYYY": "%Y", 210 "yyyy": "%Y", 211 "YY": "%y", 212 "yy": "%y", 213 "MMMM": "%B", 214 "MMM": "%b", 215 "MM": "%m", 216 "M": "%-m", 217 "dd": "%d", 218 "d": "%-d", 219 "HH": "%H", 220 "H": "%-H", 221 "hh": "%I", 222 "h": "%-I", 223 "mm": "%M", 224 "m": "%-M", 225 "ss": "%S", 226 "s": "%-S", 227 "SSSSSS": "%f", 228 "a": "%p", 229 "DD": "%j", 230 "D": "%-j", 231 "E": "%a", 232 "EE": "%a", 233 "EEE": "%a", 234 "EEEE": "%A", 235 "z": "%Z", 236 "Z": "%z", 237 } 238 239 DATE_FORMAT = "'yyyy-MM-dd'" 240 DATEINT_FORMAT = "'yyyyMMdd'" 241 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 242 243 class Tokenizer(tokens.Tokenizer): 244 QUOTES = ["'", '"'] 245 IDENTIFIERS = ["`"] 246 STRING_ESCAPES = ["\\"] 247 248 SINGLE_TOKENS = { 249 **tokens.Tokenizer.SINGLE_TOKENS, 250 "$": TokenType.PARAMETER, 251 } 252 253 KEYWORDS = { 254 **tokens.Tokenizer.KEYWORDS, 255 "ADD ARCHIVE": TokenType.COMMAND, 256 "ADD ARCHIVES": TokenType.COMMAND, 257 "ADD FILE": TokenType.COMMAND, 258 "ADD FILES": TokenType.COMMAND, 259 "ADD JAR": TokenType.COMMAND, 260 "ADD JARS": TokenType.COMMAND, 261 "MINUS": TokenType.EXCEPT, 262 "MSCK REPAIR": TokenType.COMMAND, 263 "REFRESH": TokenType.REFRESH, 264 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 265 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 266 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 267 } 268 269 NUMERIC_LITERALS = { 270 "L": "BIGINT", 271 "S": "SMALLINT", 272 "Y": "TINYINT", 273 "D": "DOUBLE", 274 "F": "FLOAT", 275 "BD": "DECIMAL", 276 } 277 278 class Parser(parser.Parser): 279 LOG_DEFAULTS_TO_LN = True 280 STRICT_CAST = False 281 VALUES_FOLLOWED_BY_PAREN = False 282 283 FUNCTIONS = { 284 **parser.Parser.FUNCTIONS, 285 "ASCII": exp.Unicode.from_arg_list, 286 "BASE64": exp.ToBase64.from_arg_list, 287 "COLLECT_LIST": lambda args: exp.ArrayAgg(this=seq_get(args, 0), nulls_excluded=True), 288 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 289 "DATE_ADD": lambda args: exp.TsOrDsAdd( 290 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 291 ), 292 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 293 [ 294 exp.TimeStrToTime(this=seq_get(args, 0)), 295 seq_get(args, 1), 296 ] 297 ), 298 "DATE_SUB": lambda args: exp.TsOrDsAdd( 299 this=seq_get(args, 0), 300 expression=exp.Mul(this=seq_get(args, 1), expression=exp.Literal.number(-1)), 301 unit=exp.Literal.string("DAY"), 302 ), 303 "DATEDIFF": lambda args: exp.DateDiff( 304 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 305 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 306 ), 307 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 308 "FIRST": _build_with_ignore_nulls(exp.First), 309 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 310 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 311 "GET_JSON_OBJECT": lambda args, dialect: exp.JSONExtractScalar( 312 this=seq_get(args, 0), expression=dialect.to_json_path(seq_get(args, 1)) 313 ), 314 "LAST": _build_with_ignore_nulls(exp.Last), 315 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 316 "MAP": parser.build_var_map, 317 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 318 "PERCENTILE": exp.Quantile.from_arg_list, 319 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 320 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 321 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 322 "SEQUENCE": exp.GenerateSeries.from_arg_list, 323 "SIZE": exp.ArraySize.from_arg_list, 324 "SPLIT": exp.RegexpSplit.from_arg_list, 325 "STR_TO_MAP": lambda args: exp.StrToMap( 326 this=seq_get(args, 0), 327 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 328 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 329 ), 330 "TO_DATE": _build_to_date, 331 "TO_JSON": exp.JSONFormat.from_arg_list, 332 "TRUNC": exp.TimestampTrunc.from_arg_list, 333 "UNBASE64": exp.FromBase64.from_arg_list, 334 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 335 args or [exp.CurrentTimestamp()] 336 ), 337 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 338 } 339 340 NO_PAREN_FUNCTION_PARSERS = { 341 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 342 "TRANSFORM": lambda self: self._parse_transform(), 343 } 344 345 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 346 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 347 348 PROPERTY_PARSERS = { 349 **parser.Parser.PROPERTY_PARSERS, 350 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 351 expressions=self._parse_wrapped_csv(self._parse_property) 352 ), 353 } 354 355 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 356 if not self._match(TokenType.L_PAREN, advance=False): 357 self._retreat(self._index - 1) 358 return None 359 360 args = self._parse_wrapped_csv(self._parse_lambda) 361 row_format_before = self._parse_row_format(match_row=True) 362 363 record_writer = None 364 if self._match_text_seq("RECORDWRITER"): 365 record_writer = self._parse_string() 366 367 if not self._match(TokenType.USING): 368 return exp.Transform.from_arg_list(args) 369 370 command_script = self._parse_string() 371 372 self._match(TokenType.ALIAS) 373 schema = self._parse_schema() 374 375 row_format_after = self._parse_row_format(match_row=True) 376 record_reader = None 377 if self._match_text_seq("RECORDREADER"): 378 record_reader = self._parse_string() 379 380 return self.expression( 381 exp.QueryTransform, 382 expressions=args, 383 command_script=command_script, 384 schema=schema, 385 row_format_before=row_format_before, 386 record_writer=record_writer, 387 row_format_after=row_format_after, 388 record_reader=record_reader, 389 ) 390 391 def _parse_types( 392 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 393 ) -> t.Optional[exp.Expression]: 394 """ 395 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 396 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 397 398 spark-sql (default)> select cast(1234 as varchar(2)); 399 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 400 char/varchar type and simply treats them as string type. Please use string type 401 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 402 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 403 404 1234 405 Time taken: 4.265 seconds, Fetched 1 row(s) 406 407 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 408 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 409 410 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 411 """ 412 this = super()._parse_types( 413 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 414 ) 415 416 if this and not schema: 417 return this.transform( 418 lambda node: ( 419 node.replace(exp.DataType.build("text")) 420 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 421 else node 422 ), 423 copy=False, 424 ) 425 426 return this 427 428 def _parse_partition_and_order( 429 self, 430 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 431 return ( 432 ( 433 self._parse_csv(self._parse_assignment) 434 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 435 else [] 436 ), 437 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 438 ) 439 440 def _parse_parameter(self) -> exp.Parameter: 441 self._match(TokenType.L_BRACE) 442 this = self._parse_identifier() or self._parse_primary_or_var() 443 expression = self._match(TokenType.COLON) and ( 444 self._parse_identifier() or self._parse_primary_or_var() 445 ) 446 self._match(TokenType.R_BRACE) 447 return self.expression(exp.Parameter, this=this, expression=expression) 448 449 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 450 if expression.is_star: 451 return expression 452 453 if isinstance(expression, exp.Column): 454 key = expression.this 455 else: 456 key = exp.to_identifier(f"col{index + 1}") 457 458 return self.expression(exp.PropertyEQ, this=key, expression=expression) 459 460 class Generator(generator.Generator): 461 LIMIT_FETCH = "LIMIT" 462 TABLESAMPLE_WITH_METHOD = False 463 JOIN_HINTS = False 464 TABLE_HINTS = False 465 QUERY_HINTS = False 466 INDEX_ON = "ON TABLE" 467 EXTRACT_ALLOWS_QUOTES = False 468 NVL2_SUPPORTED = False 469 LAST_DAY_SUPPORTS_DATE_PART = False 470 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 471 SUPPORTS_TO_NUMBER = False 472 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 473 PARSE_JSON_NAME: t.Optional[str] = None 474 PAD_FILL_PATTERN_IS_REQUIRED = True 475 SUPPORTS_MEDIAN = False 476 ARRAY_SIZE_NAME = "SIZE" 477 478 EXPRESSIONS_WITHOUT_NESTED_CTES = { 479 exp.Insert, 480 exp.Select, 481 exp.Subquery, 482 exp.SetOperation, 483 } 484 485 SUPPORTED_JSON_PATH_PARTS = { 486 exp.JSONPathKey, 487 exp.JSONPathRoot, 488 exp.JSONPathSubscript, 489 exp.JSONPathWildcard, 490 } 491 492 TYPE_MAPPING = { 493 **generator.Generator.TYPE_MAPPING, 494 exp.DataType.Type.BIT: "BOOLEAN", 495 exp.DataType.Type.BLOB: "BINARY", 496 exp.DataType.Type.DATETIME: "TIMESTAMP", 497 exp.DataType.Type.ROWVERSION: "BINARY", 498 exp.DataType.Type.TEXT: "STRING", 499 exp.DataType.Type.TIME: "TIMESTAMP", 500 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 501 exp.DataType.Type.UTINYINT: "SMALLINT", 502 exp.DataType.Type.VARBINARY: "BINARY", 503 } 504 505 TRANSFORMS = { 506 **generator.Generator.TRANSFORMS, 507 exp.Group: transforms.preprocess([transforms.unalias_group]), 508 exp.Property: property_sql, 509 exp.AnyValue: rename_func("FIRST"), 510 exp.ApproxDistinct: approx_count_distinct_sql, 511 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 512 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 513 exp.ArrayConcat: rename_func("CONCAT"), 514 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 515 exp.ArraySort: _array_sort_sql, 516 exp.With: no_recursive_cte_sql, 517 exp.DateAdd: _add_date_sql, 518 exp.DateDiff: _date_diff_sql, 519 exp.DateStrToDate: datestrtodate_sql, 520 exp.DateSub: _add_date_sql, 521 exp.DateToDi: lambda self, 522 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 523 exp.DiToDate: lambda self, 524 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 525 exp.FileFormatProperty: lambda self, 526 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 527 exp.StorageHandlerProperty: lambda self, e: f"STORED BY {self.sql(e, 'this')}", 528 exp.FromBase64: rename_func("UNBASE64"), 529 exp.GenerateSeries: sequence_sql, 530 exp.GenerateDateArray: sequence_sql, 531 exp.If: if_sql(), 532 exp.ILike: no_ilike_sql, 533 exp.IsNan: rename_func("ISNAN"), 534 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 535 exp.JSONExtractScalar: lambda self, e: self.func( 536 "GET_JSON_OBJECT", e.this, e.expression 537 ), 538 exp.JSONFormat: _json_format_sql, 539 exp.Left: left_to_substring_sql, 540 exp.Map: var_map_sql, 541 exp.Max: max_or_greatest, 542 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 543 exp.Min: min_or_least, 544 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 545 exp.NotNullColumnConstraint: lambda _, e: ( 546 "" if e.args.get("allow_null") else "NOT NULL" 547 ), 548 exp.VarMap: var_map_sql, 549 exp.Create: preprocess( 550 [ 551 remove_unique_constraints, 552 ctas_with_tmp_tables_to_create_tmp_view, 553 move_schema_columns_to_partitioned_by, 554 ] 555 ), 556 exp.Quantile: rename_func("PERCENTILE"), 557 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 558 exp.RegexpExtract: regexp_extract_sql, 559 exp.RegexpExtractAll: regexp_extract_sql, 560 exp.RegexpReplace: regexp_replace_sql, 561 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 562 exp.RegexpSplit: rename_func("SPLIT"), 563 exp.Right: right_to_substring_sql, 564 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 565 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 566 exp.Split: lambda self, e: self.func( 567 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 568 ), 569 exp.Select: transforms.preprocess( 570 [ 571 transforms.eliminate_qualify, 572 transforms.eliminate_distinct_on, 573 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 574 transforms.any_to_exists, 575 ] 576 ), 577 exp.StrPosition: lambda self, e: strposition_sql( 578 self, e, func_name="LOCATE", supports_position=True 579 ), 580 exp.StrToDate: _str_to_date_sql, 581 exp.StrToTime: _str_to_time_sql, 582 exp.StrToUnix: _str_to_unix_sql, 583 exp.StructExtract: struct_extract_sql, 584 exp.StarMap: rename_func("MAP"), 585 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 586 exp.TimeStrToDate: rename_func("TO_DATE"), 587 exp.TimeStrToTime: timestrtotime_sql, 588 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 589 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 590 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 591 exp.ToBase64: rename_func("BASE64"), 592 exp.TsOrDiToDi: lambda self, 593 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 594 exp.TsOrDsAdd: _add_date_sql, 595 exp.TsOrDsDiff: _date_diff_sql, 596 exp.TsOrDsToDate: _to_date_sql, 597 exp.TryCast: no_trycast_sql, 598 exp.Unicode: rename_func("ASCII"), 599 exp.UnixToStr: lambda self, e: self.func( 600 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 601 ), 602 exp.UnixToTime: _unix_to_time_sql, 603 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 604 exp.Unnest: rename_func("EXPLODE"), 605 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 606 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 607 exp.National: lambda self, e: self.national_sql(e, prefix=""), 608 exp.ClusteredColumnConstraint: lambda self, 609 e: f"({self.expressions(e, 'this', indent=False)})", 610 exp.NonClusteredColumnConstraint: lambda self, 611 e: f"({self.expressions(e, 'this', indent=False)})", 612 exp.NotForReplicationColumnConstraint: lambda *_: "", 613 exp.OnProperty: lambda *_: "", 614 exp.PartitionedByBucket: lambda self, e: self.func("BUCKET", e.expression, e.this), 615 exp.PartitionByTruncate: lambda self, e: self.func("TRUNCATE", e.expression, e.this), 616 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 617 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 618 exp.DayOfMonth: rename_func("DAYOFMONTH"), 619 exp.DayOfWeek: rename_func("DAYOFWEEK"), 620 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 621 rename_func("LEVENSHTEIN") 622 ), 623 } 624 625 PROPERTIES_LOCATION = { 626 **generator.Generator.PROPERTIES_LOCATION, 627 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 628 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 629 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 630 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 631 } 632 633 def unnest_sql(self, expression: exp.Unnest) -> str: 634 return rename_func("EXPLODE")(self, expression) 635 636 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 637 if isinstance(expression.this, exp.JSONPathWildcard): 638 self.unsupported("Unsupported wildcard in JSONPathKey expression") 639 return "" 640 641 return super()._jsonpathkey_sql(expression) 642 643 def parameter_sql(self, expression: exp.Parameter) -> str: 644 this = self.sql(expression, "this") 645 expression_sql = self.sql(expression, "expression") 646 647 parent = expression.parent 648 this = f"{this}:{expression_sql}" if expression_sql else this 649 650 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 651 # We need to produce SET key = value instead of SET ${key} = value 652 return this 653 654 return f"${{{this}}}" 655 656 def schema_sql(self, expression: exp.Schema) -> str: 657 for ordered in expression.find_all(exp.Ordered): 658 if ordered.args.get("desc") is False: 659 ordered.set("desc", None) 660 661 return super().schema_sql(expression) 662 663 def constraint_sql(self, expression: exp.Constraint) -> str: 664 for prop in list(expression.find_all(exp.Properties)): 665 prop.pop() 666 667 this = self.sql(expression, "this") 668 expressions = self.expressions(expression, sep=" ", flat=True) 669 return f"CONSTRAINT {this} {expressions}" 670 671 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 672 serde_props = self.sql(expression, "serde_properties") 673 serde_props = f" {serde_props}" if serde_props else "" 674 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 675 676 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 677 return self.func( 678 "COLLECT_LIST", 679 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 680 ) 681 682 def datatype_sql(self, expression: exp.DataType) -> str: 683 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 684 not expression.expressions or expression.expressions[0].name == "MAX" 685 ): 686 expression = exp.DataType.build("text") 687 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 688 expression.set("this", exp.DataType.Type.VARCHAR) 689 elif expression.this in exp.DataType.TEMPORAL_TYPES: 690 expression = exp.DataType.build(expression.this) 691 elif expression.is_type("float"): 692 size_expression = expression.find(exp.DataTypeParam) 693 if size_expression: 694 size = int(size_expression.name) 695 expression = ( 696 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 697 ) 698 699 return super().datatype_sql(expression) 700 701 def version_sql(self, expression: exp.Version) -> str: 702 sql = super().version_sql(expression) 703 return sql.replace("FOR ", "", 1) 704 705 def struct_sql(self, expression: exp.Struct) -> str: 706 values = [] 707 708 for i, e in enumerate(expression.expressions): 709 if isinstance(e, exp.PropertyEQ): 710 self.unsupported("Hive does not support named structs.") 711 values.append(e.expression) 712 else: 713 values.append(e) 714 715 return self.func("STRUCT", *values) 716 717 def alterset_sql(self, expression: exp.AlterSet) -> str: 718 exprs = self.expressions(expression, flat=True) 719 exprs = f" {exprs}" if exprs else "" 720 location = self.sql(expression, "location") 721 location = f" LOCATION {location}" if location else "" 722 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 723 file_format = f" FILEFORMAT {file_format}" if file_format else "" 724 serde = self.sql(expression, "serde") 725 serde = f" SERDE {serde}" if serde else "" 726 tags = self.expressions(expression, key="tag", flat=True, sep="") 727 tags = f" TAGS {tags}" if tags else "" 728 729 return f"SET{serde}{exprs}{location}{file_format}{tags}" 730 731 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 732 prefix = "WITH " if expression.args.get("with") else "" 733 exprs = self.expressions(expression, flat=True) 734 735 return f"{prefix}SERDEPROPERTIES ({exprs})" 736 737 def exists_sql(self, expression: exp.Exists) -> str: 738 if expression.expression: 739 return self.function_fallback_sql(expression) 740 741 return super().exists_sql(expression) 742 743 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 744 this = expression.this 745 if isinstance(this, exp.TimeStrToTime): 746 this = this.this 747 748 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}}}
243 class Tokenizer(tokens.Tokenizer): 244 QUOTES = ["'", '"'] 245 IDENTIFIERS = ["`"] 246 STRING_ESCAPES = ["\\"] 247 248 SINGLE_TOKENS = { 249 **tokens.Tokenizer.SINGLE_TOKENS, 250 "$": TokenType.PARAMETER, 251 } 252 253 KEYWORDS = { 254 **tokens.Tokenizer.KEYWORDS, 255 "ADD ARCHIVE": TokenType.COMMAND, 256 "ADD ARCHIVES": TokenType.COMMAND, 257 "ADD FILE": TokenType.COMMAND, 258 "ADD FILES": TokenType.COMMAND, 259 "ADD JAR": TokenType.COMMAND, 260 "ADD JARS": TokenType.COMMAND, 261 "MINUS": TokenType.EXCEPT, 262 "MSCK REPAIR": TokenType.COMMAND, 263 "REFRESH": TokenType.REFRESH, 264 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 265 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 266 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 267 } 268 269 NUMERIC_LITERALS = { 270 "L": "BIGINT", 271 "S": "SMALLINT", 272 "Y": "TINYINT", 273 "D": "DOUBLE", 274 "F": "FLOAT", 275 "BD": "DECIMAL", 276 }
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
278 class Parser(parser.Parser): 279 LOG_DEFAULTS_TO_LN = True 280 STRICT_CAST = False 281 VALUES_FOLLOWED_BY_PAREN = False 282 283 FUNCTIONS = { 284 **parser.Parser.FUNCTIONS, 285 "ASCII": exp.Unicode.from_arg_list, 286 "BASE64": exp.ToBase64.from_arg_list, 287 "COLLECT_LIST": lambda args: exp.ArrayAgg(this=seq_get(args, 0), nulls_excluded=True), 288 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 289 "DATE_ADD": lambda args: exp.TsOrDsAdd( 290 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 291 ), 292 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 293 [ 294 exp.TimeStrToTime(this=seq_get(args, 0)), 295 seq_get(args, 1), 296 ] 297 ), 298 "DATE_SUB": lambda args: exp.TsOrDsAdd( 299 this=seq_get(args, 0), 300 expression=exp.Mul(this=seq_get(args, 1), expression=exp.Literal.number(-1)), 301 unit=exp.Literal.string("DAY"), 302 ), 303 "DATEDIFF": lambda args: exp.DateDiff( 304 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 305 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 306 ), 307 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 308 "FIRST": _build_with_ignore_nulls(exp.First), 309 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 310 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 311 "GET_JSON_OBJECT": lambda args, dialect: exp.JSONExtractScalar( 312 this=seq_get(args, 0), expression=dialect.to_json_path(seq_get(args, 1)) 313 ), 314 "LAST": _build_with_ignore_nulls(exp.Last), 315 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 316 "MAP": parser.build_var_map, 317 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 318 "PERCENTILE": exp.Quantile.from_arg_list, 319 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 320 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 321 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 322 "SEQUENCE": exp.GenerateSeries.from_arg_list, 323 "SIZE": exp.ArraySize.from_arg_list, 324 "SPLIT": exp.RegexpSplit.from_arg_list, 325 "STR_TO_MAP": lambda args: exp.StrToMap( 326 this=seq_get(args, 0), 327 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 328 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 329 ), 330 "TO_DATE": _build_to_date, 331 "TO_JSON": exp.JSONFormat.from_arg_list, 332 "TRUNC": exp.TimestampTrunc.from_arg_list, 333 "UNBASE64": exp.FromBase64.from_arg_list, 334 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 335 args or [exp.CurrentTimestamp()] 336 ), 337 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 338 } 339 340 NO_PAREN_FUNCTION_PARSERS = { 341 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 342 "TRANSFORM": lambda self: self._parse_transform(), 343 } 344 345 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 346 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 347 348 PROPERTY_PARSERS = { 349 **parser.Parser.PROPERTY_PARSERS, 350 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 351 expressions=self._parse_wrapped_csv(self._parse_property) 352 ), 353 } 354 355 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 356 if not self._match(TokenType.L_PAREN, advance=False): 357 self._retreat(self._index - 1) 358 return None 359 360 args = self._parse_wrapped_csv(self._parse_lambda) 361 row_format_before = self._parse_row_format(match_row=True) 362 363 record_writer = None 364 if self._match_text_seq("RECORDWRITER"): 365 record_writer = self._parse_string() 366 367 if not self._match(TokenType.USING): 368 return exp.Transform.from_arg_list(args) 369 370 command_script = self._parse_string() 371 372 self._match(TokenType.ALIAS) 373 schema = self._parse_schema() 374 375 row_format_after = self._parse_row_format(match_row=True) 376 record_reader = None 377 if self._match_text_seq("RECORDREADER"): 378 record_reader = self._parse_string() 379 380 return self.expression( 381 exp.QueryTransform, 382 expressions=args, 383 command_script=command_script, 384 schema=schema, 385 row_format_before=row_format_before, 386 record_writer=record_writer, 387 row_format_after=row_format_after, 388 record_reader=record_reader, 389 ) 390 391 def _parse_types( 392 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 393 ) -> t.Optional[exp.Expression]: 394 """ 395 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 396 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 397 398 spark-sql (default)> select cast(1234 as varchar(2)); 399 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 400 char/varchar type and simply treats them as string type. Please use string type 401 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 402 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 403 404 1234 405 Time taken: 4.265 seconds, Fetched 1 row(s) 406 407 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 408 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 409 410 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 411 """ 412 this = super()._parse_types( 413 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 414 ) 415 416 if this and not schema: 417 return this.transform( 418 lambda node: ( 419 node.replace(exp.DataType.build("text")) 420 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 421 else node 422 ), 423 copy=False, 424 ) 425 426 return this 427 428 def _parse_partition_and_order( 429 self, 430 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 431 return ( 432 ( 433 self._parse_csv(self._parse_assignment) 434 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 435 else [] 436 ), 437 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 438 ) 439 440 def _parse_parameter(self) -> exp.Parameter: 441 self._match(TokenType.L_BRACE) 442 this = self._parse_identifier() or self._parse_primary_or_var() 443 expression = self._match(TokenType.COLON) and ( 444 self._parse_identifier() or self._parse_primary_or_var() 445 ) 446 self._match(TokenType.R_BRACE) 447 return self.expression(exp.Parameter, this=this, expression=expression) 448 449 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 450 if expression.is_star: 451 return expression 452 453 if isinstance(expression, exp.Column): 454 key = expression.this 455 else: 456 key = exp.to_identifier(f"col{index + 1}") 457 458 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.UTINYINT: 'UTINYINT'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.TAG: 'TAG'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.VAR: 'VAR'>, <TokenType.ROWS: 'ROWS'>, <TokenType.DELETE: 'DELETE'>, <TokenType.LEFT: 'LEFT'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.INT256: 'INT256'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.PUT: 'PUT'>, <TokenType.FINAL: 'FINAL'>, <TokenType.CASE: 'CASE'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.NULL: 'NULL'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.SHOW: 'SHOW'>, <TokenType.CUBE: 'CUBE'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.KEEP: 'KEEP'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.DESC: 'DESC'>, <TokenType.NEXT: 'NEXT'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.FILE_FORMAT: 'FILE_FORMAT'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.SOME: 'SOME'>, <TokenType.UINT256: 'UINT256'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.SUPER: 'SUPER'>, <TokenType.ANY: 'ANY'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.CHAR: 'CHAR'>, <TokenType.NATURAL: 'NATURAL'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.TOP: 'TOP'>, <TokenType.KILL: 'KILL'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.TIME: 'TIME'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.UUID: 'UUID'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.LOAD: 'LOAD'>, <TokenType.MAP: 'MAP'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.ASOF: 'ASOF'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.MERGE: 'MERGE'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.DATE: 'DATE'>, <TokenType.BINARY: 'BINARY'>, <TokenType.JSON: 'JSON'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.INET: 'INET'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.MODEL: 'MODEL'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.STAGE: 'STAGE'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.ASC: 'ASC'>, <TokenType.ALL: 'ALL'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.JSONB: 'JSONB'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.YEAR: 'YEAR'>, <TokenType.DIV: 'DIV'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.RENAME: 'RENAME'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.FULL: 'FULL'>, <TokenType.TABLE: 'TABLE'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.INDEX: 'INDEX'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.END: 'END'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.UINT128: 'UINT128'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.UINT: 'UINT'>, <TokenType.APPLY: 'APPLY'>, <TokenType.RANGE: 'RANGE'>, <TokenType.ROW: 'ROW'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.FALSE: 'FALSE'>, <TokenType.FILTER: 'FILTER'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.SINK: 'SINK'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.CACHE: 'CACHE'>, <TokenType.LIST: 'LIST'>, <TokenType.DATE32: 'DATE32'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.SET: 'SET'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.INT: 'INT'>, <TokenType.POINT: 'POINT'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.TEXT: 'TEXT'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.RING: 'RING'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.TRUE: 'TRUE'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.BIT: 'BIT'>, <TokenType.INT128: 'INT128'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.MONEY: 'MONEY'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.FIRST: 'FIRST'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.NAME: 'NAME'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.DETACH: 'DETACH'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.XML: 'XML'>, <TokenType.VIEW: 'VIEW'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.ENUM: 'ENUM'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.ANTI: 'ANTI'>, <TokenType.COPY: 'COPY'>, <TokenType.SEMI: 'SEMI'>, <TokenType.IPV6: 'IPV6'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.USE: 'USE'>, <TokenType.IS: 'IS'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.IPV4: 'IPV4'>, <TokenType.BLOB: 'BLOB'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.REFERENCES: 'REFERENCES'>}
TABLE_ALIAS_TOKENS =
{<TokenType.UTINYINT: 'UTINYINT'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.TAG: 'TAG'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.VAR: 'VAR'>, <TokenType.ROWS: 'ROWS'>, <TokenType.DELETE: 'DELETE'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.INT256: 'INT256'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.PUT: 'PUT'>, <TokenType.FINAL: 'FINAL'>, <TokenType.CASE: 'CASE'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.NULL: 'NULL'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.SHOW: 'SHOW'>, <TokenType.CUBE: 'CUBE'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.KEEP: 'KEEP'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.DESC: 'DESC'>, <TokenType.NEXT: 'NEXT'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.FILE_FORMAT: 'FILE_FORMAT'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.SOME: 'SOME'>, <TokenType.UINT256: 'UINT256'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.SUPER: 'SUPER'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.CHAR: 'CHAR'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.TOP: 'TOP'>, <TokenType.KILL: 'KILL'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.TIME: 'TIME'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.UUID: 'UUID'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.LOAD: 'LOAD'>, <TokenType.MAP: 'MAP'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.MERGE: 'MERGE'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.DATE: 'DATE'>, <TokenType.BINARY: 'BINARY'>, <TokenType.JSON: 'JSON'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.INET: 'INET'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.MODEL: 'MODEL'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.STAGE: 'STAGE'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.ASC: 'ASC'>, <TokenType.ALL: 'ALL'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.JSONB: 'JSONB'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.YEAR: 'YEAR'>, <TokenType.DIV: 'DIV'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.RENAME: 'RENAME'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.TABLE: 'TABLE'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.INDEX: 'INDEX'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.END: 'END'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.UINT128: 'UINT128'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.UINT: 'UINT'>, <TokenType.RANGE: 'RANGE'>, <TokenType.ROW: 'ROW'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.FALSE: 'FALSE'>, <TokenType.FILTER: 'FILTER'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.SINK: 'SINK'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.CACHE: 'CACHE'>, <TokenType.LIST: 'LIST'>, <TokenType.DATE32: 'DATE32'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.SET: 'SET'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.INT: 'INT'>, <TokenType.POINT: 'POINT'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.TEXT: 'TEXT'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.RING: 'RING'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.TRUE: 'TRUE'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.BIT: 'BIT'>, <TokenType.INT128: 'INT128'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.MONEY: 'MONEY'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.FIRST: 'FIRST'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.NAME: 'NAME'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.DETACH: 'DETACH'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.XML: 'XML'>, <TokenType.VIEW: 'VIEW'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.ENUM: 'ENUM'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.COPY: 'COPY'>, <TokenType.IPV6: 'IPV6'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.USE: 'USE'>, <TokenType.IS: 'IS'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.IPV4: 'IPV4'>, <TokenType.BLOB: 'BLOB'>, <TokenType.ANY: 'ANY'>, <TokenType.REFERENCES: 'REFERENCES'>}
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
- 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
460 class Generator(generator.Generator): 461 LIMIT_FETCH = "LIMIT" 462 TABLESAMPLE_WITH_METHOD = False 463 JOIN_HINTS = False 464 TABLE_HINTS = False 465 QUERY_HINTS = False 466 INDEX_ON = "ON TABLE" 467 EXTRACT_ALLOWS_QUOTES = False 468 NVL2_SUPPORTED = False 469 LAST_DAY_SUPPORTS_DATE_PART = False 470 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 471 SUPPORTS_TO_NUMBER = False 472 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 473 PARSE_JSON_NAME: t.Optional[str] = None 474 PAD_FILL_PATTERN_IS_REQUIRED = True 475 SUPPORTS_MEDIAN = False 476 ARRAY_SIZE_NAME = "SIZE" 477 478 EXPRESSIONS_WITHOUT_NESTED_CTES = { 479 exp.Insert, 480 exp.Select, 481 exp.Subquery, 482 exp.SetOperation, 483 } 484 485 SUPPORTED_JSON_PATH_PARTS = { 486 exp.JSONPathKey, 487 exp.JSONPathRoot, 488 exp.JSONPathSubscript, 489 exp.JSONPathWildcard, 490 } 491 492 TYPE_MAPPING = { 493 **generator.Generator.TYPE_MAPPING, 494 exp.DataType.Type.BIT: "BOOLEAN", 495 exp.DataType.Type.BLOB: "BINARY", 496 exp.DataType.Type.DATETIME: "TIMESTAMP", 497 exp.DataType.Type.ROWVERSION: "BINARY", 498 exp.DataType.Type.TEXT: "STRING", 499 exp.DataType.Type.TIME: "TIMESTAMP", 500 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 501 exp.DataType.Type.UTINYINT: "SMALLINT", 502 exp.DataType.Type.VARBINARY: "BINARY", 503 } 504 505 TRANSFORMS = { 506 **generator.Generator.TRANSFORMS, 507 exp.Group: transforms.preprocess([transforms.unalias_group]), 508 exp.Property: property_sql, 509 exp.AnyValue: rename_func("FIRST"), 510 exp.ApproxDistinct: approx_count_distinct_sql, 511 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 512 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 513 exp.ArrayConcat: rename_func("CONCAT"), 514 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 515 exp.ArraySort: _array_sort_sql, 516 exp.With: no_recursive_cte_sql, 517 exp.DateAdd: _add_date_sql, 518 exp.DateDiff: _date_diff_sql, 519 exp.DateStrToDate: datestrtodate_sql, 520 exp.DateSub: _add_date_sql, 521 exp.DateToDi: lambda self, 522 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 523 exp.DiToDate: lambda self, 524 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 525 exp.FileFormatProperty: lambda self, 526 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 527 exp.StorageHandlerProperty: lambda self, e: f"STORED BY {self.sql(e, 'this')}", 528 exp.FromBase64: rename_func("UNBASE64"), 529 exp.GenerateSeries: sequence_sql, 530 exp.GenerateDateArray: sequence_sql, 531 exp.If: if_sql(), 532 exp.ILike: no_ilike_sql, 533 exp.IsNan: rename_func("ISNAN"), 534 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 535 exp.JSONExtractScalar: lambda self, e: self.func( 536 "GET_JSON_OBJECT", e.this, e.expression 537 ), 538 exp.JSONFormat: _json_format_sql, 539 exp.Left: left_to_substring_sql, 540 exp.Map: var_map_sql, 541 exp.Max: max_or_greatest, 542 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 543 exp.Min: min_or_least, 544 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 545 exp.NotNullColumnConstraint: lambda _, e: ( 546 "" if e.args.get("allow_null") else "NOT NULL" 547 ), 548 exp.VarMap: var_map_sql, 549 exp.Create: preprocess( 550 [ 551 remove_unique_constraints, 552 ctas_with_tmp_tables_to_create_tmp_view, 553 move_schema_columns_to_partitioned_by, 554 ] 555 ), 556 exp.Quantile: rename_func("PERCENTILE"), 557 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 558 exp.RegexpExtract: regexp_extract_sql, 559 exp.RegexpExtractAll: regexp_extract_sql, 560 exp.RegexpReplace: regexp_replace_sql, 561 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 562 exp.RegexpSplit: rename_func("SPLIT"), 563 exp.Right: right_to_substring_sql, 564 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 565 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 566 exp.Split: lambda self, e: self.func( 567 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 568 ), 569 exp.Select: transforms.preprocess( 570 [ 571 transforms.eliminate_qualify, 572 transforms.eliminate_distinct_on, 573 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 574 transforms.any_to_exists, 575 ] 576 ), 577 exp.StrPosition: lambda self, e: strposition_sql( 578 self, e, func_name="LOCATE", supports_position=True 579 ), 580 exp.StrToDate: _str_to_date_sql, 581 exp.StrToTime: _str_to_time_sql, 582 exp.StrToUnix: _str_to_unix_sql, 583 exp.StructExtract: struct_extract_sql, 584 exp.StarMap: rename_func("MAP"), 585 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 586 exp.TimeStrToDate: rename_func("TO_DATE"), 587 exp.TimeStrToTime: timestrtotime_sql, 588 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 589 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 590 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 591 exp.ToBase64: rename_func("BASE64"), 592 exp.TsOrDiToDi: lambda self, 593 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 594 exp.TsOrDsAdd: _add_date_sql, 595 exp.TsOrDsDiff: _date_diff_sql, 596 exp.TsOrDsToDate: _to_date_sql, 597 exp.TryCast: no_trycast_sql, 598 exp.Unicode: rename_func("ASCII"), 599 exp.UnixToStr: lambda self, e: self.func( 600 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 601 ), 602 exp.UnixToTime: _unix_to_time_sql, 603 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 604 exp.Unnest: rename_func("EXPLODE"), 605 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 606 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 607 exp.National: lambda self, e: self.national_sql(e, prefix=""), 608 exp.ClusteredColumnConstraint: lambda self, 609 e: f"({self.expressions(e, 'this', indent=False)})", 610 exp.NonClusteredColumnConstraint: lambda self, 611 e: f"({self.expressions(e, 'this', indent=False)})", 612 exp.NotForReplicationColumnConstraint: lambda *_: "", 613 exp.OnProperty: lambda *_: "", 614 exp.PartitionedByBucket: lambda self, e: self.func("BUCKET", e.expression, e.this), 615 exp.PartitionByTruncate: lambda self, e: self.func("TRUNCATE", e.expression, e.this), 616 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 617 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 618 exp.DayOfMonth: rename_func("DAYOFMONTH"), 619 exp.DayOfWeek: rename_func("DAYOFWEEK"), 620 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 621 rename_func("LEVENSHTEIN") 622 ), 623 } 624 625 PROPERTIES_LOCATION = { 626 **generator.Generator.PROPERTIES_LOCATION, 627 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 628 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 629 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 630 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 631 } 632 633 def unnest_sql(self, expression: exp.Unnest) -> str: 634 return rename_func("EXPLODE")(self, expression) 635 636 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 637 if isinstance(expression.this, exp.JSONPathWildcard): 638 self.unsupported("Unsupported wildcard in JSONPathKey expression") 639 return "" 640 641 return super()._jsonpathkey_sql(expression) 642 643 def parameter_sql(self, expression: exp.Parameter) -> str: 644 this = self.sql(expression, "this") 645 expression_sql = self.sql(expression, "expression") 646 647 parent = expression.parent 648 this = f"{this}:{expression_sql}" if expression_sql else this 649 650 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 651 # We need to produce SET key = value instead of SET ${key} = value 652 return this 653 654 return f"${{{this}}}" 655 656 def schema_sql(self, expression: exp.Schema) -> str: 657 for ordered in expression.find_all(exp.Ordered): 658 if ordered.args.get("desc") is False: 659 ordered.set("desc", None) 660 661 return super().schema_sql(expression) 662 663 def constraint_sql(self, expression: exp.Constraint) -> str: 664 for prop in list(expression.find_all(exp.Properties)): 665 prop.pop() 666 667 this = self.sql(expression, "this") 668 expressions = self.expressions(expression, sep=" ", flat=True) 669 return f"CONSTRAINT {this} {expressions}" 670 671 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 672 serde_props = self.sql(expression, "serde_properties") 673 serde_props = f" {serde_props}" if serde_props else "" 674 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 675 676 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 677 return self.func( 678 "COLLECT_LIST", 679 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 680 ) 681 682 def datatype_sql(self, expression: exp.DataType) -> str: 683 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 684 not expression.expressions or expression.expressions[0].name == "MAX" 685 ): 686 expression = exp.DataType.build("text") 687 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 688 expression.set("this", exp.DataType.Type.VARCHAR) 689 elif expression.this in exp.DataType.TEMPORAL_TYPES: 690 expression = exp.DataType.build(expression.this) 691 elif expression.is_type("float"): 692 size_expression = expression.find(exp.DataTypeParam) 693 if size_expression: 694 size = int(size_expression.name) 695 expression = ( 696 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 697 ) 698 699 return super().datatype_sql(expression) 700 701 def version_sql(self, expression: exp.Version) -> str: 702 sql = super().version_sql(expression) 703 return sql.replace("FOR ", "", 1) 704 705 def struct_sql(self, expression: exp.Struct) -> str: 706 values = [] 707 708 for i, e in enumerate(expression.expressions): 709 if isinstance(e, exp.PropertyEQ): 710 self.unsupported("Hive does not support named structs.") 711 values.append(e.expression) 712 else: 713 values.append(e) 714 715 return self.func("STRUCT", *values) 716 717 def alterset_sql(self, expression: exp.AlterSet) -> str: 718 exprs = self.expressions(expression, flat=True) 719 exprs = f" {exprs}" if exprs else "" 720 location = self.sql(expression, "location") 721 location = f" LOCATION {location}" if location else "" 722 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 723 file_format = f" FILEFORMAT {file_format}" if file_format else "" 724 serde = self.sql(expression, "serde") 725 serde = f" SERDE {serde}" if serde else "" 726 tags = self.expressions(expression, key="tag", flat=True, sep="") 727 tags = f" TAGS {tags}" if tags else "" 728 729 return f"SET{serde}{exprs}{location}{file_format}{tags}" 730 731 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 732 prefix = "WITH " if expression.args.get("with") else "" 733 exprs = self.expressions(expression, flat=True) 734 735 return f"{prefix}SERDEPROPERTIES ({exprs})" 736 737 def exists_sql(self, expression: exp.Exists) -> str: 738 if expression.expression: 739 return self.function_fallback_sql(expression) 740 741 return super().exists_sql(expression) 742 743 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 744 this = expression.this 745 if isinstance(this, exp.TimeStrToTime): 746 this = this.this 747 748 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.Select'>, <class 'sqlglot.expressions.SetOperation'>, <class 'sqlglot.expressions.Insert'>, <class 'sqlglot.expressions.Subquery'>}
SUPPORTED_JSON_PATH_PARTS =
{<class 'sqlglot.expressions.JSONPathKey'>, <class 'sqlglot.expressions.JSONPathWildcard'>, <class 'sqlglot.expressions.JSONPathSubscript'>, <class 'sqlglot.expressions.JSONPathRoot'>}
TYPE_MAPPING =
{<Type.DATETIME2: 'DATETIME2'>: 'TIMESTAMP', <Type.NCHAR: 'NCHAR'>: 'CHAR', <Type.NVARCHAR: 'NVARCHAR'>: 'VARCHAR', <Type.MEDIUMTEXT: 'MEDIUMTEXT'>: 'TEXT', <Type.LONGTEXT: 'LONGTEXT'>: 'TEXT', <Type.TINYTEXT: 'TINYTEXT'>: 'TEXT', <Type.BLOB: 'BLOB'>: 'BINARY', <Type.MEDIUMBLOB: 'MEDIUMBLOB'>: 'BLOB', <Type.LONGBLOB: 'LONGBLOB'>: 'BLOB', <Type.TINYBLOB: 'TINYBLOB'>: 'BLOB', <Type.INET: 'INET'>: 'INET', <Type.ROWVERSION: 'ROWVERSION'>: 'BINARY', <Type.SMALLDATETIME: 'SMALLDATETIME'>: 'TIMESTAMP', <Type.BIT: 'BIT'>: 'BOOLEAN', <Type.DATETIME: 'DATETIME'>: 'TIMESTAMP', <Type.TEXT: 'TEXT'>: 'STRING', <Type.TIME: 'TIME'>: 'TIMESTAMP', <Type.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.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.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'>}
643 def parameter_sql(self, expression: exp.Parameter) -> str: 644 this = self.sql(expression, "this") 645 expression_sql = self.sql(expression, "expression") 646 647 parent = expression.parent 648 this = f"{this}:{expression_sql}" if expression_sql else this 649 650 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 651 # We need to produce SET key = value instead of SET ${key} = value 652 return this 653 654 return f"${{{this}}}"
def
rowformatserdeproperty_sql(self, expression: sqlglot.expressions.RowFormatSerdeProperty) -> str:
682 def datatype_sql(self, expression: exp.DataType) -> str: 683 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 684 not expression.expressions or expression.expressions[0].name == "MAX" 685 ): 686 expression = exp.DataType.build("text") 687 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 688 expression.set("this", exp.DataType.Type.VARCHAR) 689 elif expression.this in exp.DataType.TEMPORAL_TYPES: 690 expression = exp.DataType.build(expression.this) 691 elif expression.is_type("float"): 692 size_expression = expression.find(exp.DataTypeParam) 693 if size_expression: 694 size = int(size_expression.name) 695 expression = ( 696 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 697 ) 698 699 return super().datatype_sql(expression)
705 def struct_sql(self, expression: exp.Struct) -> str: 706 values = [] 707 708 for i, e in enumerate(expression.expressions): 709 if isinstance(e, exp.PropertyEQ): 710 self.unsupported("Hive does not support named structs.") 711 values.append(e.expression) 712 else: 713 values.append(e) 714 715 return self.func("STRUCT", *values)
717 def alterset_sql(self, expression: exp.AlterSet) -> str: 718 exprs = self.expressions(expression, flat=True) 719 exprs = f" {exprs}" if exprs else "" 720 location = self.sql(expression, "location") 721 location = f" LOCATION {location}" if location else "" 722 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 723 file_format = f" FILEFORMAT {file_format}" if file_format else "" 724 serde = self.sql(expression, "serde") 725 serde = f" SERDE {serde}" if serde else "" 726 tags = self.expressions(expression, key="tag", flat=True, sep="") 727 tags = f" TAGS {tags}" if tags else "" 728 729 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
- put_sql