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": exp.JSONExtractScalar.from_arg_list, 311 "LAST": _build_with_ignore_nulls(exp.Last), 312 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 313 "MAP": parser.build_var_map, 314 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 315 "PERCENTILE": exp.Quantile.from_arg_list, 316 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 317 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 318 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 319 "SEQUENCE": exp.GenerateSeries.from_arg_list, 320 "SIZE": exp.ArraySize.from_arg_list, 321 "SPLIT": exp.RegexpSplit.from_arg_list, 322 "STR_TO_MAP": lambda args: exp.StrToMap( 323 this=seq_get(args, 0), 324 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 325 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 326 ), 327 "TO_DATE": _build_to_date, 328 "TO_JSON": exp.JSONFormat.from_arg_list, 329 "TRUNC": exp.TimestampTrunc.from_arg_list, 330 "UNBASE64": exp.FromBase64.from_arg_list, 331 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 332 args or [exp.CurrentTimestamp()] 333 ), 334 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 335 } 336 337 NO_PAREN_FUNCTION_PARSERS = { 338 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 339 "TRANSFORM": lambda self: self._parse_transform(), 340 } 341 342 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 343 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 344 345 PROPERTY_PARSERS = { 346 **parser.Parser.PROPERTY_PARSERS, 347 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 348 expressions=self._parse_wrapped_csv(self._parse_property) 349 ), 350 } 351 352 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 353 if not self._match(TokenType.L_PAREN, advance=False): 354 self._retreat(self._index - 1) 355 return None 356 357 args = self._parse_wrapped_csv(self._parse_lambda) 358 row_format_before = self._parse_row_format(match_row=True) 359 360 record_writer = None 361 if self._match_text_seq("RECORDWRITER"): 362 record_writer = self._parse_string() 363 364 if not self._match(TokenType.USING): 365 return exp.Transform.from_arg_list(args) 366 367 command_script = self._parse_string() 368 369 self._match(TokenType.ALIAS) 370 schema = self._parse_schema() 371 372 row_format_after = self._parse_row_format(match_row=True) 373 record_reader = None 374 if self._match_text_seq("RECORDREADER"): 375 record_reader = self._parse_string() 376 377 return self.expression( 378 exp.QueryTransform, 379 expressions=args, 380 command_script=command_script, 381 schema=schema, 382 row_format_before=row_format_before, 383 record_writer=record_writer, 384 row_format_after=row_format_after, 385 record_reader=record_reader, 386 ) 387 388 def _parse_types( 389 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 390 ) -> t.Optional[exp.Expression]: 391 """ 392 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 393 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 394 395 spark-sql (default)> select cast(1234 as varchar(2)); 396 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 397 char/varchar type and simply treats them as string type. Please use string type 398 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 399 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 400 401 1234 402 Time taken: 4.265 seconds, Fetched 1 row(s) 403 404 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 405 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 406 407 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 408 """ 409 this = super()._parse_types( 410 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 411 ) 412 413 if this and not schema: 414 return this.transform( 415 lambda node: ( 416 node.replace(exp.DataType.build("text")) 417 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 418 else node 419 ), 420 copy=False, 421 ) 422 423 return this 424 425 def _parse_partition_and_order( 426 self, 427 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 428 return ( 429 ( 430 self._parse_csv(self._parse_assignment) 431 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 432 else [] 433 ), 434 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 435 ) 436 437 def _parse_parameter(self) -> exp.Parameter: 438 self._match(TokenType.L_BRACE) 439 this = self._parse_identifier() or self._parse_primary_or_var() 440 expression = self._match(TokenType.COLON) and ( 441 self._parse_identifier() or self._parse_primary_or_var() 442 ) 443 self._match(TokenType.R_BRACE) 444 return self.expression(exp.Parameter, this=this, expression=expression) 445 446 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 447 if expression.is_star: 448 return expression 449 450 if isinstance(expression, exp.Column): 451 key = expression.this 452 else: 453 key = exp.to_identifier(f"col{index + 1}") 454 455 return self.expression(exp.PropertyEQ, this=key, expression=expression) 456 457 class Generator(generator.Generator): 458 LIMIT_FETCH = "LIMIT" 459 TABLESAMPLE_WITH_METHOD = False 460 JOIN_HINTS = False 461 TABLE_HINTS = False 462 QUERY_HINTS = False 463 INDEX_ON = "ON TABLE" 464 EXTRACT_ALLOWS_QUOTES = False 465 NVL2_SUPPORTED = False 466 LAST_DAY_SUPPORTS_DATE_PART = False 467 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 468 SUPPORTS_TO_NUMBER = False 469 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 470 PARSE_JSON_NAME: t.Optional[str] = None 471 PAD_FILL_PATTERN_IS_REQUIRED = True 472 SUPPORTS_MEDIAN = False 473 ARRAY_SIZE_NAME = "SIZE" 474 475 EXPRESSIONS_WITHOUT_NESTED_CTES = { 476 exp.Insert, 477 exp.Select, 478 exp.Subquery, 479 exp.SetOperation, 480 } 481 482 SUPPORTED_JSON_PATH_PARTS = { 483 exp.JSONPathKey, 484 exp.JSONPathRoot, 485 exp.JSONPathSubscript, 486 exp.JSONPathWildcard, 487 } 488 489 TYPE_MAPPING = { 490 **generator.Generator.TYPE_MAPPING, 491 exp.DataType.Type.BIT: "BOOLEAN", 492 exp.DataType.Type.BLOB: "BINARY", 493 exp.DataType.Type.DATETIME: "TIMESTAMP", 494 exp.DataType.Type.ROWVERSION: "BINARY", 495 exp.DataType.Type.TEXT: "STRING", 496 exp.DataType.Type.TIME: "TIMESTAMP", 497 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 498 exp.DataType.Type.UTINYINT: "SMALLINT", 499 exp.DataType.Type.VARBINARY: "BINARY", 500 } 501 502 TRANSFORMS = { 503 **generator.Generator.TRANSFORMS, 504 exp.Group: transforms.preprocess([transforms.unalias_group]), 505 exp.Property: property_sql, 506 exp.AnyValue: rename_func("FIRST"), 507 exp.ApproxDistinct: approx_count_distinct_sql, 508 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 509 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 510 exp.ArrayConcat: rename_func("CONCAT"), 511 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 512 exp.ArraySort: _array_sort_sql, 513 exp.With: no_recursive_cte_sql, 514 exp.DateAdd: _add_date_sql, 515 exp.DateDiff: _date_diff_sql, 516 exp.DateStrToDate: datestrtodate_sql, 517 exp.DateSub: _add_date_sql, 518 exp.DateToDi: lambda self, 519 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 520 exp.DiToDate: lambda self, 521 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 522 exp.FileFormatProperty: lambda self, 523 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 524 exp.StorageHandlerProperty: lambda self, e: f"STORED BY {self.sql(e, 'this')}", 525 exp.FromBase64: rename_func("UNBASE64"), 526 exp.GenerateSeries: sequence_sql, 527 exp.GenerateDateArray: sequence_sql, 528 exp.If: if_sql(), 529 exp.ILike: no_ilike_sql, 530 exp.IsNan: rename_func("ISNAN"), 531 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 532 exp.JSONExtractScalar: lambda self, e: self.func( 533 "GET_JSON_OBJECT", e.this, e.expression 534 ), 535 exp.JSONFormat: _json_format_sql, 536 exp.Left: left_to_substring_sql, 537 exp.Map: var_map_sql, 538 exp.Max: max_or_greatest, 539 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 540 exp.Min: min_or_least, 541 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 542 exp.NotNullColumnConstraint: lambda _, e: ( 543 "" if e.args.get("allow_null") else "NOT NULL" 544 ), 545 exp.VarMap: var_map_sql, 546 exp.Create: preprocess( 547 [ 548 remove_unique_constraints, 549 ctas_with_tmp_tables_to_create_tmp_view, 550 move_schema_columns_to_partitioned_by, 551 ] 552 ), 553 exp.Quantile: rename_func("PERCENTILE"), 554 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 555 exp.RegexpExtract: regexp_extract_sql, 556 exp.RegexpExtractAll: regexp_extract_sql, 557 exp.RegexpReplace: regexp_replace_sql, 558 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 559 exp.RegexpSplit: rename_func("SPLIT"), 560 exp.Right: right_to_substring_sql, 561 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 562 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 563 exp.Split: lambda self, e: self.func( 564 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 565 ), 566 exp.Select: transforms.preprocess( 567 [ 568 transforms.eliminate_qualify, 569 transforms.eliminate_distinct_on, 570 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 571 transforms.any_to_exists, 572 ] 573 ), 574 exp.StrPosition: lambda self, e: strposition_sql( 575 self, e, func_name="LOCATE", supports_position=True 576 ), 577 exp.StrToDate: _str_to_date_sql, 578 exp.StrToTime: _str_to_time_sql, 579 exp.StrToUnix: _str_to_unix_sql, 580 exp.StructExtract: struct_extract_sql, 581 exp.StarMap: rename_func("MAP"), 582 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 583 exp.TimeStrToDate: rename_func("TO_DATE"), 584 exp.TimeStrToTime: timestrtotime_sql, 585 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 586 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 587 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 588 exp.ToBase64: rename_func("BASE64"), 589 exp.TsOrDiToDi: lambda self, 590 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 591 exp.TsOrDsAdd: _add_date_sql, 592 exp.TsOrDsDiff: _date_diff_sql, 593 exp.TsOrDsToDate: _to_date_sql, 594 exp.TryCast: no_trycast_sql, 595 exp.Unicode: rename_func("ASCII"), 596 exp.UnixToStr: lambda self, e: self.func( 597 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 598 ), 599 exp.UnixToTime: _unix_to_time_sql, 600 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 601 exp.Unnest: rename_func("EXPLODE"), 602 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 603 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 604 exp.National: lambda self, e: self.national_sql(e, prefix=""), 605 exp.ClusteredColumnConstraint: lambda self, 606 e: f"({self.expressions(e, 'this', indent=False)})", 607 exp.NonClusteredColumnConstraint: lambda self, 608 e: f"({self.expressions(e, 'this', indent=False)})", 609 exp.NotForReplicationColumnConstraint: lambda *_: "", 610 exp.OnProperty: lambda *_: "", 611 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 612 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 613 exp.DayOfMonth: rename_func("DAYOFMONTH"), 614 exp.DayOfWeek: rename_func("DAYOFWEEK"), 615 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 616 rename_func("LEVENSHTEIN") 617 ), 618 } 619 620 PROPERTIES_LOCATION = { 621 **generator.Generator.PROPERTIES_LOCATION, 622 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 623 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 624 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 625 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 626 } 627 628 def unnest_sql(self, expression: exp.Unnest) -> str: 629 return rename_func("EXPLODE")(self, expression) 630 631 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 632 if isinstance(expression.this, exp.JSONPathWildcard): 633 self.unsupported("Unsupported wildcard in JSONPathKey expression") 634 return "" 635 636 return super()._jsonpathkey_sql(expression) 637 638 def parameter_sql(self, expression: exp.Parameter) -> str: 639 this = self.sql(expression, "this") 640 expression_sql = self.sql(expression, "expression") 641 642 parent = expression.parent 643 this = f"{this}:{expression_sql}" if expression_sql else this 644 645 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 646 # We need to produce SET key = value instead of SET ${key} = value 647 return this 648 649 return f"${{{this}}}" 650 651 def schema_sql(self, expression: exp.Schema) -> str: 652 for ordered in expression.find_all(exp.Ordered): 653 if ordered.args.get("desc") is False: 654 ordered.set("desc", None) 655 656 return super().schema_sql(expression) 657 658 def constraint_sql(self, expression: exp.Constraint) -> str: 659 for prop in list(expression.find_all(exp.Properties)): 660 prop.pop() 661 662 this = self.sql(expression, "this") 663 expressions = self.expressions(expression, sep=" ", flat=True) 664 return f"CONSTRAINT {this} {expressions}" 665 666 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 667 serde_props = self.sql(expression, "serde_properties") 668 serde_props = f" {serde_props}" if serde_props else "" 669 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 670 671 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 672 return self.func( 673 "COLLECT_LIST", 674 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 675 ) 676 677 def datatype_sql(self, expression: exp.DataType) -> str: 678 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 679 not expression.expressions or expression.expressions[0].name == "MAX" 680 ): 681 expression = exp.DataType.build("text") 682 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 683 expression.set("this", exp.DataType.Type.VARCHAR) 684 elif expression.this in exp.DataType.TEMPORAL_TYPES: 685 expression = exp.DataType.build(expression.this) 686 elif expression.is_type("float"): 687 size_expression = expression.find(exp.DataTypeParam) 688 if size_expression: 689 size = int(size_expression.name) 690 expression = ( 691 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 692 ) 693 694 return super().datatype_sql(expression) 695 696 def version_sql(self, expression: exp.Version) -> str: 697 sql = super().version_sql(expression) 698 return sql.replace("FOR ", "", 1) 699 700 def struct_sql(self, expression: exp.Struct) -> str: 701 values = [] 702 703 for i, e in enumerate(expression.expressions): 704 if isinstance(e, exp.PropertyEQ): 705 self.unsupported("Hive does not support named structs.") 706 values.append(e.expression) 707 else: 708 values.append(e) 709 710 return self.func("STRUCT", *values) 711 712 def alterset_sql(self, expression: exp.AlterSet) -> str: 713 exprs = self.expressions(expression, flat=True) 714 exprs = f" {exprs}" if exprs else "" 715 location = self.sql(expression, "location") 716 location = f" LOCATION {location}" if location else "" 717 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 718 file_format = f" FILEFORMAT {file_format}" if file_format else "" 719 serde = self.sql(expression, "serde") 720 serde = f" SERDE {serde}" if serde else "" 721 tags = self.expressions(expression, key="tag", flat=True, sep="") 722 tags = f" TAGS {tags}" if tags else "" 723 724 return f"SET{serde}{exprs}{location}{file_format}{tags}" 725 726 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 727 prefix = "WITH " if expression.args.get("with") else "" 728 exprs = self.expressions(expression, flat=True) 729 730 return f"{prefix}SERDEPROPERTIES ({exprs})" 731 732 def exists_sql(self, expression: exp.Exists) -> str: 733 if expression.expression: 734 return self.function_fallback_sql(expression) 735 736 return super().exists_sql(expression) 737 738 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 739 this = expression.this 740 if isinstance(this, exp.TimeStrToTime): 741 this = this.this 742 743 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": exp.JSONExtractScalar.from_arg_list, 312 "LAST": _build_with_ignore_nulls(exp.Last), 313 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 314 "MAP": parser.build_var_map, 315 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 316 "PERCENTILE": exp.Quantile.from_arg_list, 317 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 318 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 319 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 320 "SEQUENCE": exp.GenerateSeries.from_arg_list, 321 "SIZE": exp.ArraySize.from_arg_list, 322 "SPLIT": exp.RegexpSplit.from_arg_list, 323 "STR_TO_MAP": lambda args: exp.StrToMap( 324 this=seq_get(args, 0), 325 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 326 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 327 ), 328 "TO_DATE": _build_to_date, 329 "TO_JSON": exp.JSONFormat.from_arg_list, 330 "TRUNC": exp.TimestampTrunc.from_arg_list, 331 "UNBASE64": exp.FromBase64.from_arg_list, 332 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 333 args or [exp.CurrentTimestamp()] 334 ), 335 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 336 } 337 338 NO_PAREN_FUNCTION_PARSERS = { 339 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 340 "TRANSFORM": lambda self: self._parse_transform(), 341 } 342 343 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 344 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 345 346 PROPERTY_PARSERS = { 347 **parser.Parser.PROPERTY_PARSERS, 348 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 349 expressions=self._parse_wrapped_csv(self._parse_property) 350 ), 351 } 352 353 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 354 if not self._match(TokenType.L_PAREN, advance=False): 355 self._retreat(self._index - 1) 356 return None 357 358 args = self._parse_wrapped_csv(self._parse_lambda) 359 row_format_before = self._parse_row_format(match_row=True) 360 361 record_writer = None 362 if self._match_text_seq("RECORDWRITER"): 363 record_writer = self._parse_string() 364 365 if not self._match(TokenType.USING): 366 return exp.Transform.from_arg_list(args) 367 368 command_script = self._parse_string() 369 370 self._match(TokenType.ALIAS) 371 schema = self._parse_schema() 372 373 row_format_after = self._parse_row_format(match_row=True) 374 record_reader = None 375 if self._match_text_seq("RECORDREADER"): 376 record_reader = self._parse_string() 377 378 return self.expression( 379 exp.QueryTransform, 380 expressions=args, 381 command_script=command_script, 382 schema=schema, 383 row_format_before=row_format_before, 384 record_writer=record_writer, 385 row_format_after=row_format_after, 386 record_reader=record_reader, 387 ) 388 389 def _parse_types( 390 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 391 ) -> t.Optional[exp.Expression]: 392 """ 393 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 394 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 395 396 spark-sql (default)> select cast(1234 as varchar(2)); 397 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 398 char/varchar type and simply treats them as string type. Please use string type 399 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 400 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 401 402 1234 403 Time taken: 4.265 seconds, Fetched 1 row(s) 404 405 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 406 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 407 408 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 409 """ 410 this = super()._parse_types( 411 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 412 ) 413 414 if this and not schema: 415 return this.transform( 416 lambda node: ( 417 node.replace(exp.DataType.build("text")) 418 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 419 else node 420 ), 421 copy=False, 422 ) 423 424 return this 425 426 def _parse_partition_and_order( 427 self, 428 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 429 return ( 430 ( 431 self._parse_csv(self._parse_assignment) 432 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 433 else [] 434 ), 435 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 436 ) 437 438 def _parse_parameter(self) -> exp.Parameter: 439 self._match(TokenType.L_BRACE) 440 this = self._parse_identifier() or self._parse_primary_or_var() 441 expression = self._match(TokenType.COLON) and ( 442 self._parse_identifier() or self._parse_primary_or_var() 443 ) 444 self._match(TokenType.R_BRACE) 445 return self.expression(exp.Parameter, this=this, expression=expression) 446 447 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 448 if expression.is_star: 449 return expression 450 451 if isinstance(expression, exp.Column): 452 key = expression.this 453 else: 454 key = exp.to_identifier(f"col{index + 1}") 455 456 return self.expression(exp.PropertyEQ, this=key, expression=expression) 457 458 class Generator(generator.Generator): 459 LIMIT_FETCH = "LIMIT" 460 TABLESAMPLE_WITH_METHOD = False 461 JOIN_HINTS = False 462 TABLE_HINTS = False 463 QUERY_HINTS = False 464 INDEX_ON = "ON TABLE" 465 EXTRACT_ALLOWS_QUOTES = False 466 NVL2_SUPPORTED = False 467 LAST_DAY_SUPPORTS_DATE_PART = False 468 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 469 SUPPORTS_TO_NUMBER = False 470 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 471 PARSE_JSON_NAME: t.Optional[str] = None 472 PAD_FILL_PATTERN_IS_REQUIRED = True 473 SUPPORTS_MEDIAN = False 474 ARRAY_SIZE_NAME = "SIZE" 475 476 EXPRESSIONS_WITHOUT_NESTED_CTES = { 477 exp.Insert, 478 exp.Select, 479 exp.Subquery, 480 exp.SetOperation, 481 } 482 483 SUPPORTED_JSON_PATH_PARTS = { 484 exp.JSONPathKey, 485 exp.JSONPathRoot, 486 exp.JSONPathSubscript, 487 exp.JSONPathWildcard, 488 } 489 490 TYPE_MAPPING = { 491 **generator.Generator.TYPE_MAPPING, 492 exp.DataType.Type.BIT: "BOOLEAN", 493 exp.DataType.Type.BLOB: "BINARY", 494 exp.DataType.Type.DATETIME: "TIMESTAMP", 495 exp.DataType.Type.ROWVERSION: "BINARY", 496 exp.DataType.Type.TEXT: "STRING", 497 exp.DataType.Type.TIME: "TIMESTAMP", 498 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 499 exp.DataType.Type.UTINYINT: "SMALLINT", 500 exp.DataType.Type.VARBINARY: "BINARY", 501 } 502 503 TRANSFORMS = { 504 **generator.Generator.TRANSFORMS, 505 exp.Group: transforms.preprocess([transforms.unalias_group]), 506 exp.Property: property_sql, 507 exp.AnyValue: rename_func("FIRST"), 508 exp.ApproxDistinct: approx_count_distinct_sql, 509 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 510 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 511 exp.ArrayConcat: rename_func("CONCAT"), 512 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 513 exp.ArraySort: _array_sort_sql, 514 exp.With: no_recursive_cte_sql, 515 exp.DateAdd: _add_date_sql, 516 exp.DateDiff: _date_diff_sql, 517 exp.DateStrToDate: datestrtodate_sql, 518 exp.DateSub: _add_date_sql, 519 exp.DateToDi: lambda self, 520 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 521 exp.DiToDate: lambda self, 522 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 523 exp.FileFormatProperty: lambda self, 524 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 525 exp.StorageHandlerProperty: lambda self, e: f"STORED BY {self.sql(e, 'this')}", 526 exp.FromBase64: rename_func("UNBASE64"), 527 exp.GenerateSeries: sequence_sql, 528 exp.GenerateDateArray: sequence_sql, 529 exp.If: if_sql(), 530 exp.ILike: no_ilike_sql, 531 exp.IsNan: rename_func("ISNAN"), 532 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 533 exp.JSONExtractScalar: lambda self, e: self.func( 534 "GET_JSON_OBJECT", e.this, e.expression 535 ), 536 exp.JSONFormat: _json_format_sql, 537 exp.Left: left_to_substring_sql, 538 exp.Map: var_map_sql, 539 exp.Max: max_or_greatest, 540 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 541 exp.Min: min_or_least, 542 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 543 exp.NotNullColumnConstraint: lambda _, e: ( 544 "" if e.args.get("allow_null") else "NOT NULL" 545 ), 546 exp.VarMap: var_map_sql, 547 exp.Create: preprocess( 548 [ 549 remove_unique_constraints, 550 ctas_with_tmp_tables_to_create_tmp_view, 551 move_schema_columns_to_partitioned_by, 552 ] 553 ), 554 exp.Quantile: rename_func("PERCENTILE"), 555 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 556 exp.RegexpExtract: regexp_extract_sql, 557 exp.RegexpExtractAll: regexp_extract_sql, 558 exp.RegexpReplace: regexp_replace_sql, 559 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 560 exp.RegexpSplit: rename_func("SPLIT"), 561 exp.Right: right_to_substring_sql, 562 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 563 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 564 exp.Split: lambda self, e: self.func( 565 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 566 ), 567 exp.Select: transforms.preprocess( 568 [ 569 transforms.eliminate_qualify, 570 transforms.eliminate_distinct_on, 571 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 572 transforms.any_to_exists, 573 ] 574 ), 575 exp.StrPosition: lambda self, e: strposition_sql( 576 self, e, func_name="LOCATE", supports_position=True 577 ), 578 exp.StrToDate: _str_to_date_sql, 579 exp.StrToTime: _str_to_time_sql, 580 exp.StrToUnix: _str_to_unix_sql, 581 exp.StructExtract: struct_extract_sql, 582 exp.StarMap: rename_func("MAP"), 583 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 584 exp.TimeStrToDate: rename_func("TO_DATE"), 585 exp.TimeStrToTime: timestrtotime_sql, 586 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 587 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 588 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 589 exp.ToBase64: rename_func("BASE64"), 590 exp.TsOrDiToDi: lambda self, 591 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 592 exp.TsOrDsAdd: _add_date_sql, 593 exp.TsOrDsDiff: _date_diff_sql, 594 exp.TsOrDsToDate: _to_date_sql, 595 exp.TryCast: no_trycast_sql, 596 exp.Unicode: rename_func("ASCII"), 597 exp.UnixToStr: lambda self, e: self.func( 598 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 599 ), 600 exp.UnixToTime: _unix_to_time_sql, 601 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 602 exp.Unnest: rename_func("EXPLODE"), 603 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 604 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 605 exp.National: lambda self, e: self.national_sql(e, prefix=""), 606 exp.ClusteredColumnConstraint: lambda self, 607 e: f"({self.expressions(e, 'this', indent=False)})", 608 exp.NonClusteredColumnConstraint: lambda self, 609 e: f"({self.expressions(e, 'this', indent=False)})", 610 exp.NotForReplicationColumnConstraint: lambda *_: "", 611 exp.OnProperty: lambda *_: "", 612 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 613 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 614 exp.DayOfMonth: rename_func("DAYOFMONTH"), 615 exp.DayOfWeek: rename_func("DAYOFWEEK"), 616 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 617 rename_func("LEVENSHTEIN") 618 ), 619 } 620 621 PROPERTIES_LOCATION = { 622 **generator.Generator.PROPERTIES_LOCATION, 623 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 624 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 625 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 626 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 627 } 628 629 def unnest_sql(self, expression: exp.Unnest) -> str: 630 return rename_func("EXPLODE")(self, expression) 631 632 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 633 if isinstance(expression.this, exp.JSONPathWildcard): 634 self.unsupported("Unsupported wildcard in JSONPathKey expression") 635 return "" 636 637 return super()._jsonpathkey_sql(expression) 638 639 def parameter_sql(self, expression: exp.Parameter) -> str: 640 this = self.sql(expression, "this") 641 expression_sql = self.sql(expression, "expression") 642 643 parent = expression.parent 644 this = f"{this}:{expression_sql}" if expression_sql else this 645 646 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 647 # We need to produce SET key = value instead of SET ${key} = value 648 return this 649 650 return f"${{{this}}}" 651 652 def schema_sql(self, expression: exp.Schema) -> str: 653 for ordered in expression.find_all(exp.Ordered): 654 if ordered.args.get("desc") is False: 655 ordered.set("desc", None) 656 657 return super().schema_sql(expression) 658 659 def constraint_sql(self, expression: exp.Constraint) -> str: 660 for prop in list(expression.find_all(exp.Properties)): 661 prop.pop() 662 663 this = self.sql(expression, "this") 664 expressions = self.expressions(expression, sep=" ", flat=True) 665 return f"CONSTRAINT {this} {expressions}" 666 667 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 668 serde_props = self.sql(expression, "serde_properties") 669 serde_props = f" {serde_props}" if serde_props else "" 670 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 671 672 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 673 return self.func( 674 "COLLECT_LIST", 675 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 676 ) 677 678 def datatype_sql(self, expression: exp.DataType) -> str: 679 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 680 not expression.expressions or expression.expressions[0].name == "MAX" 681 ): 682 expression = exp.DataType.build("text") 683 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 684 expression.set("this", exp.DataType.Type.VARCHAR) 685 elif expression.this in exp.DataType.TEMPORAL_TYPES: 686 expression = exp.DataType.build(expression.this) 687 elif expression.is_type("float"): 688 size_expression = expression.find(exp.DataTypeParam) 689 if size_expression: 690 size = int(size_expression.name) 691 expression = ( 692 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 693 ) 694 695 return super().datatype_sql(expression) 696 697 def version_sql(self, expression: exp.Version) -> str: 698 sql = super().version_sql(expression) 699 return sql.replace("FOR ", "", 1) 700 701 def struct_sql(self, expression: exp.Struct) -> str: 702 values = [] 703 704 for i, e in enumerate(expression.expressions): 705 if isinstance(e, exp.PropertyEQ): 706 self.unsupported("Hive does not support named structs.") 707 values.append(e.expression) 708 else: 709 values.append(e) 710 711 return self.func("STRUCT", *values) 712 713 def alterset_sql(self, expression: exp.AlterSet) -> str: 714 exprs = self.expressions(expression, flat=True) 715 exprs = f" {exprs}" if exprs else "" 716 location = self.sql(expression, "location") 717 location = f" LOCATION {location}" if location else "" 718 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 719 file_format = f" FILEFORMAT {file_format}" if file_format else "" 720 serde = self.sql(expression, "serde") 721 serde = f" SERDE {serde}" if serde else "" 722 tags = self.expressions(expression, key="tag", flat=True, sep="") 723 tags = f" TAGS {tags}" if tags else "" 724 725 return f"SET{serde}{exprs}{location}{file_format}{tags}" 726 727 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 728 prefix = "WITH " if expression.args.get("with") else "" 729 exprs = self.expressions(expression, flat=True) 730 731 return f"{prefix}SERDEPROPERTIES ({exprs})" 732 733 def exists_sql(self, expression: exp.Exists) -> str: 734 if expression.expression: 735 return self.function_fallback_sql(expression) 736 737 return super().exists_sql(expression) 738 739 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 740 this = expression.this 741 if isinstance(this, exp.TimeStrToTime): 742 this = this.this 743 744 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": exp.JSONExtractScalar.from_arg_list, 312 "LAST": _build_with_ignore_nulls(exp.Last), 313 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 314 "MAP": parser.build_var_map, 315 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 316 "PERCENTILE": exp.Quantile.from_arg_list, 317 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 318 "REGEXP_EXTRACT": build_regexp_extract(exp.RegexpExtract), 319 "REGEXP_EXTRACT_ALL": build_regexp_extract(exp.RegexpExtractAll), 320 "SEQUENCE": exp.GenerateSeries.from_arg_list, 321 "SIZE": exp.ArraySize.from_arg_list, 322 "SPLIT": exp.RegexpSplit.from_arg_list, 323 "STR_TO_MAP": lambda args: exp.StrToMap( 324 this=seq_get(args, 0), 325 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 326 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 327 ), 328 "TO_DATE": _build_to_date, 329 "TO_JSON": exp.JSONFormat.from_arg_list, 330 "TRUNC": exp.TimestampTrunc.from_arg_list, 331 "UNBASE64": exp.FromBase64.from_arg_list, 332 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 333 args or [exp.CurrentTimestamp()] 334 ), 335 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 336 } 337 338 NO_PAREN_FUNCTION_PARSERS = { 339 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 340 "TRANSFORM": lambda self: self._parse_transform(), 341 } 342 343 NO_PAREN_FUNCTIONS = parser.Parser.NO_PAREN_FUNCTIONS.copy() 344 NO_PAREN_FUNCTIONS.pop(TokenType.CURRENT_TIME) 345 346 PROPERTY_PARSERS = { 347 **parser.Parser.PROPERTY_PARSERS, 348 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 349 expressions=self._parse_wrapped_csv(self._parse_property) 350 ), 351 } 352 353 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 354 if not self._match(TokenType.L_PAREN, advance=False): 355 self._retreat(self._index - 1) 356 return None 357 358 args = self._parse_wrapped_csv(self._parse_lambda) 359 row_format_before = self._parse_row_format(match_row=True) 360 361 record_writer = None 362 if self._match_text_seq("RECORDWRITER"): 363 record_writer = self._parse_string() 364 365 if not self._match(TokenType.USING): 366 return exp.Transform.from_arg_list(args) 367 368 command_script = self._parse_string() 369 370 self._match(TokenType.ALIAS) 371 schema = self._parse_schema() 372 373 row_format_after = self._parse_row_format(match_row=True) 374 record_reader = None 375 if self._match_text_seq("RECORDREADER"): 376 record_reader = self._parse_string() 377 378 return self.expression( 379 exp.QueryTransform, 380 expressions=args, 381 command_script=command_script, 382 schema=schema, 383 row_format_before=row_format_before, 384 record_writer=record_writer, 385 row_format_after=row_format_after, 386 record_reader=record_reader, 387 ) 388 389 def _parse_types( 390 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 391 ) -> t.Optional[exp.Expression]: 392 """ 393 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 394 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 395 396 spark-sql (default)> select cast(1234 as varchar(2)); 397 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 398 char/varchar type and simply treats them as string type. Please use string type 399 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 400 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 401 402 1234 403 Time taken: 4.265 seconds, Fetched 1 row(s) 404 405 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 406 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 407 408 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 409 """ 410 this = super()._parse_types( 411 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 412 ) 413 414 if this and not schema: 415 return this.transform( 416 lambda node: ( 417 node.replace(exp.DataType.build("text")) 418 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 419 else node 420 ), 421 copy=False, 422 ) 423 424 return this 425 426 def _parse_partition_and_order( 427 self, 428 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 429 return ( 430 ( 431 self._parse_csv(self._parse_assignment) 432 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 433 else [] 434 ), 435 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 436 ) 437 438 def _parse_parameter(self) -> exp.Parameter: 439 self._match(TokenType.L_BRACE) 440 this = self._parse_identifier() or self._parse_primary_or_var() 441 expression = self._match(TokenType.COLON) and ( 442 self._parse_identifier() or self._parse_primary_or_var() 443 ) 444 self._match(TokenType.R_BRACE) 445 return self.expression(exp.Parameter, this=this, expression=expression) 446 447 def _to_prop_eq(self, expression: exp.Expression, index: int) -> exp.Expression: 448 if expression.is_star: 449 return expression 450 451 if isinstance(expression, exp.Column): 452 key = expression.this 453 else: 454 key = exp.to_identifier(f"col{index + 1}") 455 456 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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.JSONExtractScalar'>>, '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.PROCEDURE: 'PROCEDURE'>, <TokenType.IS: 'IS'>, <TokenType.LOAD: 'LOAD'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.KILL: 'KILL'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.NULL: 'NULL'>, <TokenType.SEMI: 'SEMI'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.ENUM: 'ENUM'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.ANY: 'ANY'>, <TokenType.UINT256: 'UINT256'>, <TokenType.TEXT: 'TEXT'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.UUID: 'UUID'>, <TokenType.CACHE: 'CACHE'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.RING: 'RING'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.POINT: 'POINT'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.MODEL: 'MODEL'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.PUT: 'PUT'>, <TokenType.SINK: 'SINK'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.NATURAL: 'NATURAL'>, <TokenType.TIME: 'TIME'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.INET: 'INET'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.FILTER: 'FILTER'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.CUBE: 'CUBE'>, <TokenType.IPV6: 'IPV6'>, <TokenType.BIT: 'BIT'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.INT128: 'INT128'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.JSONB: 'JSONB'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.SHOW: 'SHOW'>, <TokenType.IPV4: 'IPV4'>, <TokenType.INT: 'INT'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.APPLY: 'APPLY'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.DETACH: 'DETACH'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.MAP: 'MAP'>, <TokenType.NEXT: 'NEXT'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.ROWS: 'ROWS'>, <TokenType.END: 'END'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.DESC: 'DESC'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.RANGE: 'RANGE'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.XML: 'XML'>, <TokenType.USE: 'USE'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.TRUE: 'TRUE'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.ROW: 'ROW'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.INT256: 'INT256'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.VAR: 'VAR'>, <TokenType.LEFT: 'LEFT'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.SET: 'SET'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.DIV: 'DIV'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.VIEW: 'VIEW'>, <TokenType.ANTI: 'ANTI'>, <TokenType.BINARY: 'BINARY'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.FINAL: 'FINAL'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.RENAME: 'RENAME'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.DATE32: 'DATE32'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.TAG: 'TAG'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.YEAR: 'YEAR'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.MONEY: 'MONEY'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.FALSE: 'FALSE'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.NESTED: 'NESTED'>, <TokenType.FIRST: 'FIRST'>, <TokenType.CHAR: 'CHAR'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.BLOB: 'BLOB'>, <TokenType.INDEX: 'INDEX'>, <TokenType.LIST: 'LIST'>, <TokenType.NAME: 'NAME'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.DELETE: 'DELETE'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.ASC: 'ASC'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.JSON: 'JSON'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.MERGE: 'MERGE'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.FULL: 'FULL'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.TOP: 'TOP'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.CASE: 'CASE'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.SOME: 'SOME'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.ALL: 'ALL'>, <TokenType.DATE: 'DATE'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.TABLE: 'TABLE'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.COPY: 'COPY'>, <TokenType.ASOF: 'ASOF'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.UINT128: 'UINT128'>, <TokenType.KEEP: 'KEEP'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.UINT: 'UINT'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.SUPER: 'SUPER'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>}
TABLE_ALIAS_TOKENS =
{<TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.IS: 'IS'>, <TokenType.LOAD: 'LOAD'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.KILL: 'KILL'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.NULL: 'NULL'>, <TokenType.SOURCE: 'SOURCE'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.MULTILINESTRING: 'MULTILINESTRING'>, <TokenType.ENUM: 'ENUM'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.ANY: 'ANY'>, <TokenType.UINT256: 'UINT256'>, <TokenType.TEXT: 'TEXT'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.UDOUBLE: 'UDOUBLE'>, <TokenType.NAMESPACE: 'NAMESPACE'>, <TokenType.UUID: 'UUID'>, <TokenType.CACHE: 'CACHE'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.RING: 'RING'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.POINT: 'POINT'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.MODEL: 'MODEL'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.PUT: 'PUT'>, <TokenType.SINK: 'SINK'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.TIME: 'TIME'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.INET: 'INET'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.FILTER: 'FILTER'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.CUBE: 'CUBE'>, <TokenType.IPV6: 'IPV6'>, <TokenType.BIT: 'BIT'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.INT128: 'INT128'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.ATTACH: 'ATTACH'>, <TokenType.JSONB: 'JSONB'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.SHOW: 'SHOW'>, <TokenType.IPV4: 'IPV4'>, <TokenType.INT: 'INT'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.CURRENT_SCHEMA: 'CURRENT_SCHEMA'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.DETACH: 'DETACH'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.MAP: 'MAP'>, <TokenType.NEXT: 'NEXT'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.ROWS: 'ROWS'>, <TokenType.END: 'END'>, <TokenType.ROLLUP: 'ROLLUP'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.DESC: 'DESC'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.ORDINALITY: 'ORDINALITY'>, <TokenType.RANGE: 'RANGE'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.XML: 'XML'>, <TokenType.USE: 'USE'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.EXPORT: 'EXPORT'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.TRUE: 'TRUE'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.ROW: 'ROW'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.INT256: 'INT256'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.VAR: 'VAR'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.SET: 'SET'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.DIV: 'DIV'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.MULTIPOLYGON: 'MULTIPOLYGON'>, <TokenType.DECIMAL64: 'DECIMAL64'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.VIEW: 'VIEW'>, <TokenType.BINARY: 'BINARY'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.FINAL: 'FINAL'>, <TokenType.POLYGON: 'POLYGON'>, <TokenType.RENAME: 'RENAME'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.DATE32: 'DATE32'>, <TokenType.LIMIT: 'LIMIT'>, <TokenType.TAG: 'TAG'>, <TokenType.DECIMAL256: 'DECIMAL256'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.YEAR: 'YEAR'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.MONEY: 'MONEY'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.SMALLDATETIME: 'SMALLDATETIME'>, <TokenType.FALSE: 'FALSE'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.DYNAMIC: 'DYNAMIC'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.NESTED: 'NESTED'>, <TokenType.FIRST: 'FIRST'>, <TokenType.CHAR: 'CHAR'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.BLOB: 'BLOB'>, <TokenType.INDEX: 'INDEX'>, <TokenType.LIST: 'LIST'>, <TokenType.NAME: 'NAME'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.DELETE: 'DELETE'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.ASC: 'ASC'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.JSON: 'JSON'>, <TokenType.DECIMAL32: 'DECIMAL32'>, <TokenType.MERGE: 'MERGE'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.DECIMAL128: 'DECIMAL128'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.TOP: 'TOP'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.CASE: 'CASE'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.LINESTRING: 'LINESTRING'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.SOME: 'SOME'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.ALL: 'ALL'>, <TokenType.DATE: 'DATE'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.TABLE: 'TABLE'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.COPY: 'COPY'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.UINT128: 'UINT128'>, <TokenType.KEEP: 'KEEP'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.DATETIME2: 'DATETIME2'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.UINT: 'UINT'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.SUPER: 'SUPER'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>}
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
- errors
- sql
458 class Generator(generator.Generator): 459 LIMIT_FETCH = "LIMIT" 460 TABLESAMPLE_WITH_METHOD = False 461 JOIN_HINTS = False 462 TABLE_HINTS = False 463 QUERY_HINTS = False 464 INDEX_ON = "ON TABLE" 465 EXTRACT_ALLOWS_QUOTES = False 466 NVL2_SUPPORTED = False 467 LAST_DAY_SUPPORTS_DATE_PART = False 468 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 469 SUPPORTS_TO_NUMBER = False 470 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 471 PARSE_JSON_NAME: t.Optional[str] = None 472 PAD_FILL_PATTERN_IS_REQUIRED = True 473 SUPPORTS_MEDIAN = False 474 ARRAY_SIZE_NAME = "SIZE" 475 476 EXPRESSIONS_WITHOUT_NESTED_CTES = { 477 exp.Insert, 478 exp.Select, 479 exp.Subquery, 480 exp.SetOperation, 481 } 482 483 SUPPORTED_JSON_PATH_PARTS = { 484 exp.JSONPathKey, 485 exp.JSONPathRoot, 486 exp.JSONPathSubscript, 487 exp.JSONPathWildcard, 488 } 489 490 TYPE_MAPPING = { 491 **generator.Generator.TYPE_MAPPING, 492 exp.DataType.Type.BIT: "BOOLEAN", 493 exp.DataType.Type.BLOB: "BINARY", 494 exp.DataType.Type.DATETIME: "TIMESTAMP", 495 exp.DataType.Type.ROWVERSION: "BINARY", 496 exp.DataType.Type.TEXT: "STRING", 497 exp.DataType.Type.TIME: "TIMESTAMP", 498 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 499 exp.DataType.Type.UTINYINT: "SMALLINT", 500 exp.DataType.Type.VARBINARY: "BINARY", 501 } 502 503 TRANSFORMS = { 504 **generator.Generator.TRANSFORMS, 505 exp.Group: transforms.preprocess([transforms.unalias_group]), 506 exp.Property: property_sql, 507 exp.AnyValue: rename_func("FIRST"), 508 exp.ApproxDistinct: approx_count_distinct_sql, 509 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 510 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 511 exp.ArrayConcat: rename_func("CONCAT"), 512 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 513 exp.ArraySort: _array_sort_sql, 514 exp.With: no_recursive_cte_sql, 515 exp.DateAdd: _add_date_sql, 516 exp.DateDiff: _date_diff_sql, 517 exp.DateStrToDate: datestrtodate_sql, 518 exp.DateSub: _add_date_sql, 519 exp.DateToDi: lambda self, 520 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 521 exp.DiToDate: lambda self, 522 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 523 exp.FileFormatProperty: lambda self, 524 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 525 exp.StorageHandlerProperty: lambda self, e: f"STORED BY {self.sql(e, 'this')}", 526 exp.FromBase64: rename_func("UNBASE64"), 527 exp.GenerateSeries: sequence_sql, 528 exp.GenerateDateArray: sequence_sql, 529 exp.If: if_sql(), 530 exp.ILike: no_ilike_sql, 531 exp.IsNan: rename_func("ISNAN"), 532 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 533 exp.JSONExtractScalar: lambda self, e: self.func( 534 "GET_JSON_OBJECT", e.this, e.expression 535 ), 536 exp.JSONFormat: _json_format_sql, 537 exp.Left: left_to_substring_sql, 538 exp.Map: var_map_sql, 539 exp.Max: max_or_greatest, 540 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 541 exp.Min: min_or_least, 542 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 543 exp.NotNullColumnConstraint: lambda _, e: ( 544 "" if e.args.get("allow_null") else "NOT NULL" 545 ), 546 exp.VarMap: var_map_sql, 547 exp.Create: preprocess( 548 [ 549 remove_unique_constraints, 550 ctas_with_tmp_tables_to_create_tmp_view, 551 move_schema_columns_to_partitioned_by, 552 ] 553 ), 554 exp.Quantile: rename_func("PERCENTILE"), 555 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 556 exp.RegexpExtract: regexp_extract_sql, 557 exp.RegexpExtractAll: regexp_extract_sql, 558 exp.RegexpReplace: regexp_replace_sql, 559 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 560 exp.RegexpSplit: rename_func("SPLIT"), 561 exp.Right: right_to_substring_sql, 562 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 563 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 564 exp.Split: lambda self, e: self.func( 565 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression, "'\\\\E'") 566 ), 567 exp.Select: transforms.preprocess( 568 [ 569 transforms.eliminate_qualify, 570 transforms.eliminate_distinct_on, 571 partial(transforms.unnest_to_explode, unnest_using_arrays_zip=False), 572 transforms.any_to_exists, 573 ] 574 ), 575 exp.StrPosition: lambda self, e: strposition_sql( 576 self, e, func_name="LOCATE", supports_position=True 577 ), 578 exp.StrToDate: _str_to_date_sql, 579 exp.StrToTime: _str_to_time_sql, 580 exp.StrToUnix: _str_to_unix_sql, 581 exp.StructExtract: struct_extract_sql, 582 exp.StarMap: rename_func("MAP"), 583 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 584 exp.TimeStrToDate: rename_func("TO_DATE"), 585 exp.TimeStrToTime: timestrtotime_sql, 586 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 587 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 588 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 589 exp.ToBase64: rename_func("BASE64"), 590 exp.TsOrDiToDi: lambda self, 591 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 592 exp.TsOrDsAdd: _add_date_sql, 593 exp.TsOrDsDiff: _date_diff_sql, 594 exp.TsOrDsToDate: _to_date_sql, 595 exp.TryCast: no_trycast_sql, 596 exp.Unicode: rename_func("ASCII"), 597 exp.UnixToStr: lambda self, e: self.func( 598 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 599 ), 600 exp.UnixToTime: _unix_to_time_sql, 601 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 602 exp.Unnest: rename_func("EXPLODE"), 603 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 604 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 605 exp.National: lambda self, e: self.national_sql(e, prefix=""), 606 exp.ClusteredColumnConstraint: lambda self, 607 e: f"({self.expressions(e, 'this', indent=False)})", 608 exp.NonClusteredColumnConstraint: lambda self, 609 e: f"({self.expressions(e, 'this', indent=False)})", 610 exp.NotForReplicationColumnConstraint: lambda *_: "", 611 exp.OnProperty: lambda *_: "", 612 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 613 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 614 exp.DayOfMonth: rename_func("DAYOFMONTH"), 615 exp.DayOfWeek: rename_func("DAYOFWEEK"), 616 exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")( 617 rename_func("LEVENSHTEIN") 618 ), 619 } 620 621 PROPERTIES_LOCATION = { 622 **generator.Generator.PROPERTIES_LOCATION, 623 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 624 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 625 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 626 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 627 } 628 629 def unnest_sql(self, expression: exp.Unnest) -> str: 630 return rename_func("EXPLODE")(self, expression) 631 632 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 633 if isinstance(expression.this, exp.JSONPathWildcard): 634 self.unsupported("Unsupported wildcard in JSONPathKey expression") 635 return "" 636 637 return super()._jsonpathkey_sql(expression) 638 639 def parameter_sql(self, expression: exp.Parameter) -> str: 640 this = self.sql(expression, "this") 641 expression_sql = self.sql(expression, "expression") 642 643 parent = expression.parent 644 this = f"{this}:{expression_sql}" if expression_sql else this 645 646 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 647 # We need to produce SET key = value instead of SET ${key} = value 648 return this 649 650 return f"${{{this}}}" 651 652 def schema_sql(self, expression: exp.Schema) -> str: 653 for ordered in expression.find_all(exp.Ordered): 654 if ordered.args.get("desc") is False: 655 ordered.set("desc", None) 656 657 return super().schema_sql(expression) 658 659 def constraint_sql(self, expression: exp.Constraint) -> str: 660 for prop in list(expression.find_all(exp.Properties)): 661 prop.pop() 662 663 this = self.sql(expression, "this") 664 expressions = self.expressions(expression, sep=" ", flat=True) 665 return f"CONSTRAINT {this} {expressions}" 666 667 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 668 serde_props = self.sql(expression, "serde_properties") 669 serde_props = f" {serde_props}" if serde_props else "" 670 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 671 672 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 673 return self.func( 674 "COLLECT_LIST", 675 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 676 ) 677 678 def datatype_sql(self, expression: exp.DataType) -> str: 679 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 680 not expression.expressions or expression.expressions[0].name == "MAX" 681 ): 682 expression = exp.DataType.build("text") 683 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 684 expression.set("this", exp.DataType.Type.VARCHAR) 685 elif expression.this in exp.DataType.TEMPORAL_TYPES: 686 expression = exp.DataType.build(expression.this) 687 elif expression.is_type("float"): 688 size_expression = expression.find(exp.DataTypeParam) 689 if size_expression: 690 size = int(size_expression.name) 691 expression = ( 692 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 693 ) 694 695 return super().datatype_sql(expression) 696 697 def version_sql(self, expression: exp.Version) -> str: 698 sql = super().version_sql(expression) 699 return sql.replace("FOR ", "", 1) 700 701 def struct_sql(self, expression: exp.Struct) -> str: 702 values = [] 703 704 for i, e in enumerate(expression.expressions): 705 if isinstance(e, exp.PropertyEQ): 706 self.unsupported("Hive does not support named structs.") 707 values.append(e.expression) 708 else: 709 values.append(e) 710 711 return self.func("STRUCT", *values) 712 713 def alterset_sql(self, expression: exp.AlterSet) -> str: 714 exprs = self.expressions(expression, flat=True) 715 exprs = f" {exprs}" if exprs else "" 716 location = self.sql(expression, "location") 717 location = f" LOCATION {location}" if location else "" 718 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 719 file_format = f" FILEFORMAT {file_format}" if file_format else "" 720 serde = self.sql(expression, "serde") 721 serde = f" SERDE {serde}" if serde else "" 722 tags = self.expressions(expression, key="tag", flat=True, sep="") 723 tags = f" TAGS {tags}" if tags else "" 724 725 return f"SET{serde}{exprs}{location}{file_format}{tags}" 726 727 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 728 prefix = "WITH " if expression.args.get("with") else "" 729 exprs = self.expressions(expression, flat=True) 730 731 return f"{prefix}SERDEPROPERTIES ({exprs})" 732 733 def exists_sql(self, expression: exp.Exists) -> str: 734 if expression.expression: 735 return self.function_fallback_sql(expression) 736 737 return super().exists_sql(expression) 738 739 def timetostr_sql(self, expression: exp.TimeToStr) -> str: 740 this = expression.this 741 if isinstance(this, exp.TimeStrToTime): 742 this = this.this 743 744 return self.func("DATE_FORMAT", this, self.format_time(expression))
Generator converts a given syntax tree to the corresponding SQL string.
Arguments:
- pretty: Whether to format the produced SQL string. Default: False.
- identify: Determines when an identifier should be quoted. Possible values are: False (default): Never quote, except in cases where it's mandatory by the dialect. True or 'always': Always quote. 'safe': Only quote identifiers that are case insensitive.
- normalize: Whether to normalize identifiers to lowercase. Default: False.
- pad: The pad size in a formatted string. For example, this affects the indentation of a projection in a query, relative to its nesting level. Default: 2.
- indent: The indentation size in a formatted string. For example, this affects the
indentation of subqueries and filters under a
WHERE
clause. Default: 2. - normalize_functions: How to normalize function names. Possible values are: "upper" or True (default): Convert names to uppercase. "lower": Convert names to lowercase. False: Disables function name normalization.
- unsupported_level: Determines the generator's behavior when it encounters unsupported expressions. Default ErrorLevel.WARN.
- max_unsupported: Maximum number of unsupported messages to include in a raised UnsupportedError. This is only relevant if unsupported_level is ErrorLevel.RAISE. Default: 3
- leading_comma: Whether the comma is leading or trailing in select expressions. This is only relevant when generating in pretty mode. Default: False
- max_text_width: The max number of characters in a segment before creating new lines in pretty mode. The default is on the smaller end because the length only represents a segment and not the true line length. Default: 80
- comments: Whether to preserve comments in the output SQL code. Default: True
EXPRESSIONS_WITHOUT_NESTED_CTES =
{<class 'sqlglot.expressions.Insert'>, <class 'sqlglot.expressions.Select'>, <class 'sqlglot.expressions.SetOperation'>, <class 'sqlglot.expressions.Subquery'>}
SUPPORTED_JSON_PATH_PARTS =
{<class 'sqlglot.expressions.JSONPathSubscript'>, <class 'sqlglot.expressions.JSONPathRoot'>, <class 'sqlglot.expressions.JSONPathWildcard'>, <class 'sqlglot.expressions.JSONPathKey'>}
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.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.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'>}
639 def parameter_sql(self, expression: exp.Parameter) -> str: 640 this = self.sql(expression, "this") 641 expression_sql = self.sql(expression, "expression") 642 643 parent = expression.parent 644 this = f"{this}:{expression_sql}" if expression_sql else this 645 646 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 647 # We need to produce SET key = value instead of SET ${key} = value 648 return this 649 650 return f"${{{this}}}"
def
rowformatserdeproperty_sql(self, expression: sqlglot.expressions.RowFormatSerdeProperty) -> str:
678 def datatype_sql(self, expression: exp.DataType) -> str: 679 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 680 not expression.expressions or expression.expressions[0].name == "MAX" 681 ): 682 expression = exp.DataType.build("text") 683 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 684 expression.set("this", exp.DataType.Type.VARCHAR) 685 elif expression.this in exp.DataType.TEMPORAL_TYPES: 686 expression = exp.DataType.build(expression.this) 687 elif expression.is_type("float"): 688 size_expression = expression.find(exp.DataTypeParam) 689 if size_expression: 690 size = int(size_expression.name) 691 expression = ( 692 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 693 ) 694 695 return super().datatype_sql(expression)
701 def struct_sql(self, expression: exp.Struct) -> str: 702 values = [] 703 704 for i, e in enumerate(expression.expressions): 705 if isinstance(e, exp.PropertyEQ): 706 self.unsupported("Hive does not support named structs.") 707 values.append(e.expression) 708 else: 709 values.append(e) 710 711 return self.func("STRUCT", *values)
713 def alterset_sql(self, expression: exp.AlterSet) -> str: 714 exprs = self.expressions(expression, flat=True) 715 exprs = f" {exprs}" if exprs else "" 716 location = self.sql(expression, "location") 717 location = f" LOCATION {location}" if location else "" 718 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 719 file_format = f" FILEFORMAT {file_format}" if file_format else "" 720 serde = self.sql(expression, "serde") 721 serde = f" SERDE {serde}" if serde else "" 722 tags = self.expressions(expression, key="tag", flat=True, sep="") 723 tags = f" TAGS {tags}" if tags else "" 724 725 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