sqlglot.dialects.hive
1from __future__ import annotations 2 3import typing as t 4 5from sqlglot import exp, generator, parser, tokens, transforms 6from sqlglot.dialects.dialect import ( 7 DATE_ADD_OR_SUB, 8 Dialect, 9 NormalizationStrategy, 10 approx_count_distinct_sql, 11 arg_max_or_min_no_count, 12 datestrtodate_sql, 13 build_formatted_time, 14 if_sql, 15 is_parse_json, 16 left_to_substring_sql, 17 locate_to_strposition, 18 max_or_greatest, 19 min_or_least, 20 no_ilike_sql, 21 no_recursive_cte_sql, 22 no_safe_divide_sql, 23 no_trycast_sql, 24 regexp_extract_sql, 25 regexp_replace_sql, 26 rename_func, 27 right_to_substring_sql, 28 strposition_to_locate_sql, 29 struct_extract_sql, 30 time_format, 31 timestrtotime_sql, 32 unit_to_str, 33 var_map_sql, 34 sequence_sql, 35) 36from sqlglot.transforms import ( 37 remove_unique_constraints, 38 ctas_with_tmp_tables_to_create_tmp_view, 39 preprocess, 40 move_schema_columns_to_partitioned_by, 41) 42from sqlglot.helper import seq_get 43from sqlglot.tokens import TokenType 44 45# (FuncType, Multiplier) 46DATE_DELTA_INTERVAL = { 47 "YEAR": ("ADD_MONTHS", 12), 48 "MONTH": ("ADD_MONTHS", 1), 49 "QUARTER": ("ADD_MONTHS", 3), 50 "WEEK": ("DATE_ADD", 7), 51 "DAY": ("DATE_ADD", 1), 52} 53 54TIME_DIFF_FACTOR = { 55 "MILLISECOND": " * 1000", 56 "SECOND": "", 57 "MINUTE": " / 60", 58 "HOUR": " / 3600", 59} 60 61DIFF_MONTH_SWITCH = ("YEAR", "QUARTER", "MONTH") 62 63 64def _add_date_sql(self: Hive.Generator, expression: DATE_ADD_OR_SUB) -> str: 65 if isinstance(expression, exp.TsOrDsAdd) and not expression.unit: 66 return self.func("DATE_ADD", expression.this, expression.expression) 67 68 unit = expression.text("unit").upper() 69 func, multiplier = DATE_DELTA_INTERVAL.get(unit, ("DATE_ADD", 1)) 70 71 if isinstance(expression, exp.DateSub): 72 multiplier *= -1 73 74 if expression.expression.is_number: 75 modified_increment = exp.Literal.number(expression.expression.to_py() * multiplier) 76 else: 77 modified_increment = expression.expression 78 if multiplier != 1: 79 modified_increment = exp.Mul( # type: ignore 80 this=modified_increment, expression=exp.Literal.number(multiplier) 81 ) 82 83 return self.func(func, expression.this, modified_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 131def _array_sort_sql(self: Hive.Generator, expression: exp.ArraySort) -> str: 132 if expression.expression: 133 self.unsupported("Hive SORT_ARRAY does not support a comparator") 134 return self.func("SORT_ARRAY", expression.this) 135 136 137def _property_sql(self: Hive.Generator, expression: exp.Property) -> str: 138 return f"{self.property_name(expression, string_key=True)}={self.sql(expression, 'value')}" 139 140 141def _str_to_unix_sql(self: Hive.Generator, expression: exp.StrToUnix) -> str: 142 return self.func("UNIX_TIMESTAMP", expression.this, time_format("hive")(self, expression)) 143 144 145def _unix_to_time_sql(self: Hive.Generator, expression: exp.UnixToTime) -> str: 146 timestamp = self.sql(expression, "this") 147 scale = expression.args.get("scale") 148 if scale in (None, exp.UnixToTime.SECONDS): 149 return rename_func("FROM_UNIXTIME")(self, expression) 150 151 return f"FROM_UNIXTIME({timestamp} / POW(10, {scale}))" 152 153 154def _str_to_date_sql(self: Hive.Generator, expression: exp.StrToDate) -> str: 155 this = self.sql(expression, "this") 156 time_format = self.format_time(expression) 157 if time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 158 this = f"FROM_UNIXTIME(UNIX_TIMESTAMP({this}, {time_format}))" 159 return f"CAST({this} AS DATE)" 160 161 162def _str_to_time_sql(self: Hive.Generator, expression: exp.StrToTime) -> str: 163 this = self.sql(expression, "this") 164 time_format = self.format_time(expression) 165 if time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 166 this = f"FROM_UNIXTIME(UNIX_TIMESTAMP({this}, {time_format}))" 167 return f"CAST({this} AS TIMESTAMP)" 168 169 170def _to_date_sql(self: Hive.Generator, expression: exp.TsOrDsToDate) -> str: 171 time_format = self.format_time(expression) 172 if time_format and time_format not in (Hive.TIME_FORMAT, Hive.DATE_FORMAT): 173 return self.func("TO_DATE", expression.this, time_format) 174 175 if isinstance(expression.this, exp.TsOrDsToDate): 176 return self.sql(expression, "this") 177 178 return self.func("TO_DATE", expression.this) 179 180 181def _build_with_ignore_nulls( 182 exp_class: t.Type[exp.Expression], 183) -> t.Callable[[t.List[exp.Expression]], exp.Expression]: 184 def _parse(args: t.List[exp.Expression]) -> exp.Expression: 185 this = exp_class(this=seq_get(args, 0)) 186 if seq_get(args, 1) == exp.true(): 187 return exp.IgnoreNulls(this=this) 188 return this 189 190 return _parse 191 192 193class Hive(Dialect): 194 ALIAS_POST_TABLESAMPLE = True 195 IDENTIFIERS_CAN_START_WITH_DIGIT = True 196 SUPPORTS_USER_DEFINED_TYPES = False 197 SAFE_DIVISION = True 198 199 # https://spark.apache.org/docs/latest/sql-ref-identifier.html#description 200 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 201 202 TIME_MAPPING = { 203 "y": "%Y", 204 "Y": "%Y", 205 "YYYY": "%Y", 206 "yyyy": "%Y", 207 "YY": "%y", 208 "yy": "%y", 209 "MMMM": "%B", 210 "MMM": "%b", 211 "MM": "%m", 212 "M": "%-m", 213 "dd": "%d", 214 "d": "%-d", 215 "HH": "%H", 216 "H": "%-H", 217 "hh": "%I", 218 "h": "%-I", 219 "mm": "%M", 220 "m": "%-M", 221 "ss": "%S", 222 "s": "%-S", 223 "SSSSSS": "%f", 224 "a": "%p", 225 "DD": "%j", 226 "D": "%-j", 227 "E": "%a", 228 "EE": "%a", 229 "EEE": "%a", 230 "EEEE": "%A", 231 } 232 233 DATE_FORMAT = "'yyyy-MM-dd'" 234 DATEINT_FORMAT = "'yyyyMMdd'" 235 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 236 237 class Tokenizer(tokens.Tokenizer): 238 QUOTES = ["'", '"'] 239 IDENTIFIERS = ["`"] 240 STRING_ESCAPES = ["\\"] 241 242 SINGLE_TOKENS = { 243 **tokens.Tokenizer.SINGLE_TOKENS, 244 "$": TokenType.PARAMETER, 245 } 246 247 KEYWORDS = { 248 **tokens.Tokenizer.KEYWORDS, 249 "ADD ARCHIVE": TokenType.COMMAND, 250 "ADD ARCHIVES": TokenType.COMMAND, 251 "ADD FILE": TokenType.COMMAND, 252 "ADD FILES": TokenType.COMMAND, 253 "ADD JAR": TokenType.COMMAND, 254 "ADD JARS": TokenType.COMMAND, 255 "MINUS": TokenType.EXCEPT, 256 "MSCK REPAIR": TokenType.COMMAND, 257 "REFRESH": TokenType.REFRESH, 258 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 259 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 260 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 261 } 262 263 NUMERIC_LITERALS = { 264 "L": "BIGINT", 265 "S": "SMALLINT", 266 "Y": "TINYINT", 267 "D": "DOUBLE", 268 "F": "FLOAT", 269 "BD": "DECIMAL", 270 } 271 272 class Parser(parser.Parser): 273 LOG_DEFAULTS_TO_LN = True 274 STRICT_CAST = False 275 VALUES_FOLLOWED_BY_PAREN = False 276 277 FUNCTIONS = { 278 **parser.Parser.FUNCTIONS, 279 "BASE64": exp.ToBase64.from_arg_list, 280 "COLLECT_LIST": exp.ArrayAgg.from_arg_list, 281 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 282 "DATE_ADD": lambda args: exp.TsOrDsAdd( 283 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 284 ), 285 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 286 [ 287 exp.TimeStrToTime(this=seq_get(args, 0)), 288 seq_get(args, 1), 289 ] 290 ), 291 "DATE_SUB": lambda args: exp.TsOrDsAdd( 292 this=seq_get(args, 0), 293 expression=exp.Mul(this=seq_get(args, 1), expression=exp.Literal.number(-1)), 294 unit=exp.Literal.string("DAY"), 295 ), 296 "DATEDIFF": lambda args: exp.DateDiff( 297 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 298 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 299 ), 300 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 301 "FIRST": _build_with_ignore_nulls(exp.First), 302 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 303 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 304 "GET_JSON_OBJECT": exp.JSONExtractScalar.from_arg_list, 305 "LAST": _build_with_ignore_nulls(exp.Last), 306 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 307 "LOCATE": locate_to_strposition, 308 "MAP": parser.build_var_map, 309 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 310 "PERCENTILE": exp.Quantile.from_arg_list, 311 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 312 "REGEXP_EXTRACT": lambda args: exp.RegexpExtract( 313 this=seq_get(args, 0), expression=seq_get(args, 1), group=seq_get(args, 2) 314 ), 315 "SEQUENCE": exp.GenerateSeries.from_arg_list, 316 "SIZE": exp.ArraySize.from_arg_list, 317 "SPLIT": exp.RegexpSplit.from_arg_list, 318 "STR_TO_MAP": lambda args: exp.StrToMap( 319 this=seq_get(args, 0), 320 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 321 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 322 ), 323 "TO_DATE": build_formatted_time(exp.TsOrDsToDate, "hive"), 324 "TO_JSON": exp.JSONFormat.from_arg_list, 325 "TRUNC": exp.TimestampTrunc.from_arg_list, 326 "UNBASE64": exp.FromBase64.from_arg_list, 327 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 328 args or [exp.CurrentTimestamp()] 329 ), 330 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 331 } 332 333 NO_PAREN_FUNCTION_PARSERS = { 334 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 335 "TRANSFORM": lambda self: self._parse_transform(), 336 } 337 338 PROPERTY_PARSERS = { 339 **parser.Parser.PROPERTY_PARSERS, 340 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 341 expressions=self._parse_wrapped_csv(self._parse_property) 342 ), 343 } 344 345 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 346 if not self._match(TokenType.L_PAREN, advance=False): 347 self._retreat(self._index - 1) 348 return None 349 350 args = self._parse_wrapped_csv(self._parse_lambda) 351 row_format_before = self._parse_row_format(match_row=True) 352 353 record_writer = None 354 if self._match_text_seq("RECORDWRITER"): 355 record_writer = self._parse_string() 356 357 if not self._match(TokenType.USING): 358 return exp.Transform.from_arg_list(args) 359 360 command_script = self._parse_string() 361 362 self._match(TokenType.ALIAS) 363 schema = self._parse_schema() 364 365 row_format_after = self._parse_row_format(match_row=True) 366 record_reader = None 367 if self._match_text_seq("RECORDREADER"): 368 record_reader = self._parse_string() 369 370 return self.expression( 371 exp.QueryTransform, 372 expressions=args, 373 command_script=command_script, 374 schema=schema, 375 row_format_before=row_format_before, 376 record_writer=record_writer, 377 row_format_after=row_format_after, 378 record_reader=record_reader, 379 ) 380 381 def _parse_types( 382 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 383 ) -> t.Optional[exp.Expression]: 384 """ 385 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 386 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 387 388 spark-sql (default)> select cast(1234 as varchar(2)); 389 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 390 char/varchar type and simply treats them as string type. Please use string type 391 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 392 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 393 394 1234 395 Time taken: 4.265 seconds, Fetched 1 row(s) 396 397 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 398 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 399 400 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 401 """ 402 this = super()._parse_types( 403 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 404 ) 405 406 if this and not schema: 407 return this.transform( 408 lambda node: ( 409 node.replace(exp.DataType.build("text")) 410 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 411 else node 412 ), 413 copy=False, 414 ) 415 416 return this 417 418 def _parse_partition_and_order( 419 self, 420 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 421 return ( 422 ( 423 self._parse_csv(self._parse_assignment) 424 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 425 else [] 426 ), 427 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 428 ) 429 430 def _parse_parameter(self) -> exp.Parameter: 431 self._match(TokenType.L_BRACE) 432 this = self._parse_identifier() or self._parse_primary_or_var() 433 expression = self._match(TokenType.COLON) and ( 434 self._parse_identifier() or self._parse_primary_or_var() 435 ) 436 self._match(TokenType.R_BRACE) 437 return self.expression(exp.Parameter, this=this, expression=expression) 438 439 class Generator(generator.Generator): 440 LIMIT_FETCH = "LIMIT" 441 TABLESAMPLE_WITH_METHOD = False 442 JOIN_HINTS = False 443 TABLE_HINTS = False 444 QUERY_HINTS = False 445 INDEX_ON = "ON TABLE" 446 EXTRACT_ALLOWS_QUOTES = False 447 NVL2_SUPPORTED = False 448 LAST_DAY_SUPPORTS_DATE_PART = False 449 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 450 SUPPORTS_TO_NUMBER = False 451 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 452 PARSE_JSON_NAME = None 453 PAD_FILL_PATTERN_IS_REQUIRED = True 454 455 EXPRESSIONS_WITHOUT_NESTED_CTES = { 456 exp.Insert, 457 exp.Select, 458 exp.Subquery, 459 exp.SetOperation, 460 } 461 462 SUPPORTED_JSON_PATH_PARTS = { 463 exp.JSONPathKey, 464 exp.JSONPathRoot, 465 exp.JSONPathSubscript, 466 exp.JSONPathWildcard, 467 } 468 469 TYPE_MAPPING = { 470 **generator.Generator.TYPE_MAPPING, 471 exp.DataType.Type.BIT: "BOOLEAN", 472 exp.DataType.Type.DATETIME: "TIMESTAMP", 473 exp.DataType.Type.ROWVERSION: "BINARY", 474 exp.DataType.Type.TEXT: "STRING", 475 exp.DataType.Type.TIME: "TIMESTAMP", 476 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 477 exp.DataType.Type.UTINYINT: "SMALLINT", 478 exp.DataType.Type.VARBINARY: "BINARY", 479 } 480 481 TRANSFORMS = { 482 **generator.Generator.TRANSFORMS, 483 exp.Group: transforms.preprocess([transforms.unalias_group]), 484 exp.Select: transforms.preprocess( 485 [ 486 transforms.eliminate_qualify, 487 transforms.eliminate_distinct_on, 488 transforms.unnest_to_explode, 489 ] 490 ), 491 exp.Property: _property_sql, 492 exp.AnyValue: rename_func("FIRST"), 493 exp.ApproxDistinct: approx_count_distinct_sql, 494 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 495 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 496 exp.ArrayConcat: rename_func("CONCAT"), 497 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 498 exp.ArraySize: rename_func("SIZE"), 499 exp.ArraySort: _array_sort_sql, 500 exp.With: no_recursive_cte_sql, 501 exp.DateAdd: _add_date_sql, 502 exp.DateDiff: _date_diff_sql, 503 exp.DateStrToDate: datestrtodate_sql, 504 exp.DateSub: _add_date_sql, 505 exp.DateToDi: lambda self, 506 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 507 exp.DiToDate: lambda self, 508 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 509 exp.FileFormatProperty: lambda self, 510 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 511 exp.FromBase64: rename_func("UNBASE64"), 512 exp.GenerateSeries: sequence_sql, 513 exp.GenerateDateArray: sequence_sql, 514 exp.If: if_sql(), 515 exp.ILike: no_ilike_sql, 516 exp.IsNan: rename_func("ISNAN"), 517 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 518 exp.JSONExtractScalar: lambda self, e: self.func( 519 "GET_JSON_OBJECT", e.this, e.expression 520 ), 521 exp.JSONFormat: _json_format_sql, 522 exp.Left: left_to_substring_sql, 523 exp.Map: var_map_sql, 524 exp.Max: max_or_greatest, 525 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 526 exp.Min: min_or_least, 527 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 528 exp.NotNullColumnConstraint: lambda _, e: ( 529 "" if e.args.get("allow_null") else "NOT NULL" 530 ), 531 exp.VarMap: var_map_sql, 532 exp.Create: preprocess( 533 [ 534 remove_unique_constraints, 535 ctas_with_tmp_tables_to_create_tmp_view, 536 move_schema_columns_to_partitioned_by, 537 ] 538 ), 539 exp.Quantile: rename_func("PERCENTILE"), 540 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 541 exp.RegexpExtract: regexp_extract_sql, 542 exp.RegexpReplace: regexp_replace_sql, 543 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 544 exp.RegexpSplit: rename_func("SPLIT"), 545 exp.Right: right_to_substring_sql, 546 exp.SafeDivide: no_safe_divide_sql, 547 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 548 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 549 exp.Split: lambda self, e: self.func( 550 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression) 551 ), 552 exp.StrPosition: strposition_to_locate_sql, 553 exp.StrToDate: _str_to_date_sql, 554 exp.StrToTime: _str_to_time_sql, 555 exp.StrToUnix: _str_to_unix_sql, 556 exp.StructExtract: struct_extract_sql, 557 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 558 exp.TimeStrToDate: rename_func("TO_DATE"), 559 exp.TimeStrToTime: timestrtotime_sql, 560 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 561 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 562 exp.TimeToStr: lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)), 563 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 564 exp.ToBase64: rename_func("BASE64"), 565 exp.TsOrDiToDi: lambda self, 566 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 567 exp.TsOrDsAdd: _add_date_sql, 568 exp.TsOrDsDiff: _date_diff_sql, 569 exp.TsOrDsToDate: _to_date_sql, 570 exp.TryCast: no_trycast_sql, 571 exp.UnixToStr: lambda self, e: self.func( 572 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 573 ), 574 exp.UnixToTime: _unix_to_time_sql, 575 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 576 exp.Unnest: rename_func("EXPLODE"), 577 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 578 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 579 exp.National: lambda self, e: self.national_sql(e, prefix=""), 580 exp.ClusteredColumnConstraint: lambda self, 581 e: f"({self.expressions(e, 'this', indent=False)})", 582 exp.NonClusteredColumnConstraint: lambda self, 583 e: f"({self.expressions(e, 'this', indent=False)})", 584 exp.NotForReplicationColumnConstraint: lambda *_: "", 585 exp.OnProperty: lambda *_: "", 586 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 587 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 588 exp.DayOfMonth: rename_func("DAYOFMONTH"), 589 exp.DayOfWeek: rename_func("DAYOFWEEK"), 590 } 591 592 PROPERTIES_LOCATION = { 593 **generator.Generator.PROPERTIES_LOCATION, 594 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 595 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 596 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 597 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 598 } 599 600 def unnest_sql(self, expression: exp.Unnest) -> str: 601 return rename_func("EXPLODE")(self, expression) 602 603 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 604 if isinstance(expression.this, exp.JSONPathWildcard): 605 self.unsupported("Unsupported wildcard in JSONPathKey expression") 606 return "" 607 608 return super()._jsonpathkey_sql(expression) 609 610 def parameter_sql(self, expression: exp.Parameter) -> str: 611 this = self.sql(expression, "this") 612 expression_sql = self.sql(expression, "expression") 613 614 parent = expression.parent 615 this = f"{this}:{expression_sql}" if expression_sql else this 616 617 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 618 # We need to produce SET key = value instead of SET ${key} = value 619 return this 620 621 return f"${{{this}}}" 622 623 def schema_sql(self, expression: exp.Schema) -> str: 624 for ordered in expression.find_all(exp.Ordered): 625 if ordered.args.get("desc") is False: 626 ordered.set("desc", None) 627 628 return super().schema_sql(expression) 629 630 def constraint_sql(self, expression: exp.Constraint) -> str: 631 for prop in list(expression.find_all(exp.Properties)): 632 prop.pop() 633 634 this = self.sql(expression, "this") 635 expressions = self.expressions(expression, sep=" ", flat=True) 636 return f"CONSTRAINT {this} {expressions}" 637 638 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 639 serde_props = self.sql(expression, "serde_properties") 640 serde_props = f" {serde_props}" if serde_props else "" 641 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 642 643 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 644 return self.func( 645 "COLLECT_LIST", 646 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 647 ) 648 649 def datatype_sql(self, expression: exp.DataType) -> str: 650 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 651 not expression.expressions or expression.expressions[0].name == "MAX" 652 ): 653 expression = exp.DataType.build("text") 654 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 655 expression.set("this", exp.DataType.Type.VARCHAR) 656 elif expression.this in exp.DataType.TEMPORAL_TYPES: 657 expression = exp.DataType.build(expression.this) 658 elif expression.is_type("float"): 659 size_expression = expression.find(exp.DataTypeParam) 660 if size_expression: 661 size = int(size_expression.name) 662 expression = ( 663 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 664 ) 665 666 return super().datatype_sql(expression) 667 668 def version_sql(self, expression: exp.Version) -> str: 669 sql = super().version_sql(expression) 670 return sql.replace("FOR ", "", 1) 671 672 def struct_sql(self, expression: exp.Struct) -> str: 673 values = [] 674 675 for i, e in enumerate(expression.expressions): 676 if isinstance(e, exp.PropertyEQ): 677 self.unsupported("Hive does not support named structs.") 678 values.append(e.expression) 679 else: 680 values.append(e) 681 682 return self.func("STRUCT", *values) 683 684 def alterset_sql(self, expression: exp.AlterSet) -> str: 685 exprs = self.expressions(expression, flat=True) 686 exprs = f" {exprs}" if exprs else "" 687 location = self.sql(expression, "location") 688 location = f" LOCATION {location}" if location else "" 689 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 690 file_format = f" FILEFORMAT {file_format}" if file_format else "" 691 serde = self.sql(expression, "serde") 692 serde = f" SERDE {serde}" if serde else "" 693 tags = self.expressions(expression, key="tag", flat=True, sep="") 694 tags = f" TAGS {tags}" if tags else "" 695 696 return f"SET{serde}{exprs}{location}{file_format}{tags}" 697 698 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 699 prefix = "WITH " if expression.args.get("with") else "" 700 exprs = self.expressions(expression, flat=True) 701 702 return f"{prefix}SERDEPROPERTIES ({exprs})"
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')
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 200 # https://spark.apache.org/docs/latest/sql-ref-identifier.html#description 201 NORMALIZATION_STRATEGY = NormalizationStrategy.CASE_INSENSITIVE 202 203 TIME_MAPPING = { 204 "y": "%Y", 205 "Y": "%Y", 206 "YYYY": "%Y", 207 "yyyy": "%Y", 208 "YY": "%y", 209 "yy": "%y", 210 "MMMM": "%B", 211 "MMM": "%b", 212 "MM": "%m", 213 "M": "%-m", 214 "dd": "%d", 215 "d": "%-d", 216 "HH": "%H", 217 "H": "%-H", 218 "hh": "%I", 219 "h": "%-I", 220 "mm": "%M", 221 "m": "%-M", 222 "ss": "%S", 223 "s": "%-S", 224 "SSSSSS": "%f", 225 "a": "%p", 226 "DD": "%j", 227 "D": "%-j", 228 "E": "%a", 229 "EE": "%a", 230 "EEE": "%a", 231 "EEEE": "%A", 232 } 233 234 DATE_FORMAT = "'yyyy-MM-dd'" 235 DATEINT_FORMAT = "'yyyyMMdd'" 236 TIME_FORMAT = "'yyyy-MM-dd HH:mm:ss'" 237 238 class Tokenizer(tokens.Tokenizer): 239 QUOTES = ["'", '"'] 240 IDENTIFIERS = ["`"] 241 STRING_ESCAPES = ["\\"] 242 243 SINGLE_TOKENS = { 244 **tokens.Tokenizer.SINGLE_TOKENS, 245 "$": TokenType.PARAMETER, 246 } 247 248 KEYWORDS = { 249 **tokens.Tokenizer.KEYWORDS, 250 "ADD ARCHIVE": TokenType.COMMAND, 251 "ADD ARCHIVES": TokenType.COMMAND, 252 "ADD FILE": TokenType.COMMAND, 253 "ADD FILES": TokenType.COMMAND, 254 "ADD JAR": TokenType.COMMAND, 255 "ADD JARS": TokenType.COMMAND, 256 "MINUS": TokenType.EXCEPT, 257 "MSCK REPAIR": TokenType.COMMAND, 258 "REFRESH": TokenType.REFRESH, 259 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 260 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 261 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 262 } 263 264 NUMERIC_LITERALS = { 265 "L": "BIGINT", 266 "S": "SMALLINT", 267 "Y": "TINYINT", 268 "D": "DOUBLE", 269 "F": "FLOAT", 270 "BD": "DECIMAL", 271 } 272 273 class Parser(parser.Parser): 274 LOG_DEFAULTS_TO_LN = True 275 STRICT_CAST = False 276 VALUES_FOLLOWED_BY_PAREN = False 277 278 FUNCTIONS = { 279 **parser.Parser.FUNCTIONS, 280 "BASE64": exp.ToBase64.from_arg_list, 281 "COLLECT_LIST": exp.ArrayAgg.from_arg_list, 282 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 283 "DATE_ADD": lambda args: exp.TsOrDsAdd( 284 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 285 ), 286 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 287 [ 288 exp.TimeStrToTime(this=seq_get(args, 0)), 289 seq_get(args, 1), 290 ] 291 ), 292 "DATE_SUB": lambda args: exp.TsOrDsAdd( 293 this=seq_get(args, 0), 294 expression=exp.Mul(this=seq_get(args, 1), expression=exp.Literal.number(-1)), 295 unit=exp.Literal.string("DAY"), 296 ), 297 "DATEDIFF": lambda args: exp.DateDiff( 298 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 299 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 300 ), 301 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 302 "FIRST": _build_with_ignore_nulls(exp.First), 303 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 304 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 305 "GET_JSON_OBJECT": exp.JSONExtractScalar.from_arg_list, 306 "LAST": _build_with_ignore_nulls(exp.Last), 307 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 308 "LOCATE": locate_to_strposition, 309 "MAP": parser.build_var_map, 310 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 311 "PERCENTILE": exp.Quantile.from_arg_list, 312 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 313 "REGEXP_EXTRACT": lambda args: exp.RegexpExtract( 314 this=seq_get(args, 0), expression=seq_get(args, 1), group=seq_get(args, 2) 315 ), 316 "SEQUENCE": exp.GenerateSeries.from_arg_list, 317 "SIZE": exp.ArraySize.from_arg_list, 318 "SPLIT": exp.RegexpSplit.from_arg_list, 319 "STR_TO_MAP": lambda args: exp.StrToMap( 320 this=seq_get(args, 0), 321 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 322 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 323 ), 324 "TO_DATE": build_formatted_time(exp.TsOrDsToDate, "hive"), 325 "TO_JSON": exp.JSONFormat.from_arg_list, 326 "TRUNC": exp.TimestampTrunc.from_arg_list, 327 "UNBASE64": exp.FromBase64.from_arg_list, 328 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 329 args or [exp.CurrentTimestamp()] 330 ), 331 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 332 } 333 334 NO_PAREN_FUNCTION_PARSERS = { 335 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 336 "TRANSFORM": lambda self: self._parse_transform(), 337 } 338 339 PROPERTY_PARSERS = { 340 **parser.Parser.PROPERTY_PARSERS, 341 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 342 expressions=self._parse_wrapped_csv(self._parse_property) 343 ), 344 } 345 346 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 347 if not self._match(TokenType.L_PAREN, advance=False): 348 self._retreat(self._index - 1) 349 return None 350 351 args = self._parse_wrapped_csv(self._parse_lambda) 352 row_format_before = self._parse_row_format(match_row=True) 353 354 record_writer = None 355 if self._match_text_seq("RECORDWRITER"): 356 record_writer = self._parse_string() 357 358 if not self._match(TokenType.USING): 359 return exp.Transform.from_arg_list(args) 360 361 command_script = self._parse_string() 362 363 self._match(TokenType.ALIAS) 364 schema = self._parse_schema() 365 366 row_format_after = self._parse_row_format(match_row=True) 367 record_reader = None 368 if self._match_text_seq("RECORDREADER"): 369 record_reader = self._parse_string() 370 371 return self.expression( 372 exp.QueryTransform, 373 expressions=args, 374 command_script=command_script, 375 schema=schema, 376 row_format_before=row_format_before, 377 record_writer=record_writer, 378 row_format_after=row_format_after, 379 record_reader=record_reader, 380 ) 381 382 def _parse_types( 383 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 384 ) -> t.Optional[exp.Expression]: 385 """ 386 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 387 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 388 389 spark-sql (default)> select cast(1234 as varchar(2)); 390 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 391 char/varchar type and simply treats them as string type. Please use string type 392 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 393 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 394 395 1234 396 Time taken: 4.265 seconds, Fetched 1 row(s) 397 398 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 399 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 400 401 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 402 """ 403 this = super()._parse_types( 404 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 405 ) 406 407 if this and not schema: 408 return this.transform( 409 lambda node: ( 410 node.replace(exp.DataType.build("text")) 411 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 412 else node 413 ), 414 copy=False, 415 ) 416 417 return this 418 419 def _parse_partition_and_order( 420 self, 421 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 422 return ( 423 ( 424 self._parse_csv(self._parse_assignment) 425 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 426 else [] 427 ), 428 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 429 ) 430 431 def _parse_parameter(self) -> exp.Parameter: 432 self._match(TokenType.L_BRACE) 433 this = self._parse_identifier() or self._parse_primary_or_var() 434 expression = self._match(TokenType.COLON) and ( 435 self._parse_identifier() or self._parse_primary_or_var() 436 ) 437 self._match(TokenType.R_BRACE) 438 return self.expression(exp.Parameter, this=this, expression=expression) 439 440 class Generator(generator.Generator): 441 LIMIT_FETCH = "LIMIT" 442 TABLESAMPLE_WITH_METHOD = False 443 JOIN_HINTS = False 444 TABLE_HINTS = False 445 QUERY_HINTS = False 446 INDEX_ON = "ON TABLE" 447 EXTRACT_ALLOWS_QUOTES = False 448 NVL2_SUPPORTED = False 449 LAST_DAY_SUPPORTS_DATE_PART = False 450 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 451 SUPPORTS_TO_NUMBER = False 452 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 453 PARSE_JSON_NAME = None 454 PAD_FILL_PATTERN_IS_REQUIRED = True 455 456 EXPRESSIONS_WITHOUT_NESTED_CTES = { 457 exp.Insert, 458 exp.Select, 459 exp.Subquery, 460 exp.SetOperation, 461 } 462 463 SUPPORTED_JSON_PATH_PARTS = { 464 exp.JSONPathKey, 465 exp.JSONPathRoot, 466 exp.JSONPathSubscript, 467 exp.JSONPathWildcard, 468 } 469 470 TYPE_MAPPING = { 471 **generator.Generator.TYPE_MAPPING, 472 exp.DataType.Type.BIT: "BOOLEAN", 473 exp.DataType.Type.DATETIME: "TIMESTAMP", 474 exp.DataType.Type.ROWVERSION: "BINARY", 475 exp.DataType.Type.TEXT: "STRING", 476 exp.DataType.Type.TIME: "TIMESTAMP", 477 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 478 exp.DataType.Type.UTINYINT: "SMALLINT", 479 exp.DataType.Type.VARBINARY: "BINARY", 480 } 481 482 TRANSFORMS = { 483 **generator.Generator.TRANSFORMS, 484 exp.Group: transforms.preprocess([transforms.unalias_group]), 485 exp.Select: transforms.preprocess( 486 [ 487 transforms.eliminate_qualify, 488 transforms.eliminate_distinct_on, 489 transforms.unnest_to_explode, 490 ] 491 ), 492 exp.Property: _property_sql, 493 exp.AnyValue: rename_func("FIRST"), 494 exp.ApproxDistinct: approx_count_distinct_sql, 495 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 496 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 497 exp.ArrayConcat: rename_func("CONCAT"), 498 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 499 exp.ArraySize: rename_func("SIZE"), 500 exp.ArraySort: _array_sort_sql, 501 exp.With: no_recursive_cte_sql, 502 exp.DateAdd: _add_date_sql, 503 exp.DateDiff: _date_diff_sql, 504 exp.DateStrToDate: datestrtodate_sql, 505 exp.DateSub: _add_date_sql, 506 exp.DateToDi: lambda self, 507 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 508 exp.DiToDate: lambda self, 509 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 510 exp.FileFormatProperty: lambda self, 511 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 512 exp.FromBase64: rename_func("UNBASE64"), 513 exp.GenerateSeries: sequence_sql, 514 exp.GenerateDateArray: sequence_sql, 515 exp.If: if_sql(), 516 exp.ILike: no_ilike_sql, 517 exp.IsNan: rename_func("ISNAN"), 518 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 519 exp.JSONExtractScalar: lambda self, e: self.func( 520 "GET_JSON_OBJECT", e.this, e.expression 521 ), 522 exp.JSONFormat: _json_format_sql, 523 exp.Left: left_to_substring_sql, 524 exp.Map: var_map_sql, 525 exp.Max: max_or_greatest, 526 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 527 exp.Min: min_or_least, 528 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 529 exp.NotNullColumnConstraint: lambda _, e: ( 530 "" if e.args.get("allow_null") else "NOT NULL" 531 ), 532 exp.VarMap: var_map_sql, 533 exp.Create: preprocess( 534 [ 535 remove_unique_constraints, 536 ctas_with_tmp_tables_to_create_tmp_view, 537 move_schema_columns_to_partitioned_by, 538 ] 539 ), 540 exp.Quantile: rename_func("PERCENTILE"), 541 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 542 exp.RegexpExtract: regexp_extract_sql, 543 exp.RegexpReplace: regexp_replace_sql, 544 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 545 exp.RegexpSplit: rename_func("SPLIT"), 546 exp.Right: right_to_substring_sql, 547 exp.SafeDivide: no_safe_divide_sql, 548 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 549 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 550 exp.Split: lambda self, e: self.func( 551 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression) 552 ), 553 exp.StrPosition: strposition_to_locate_sql, 554 exp.StrToDate: _str_to_date_sql, 555 exp.StrToTime: _str_to_time_sql, 556 exp.StrToUnix: _str_to_unix_sql, 557 exp.StructExtract: struct_extract_sql, 558 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 559 exp.TimeStrToDate: rename_func("TO_DATE"), 560 exp.TimeStrToTime: timestrtotime_sql, 561 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 562 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 563 exp.TimeToStr: lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)), 564 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 565 exp.ToBase64: rename_func("BASE64"), 566 exp.TsOrDiToDi: lambda self, 567 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 568 exp.TsOrDsAdd: _add_date_sql, 569 exp.TsOrDsDiff: _date_diff_sql, 570 exp.TsOrDsToDate: _to_date_sql, 571 exp.TryCast: no_trycast_sql, 572 exp.UnixToStr: lambda self, e: self.func( 573 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 574 ), 575 exp.UnixToTime: _unix_to_time_sql, 576 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 577 exp.Unnest: rename_func("EXPLODE"), 578 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 579 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 580 exp.National: lambda self, e: self.national_sql(e, prefix=""), 581 exp.ClusteredColumnConstraint: lambda self, 582 e: f"({self.expressions(e, 'this', indent=False)})", 583 exp.NonClusteredColumnConstraint: lambda self, 584 e: f"({self.expressions(e, 'this', indent=False)})", 585 exp.NotForReplicationColumnConstraint: lambda *_: "", 586 exp.OnProperty: lambda *_: "", 587 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 588 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 589 exp.DayOfMonth: rename_func("DAYOFMONTH"), 590 exp.DayOfWeek: rename_func("DAYOFWEEK"), 591 } 592 593 PROPERTIES_LOCATION = { 594 **generator.Generator.PROPERTIES_LOCATION, 595 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 596 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 597 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 598 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 599 } 600 601 def unnest_sql(self, expression: exp.Unnest) -> str: 602 return rename_func("EXPLODE")(self, expression) 603 604 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 605 if isinstance(expression.this, exp.JSONPathWildcard): 606 self.unsupported("Unsupported wildcard in JSONPathKey expression") 607 return "" 608 609 return super()._jsonpathkey_sql(expression) 610 611 def parameter_sql(self, expression: exp.Parameter) -> str: 612 this = self.sql(expression, "this") 613 expression_sql = self.sql(expression, "expression") 614 615 parent = expression.parent 616 this = f"{this}:{expression_sql}" if expression_sql else this 617 618 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 619 # We need to produce SET key = value instead of SET ${key} = value 620 return this 621 622 return f"${{{this}}}" 623 624 def schema_sql(self, expression: exp.Schema) -> str: 625 for ordered in expression.find_all(exp.Ordered): 626 if ordered.args.get("desc") is False: 627 ordered.set("desc", None) 628 629 return super().schema_sql(expression) 630 631 def constraint_sql(self, expression: exp.Constraint) -> str: 632 for prop in list(expression.find_all(exp.Properties)): 633 prop.pop() 634 635 this = self.sql(expression, "this") 636 expressions = self.expressions(expression, sep=" ", flat=True) 637 return f"CONSTRAINT {this} {expressions}" 638 639 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 640 serde_props = self.sql(expression, "serde_properties") 641 serde_props = f" {serde_props}" if serde_props else "" 642 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 643 644 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 645 return self.func( 646 "COLLECT_LIST", 647 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 648 ) 649 650 def datatype_sql(self, expression: exp.DataType) -> str: 651 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 652 not expression.expressions or expression.expressions[0].name == "MAX" 653 ): 654 expression = exp.DataType.build("text") 655 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 656 expression.set("this", exp.DataType.Type.VARCHAR) 657 elif expression.this in exp.DataType.TEMPORAL_TYPES: 658 expression = exp.DataType.build(expression.this) 659 elif expression.is_type("float"): 660 size_expression = expression.find(exp.DataTypeParam) 661 if size_expression: 662 size = int(size_expression.name) 663 expression = ( 664 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 665 ) 666 667 return super().datatype_sql(expression) 668 669 def version_sql(self, expression: exp.Version) -> str: 670 sql = super().version_sql(expression) 671 return sql.replace("FOR ", "", 1) 672 673 def struct_sql(self, expression: exp.Struct) -> str: 674 values = [] 675 676 for i, e in enumerate(expression.expressions): 677 if isinstance(e, exp.PropertyEQ): 678 self.unsupported("Hive does not support named structs.") 679 values.append(e.expression) 680 else: 681 values.append(e) 682 683 return self.func("STRUCT", *values) 684 685 def alterset_sql(self, expression: exp.AlterSet) -> str: 686 exprs = self.expressions(expression, flat=True) 687 exprs = f" {exprs}" if exprs else "" 688 location = self.sql(expression, "location") 689 location = f" LOCATION {location}" if location else "" 690 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 691 file_format = f" FILEFORMAT {file_format}" if file_format else "" 692 serde = self.sql(expression, "serde") 693 serde = f" SERDE {serde}" if serde else "" 694 tags = self.expressions(expression, key="tag", flat=True, sep="") 695 tags = f" TAGS {tags}" if tags else "" 696 697 return f"SET{serde}{exprs}{location}{file_format}{tags}" 698 699 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 700 prefix = "WITH " if expression.args.get("with") else "" 701 exprs = self.expressions(expression, flat=True) 702 703 return f"{prefix}SERDEPROPERTIES ({exprs})"
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'}
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}}}}}
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}}}}}
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'}
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}}}
ESCAPED_SEQUENCES: Dict[str, str] =
{'\x07': '\\a', '\x08': '\\b', '\x0c': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t', '\x0b': '\\v', '\\': '\\\\'}
Inherited Members
- sqlglot.dialects.dialect.Dialect
- Dialect
- INDEX_OFFSET
- WEEK_OFFSET
- UNNEST_COLUMN_ONLY
- TABLESAMPLE_SIZE_IS_PERCENT
- DPIPE_IS_STRING_CONCAT
- STRICT_STRING_CONCAT
- SUPPORTS_SEMI_ANTI_JOIN
- COPY_PARAMS_ARE_CSV
- NORMALIZE_FUNCTIONS
- LOG_BASE_FIRST
- NULL_ORDERING
- TYPED_DIVISION
- CONCAT_COALESCE
- HEX_LOWERCASE
- FORMAT_MAPPING
- PSEUDOCOLUMNS
- PREFER_CTE_ALIAS_COLUMN
- FORCE_EARLY_ALIAS_REF_EXPANSION
- EXPAND_ALIAS_REFS_EARLY_ONLY_IN_GROUP_BY
- SUPPORTS_ORDER_BY_ALL
- HAS_DISTINCT_ARRAY_CONSTRUCTORS
- SUPPORTS_FIXED_SIZE_ARRAYS
- CREATABLE_KIND_MAPPING
- DATE_PART_MAPPING
- TYPE_TO_EXPRESSIONS
- ANNOTATORS
- get_or_raise
- format_time
- settings
- normalize_identifier
- case_sensitive
- can_identify
- quote_identifier
- to_json_path
- parse
- parse_into
- generate
- transpile
- tokenize
- tokenizer
- jsonpath_tokenizer
- parser
- generator
238 class Tokenizer(tokens.Tokenizer): 239 QUOTES = ["'", '"'] 240 IDENTIFIERS = ["`"] 241 STRING_ESCAPES = ["\\"] 242 243 SINGLE_TOKENS = { 244 **tokens.Tokenizer.SINGLE_TOKENS, 245 "$": TokenType.PARAMETER, 246 } 247 248 KEYWORDS = { 249 **tokens.Tokenizer.KEYWORDS, 250 "ADD ARCHIVE": TokenType.COMMAND, 251 "ADD ARCHIVES": TokenType.COMMAND, 252 "ADD FILE": TokenType.COMMAND, 253 "ADD FILES": TokenType.COMMAND, 254 "ADD JAR": TokenType.COMMAND, 255 "ADD JARS": TokenType.COMMAND, 256 "MINUS": TokenType.EXCEPT, 257 "MSCK REPAIR": TokenType.COMMAND, 258 "REFRESH": TokenType.REFRESH, 259 "TIMESTAMP AS OF": TokenType.TIMESTAMP_SNAPSHOT, 260 "VERSION AS OF": TokenType.VERSION_SNAPSHOT, 261 "SERDEPROPERTIES": TokenType.SERDE_PROPERTIES, 262 } 263 264 NUMERIC_LITERALS = { 265 "L": "BIGINT", 266 "S": "SMALLINT", 267 "Y": "TINYINT", 268 "D": "DOUBLE", 269 "F": "FLOAT", 270 "BD": "DECIMAL", 271 }
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'>, '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_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'>, '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'>, 'INT128': <TokenType.INT128: 'INT128'>, 'HUGEINT': <TokenType.INT128: 'INT128'>, 'INT2': <TokenType.SMALLINT: 'SMALLINT'>, 'INTEGER': <TokenType.INT: 'INT'>, 'INT': <TokenType.INT: 'INT'>, 'INT4': <TokenType.INT: 'INT'>, 'INT32': <TokenType.INT: 'INT'>, 'INT64': <TokenType.BIGINT: 'BIGINT'>, 'LONG': <TokenType.BIGINT: 'BIGINT'>, 'BIGINT': <TokenType.BIGINT: 'BIGINT'>, 'INT8': <TokenType.TINYINT: 'TINYINT'>, 'UINT': <TokenType.UINT: 'UINT'>, 'DEC': <TokenType.DECIMAL: 'DECIMAL'>, 'DECIMAL': <TokenType.DECIMAL: 'DECIMAL'>, '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.COMMAND: 'COMMAND'>, 'CALL': <TokenType.COMMAND: 'COMMAND'>, 'COMMENT': <TokenType.COMMENT: 'COMMENT'>, 'EXPLAIN': <TokenType.COMMAND: 'COMMAND'>, 'GRANT': <TokenType.COMMAND: 'COMMAND'>, '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
- IDENTIFIER_ESCAPES
- VAR_SINGLE_TOKENS
- HEREDOC_TAG_IS_IDENTIFIER
- HEREDOC_STRING_ALTERNATIVE
- STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS
- NESTED_COMMENTS
- WHITE_SPACE
- COMMANDS
- COMMAND_PREFIX_TOKENS
- COMMENTS
- dialect
- reset
- tokenize
- tokenize_rs
- size
- sql
- tokens
273 class Parser(parser.Parser): 274 LOG_DEFAULTS_TO_LN = True 275 STRICT_CAST = False 276 VALUES_FOLLOWED_BY_PAREN = False 277 278 FUNCTIONS = { 279 **parser.Parser.FUNCTIONS, 280 "BASE64": exp.ToBase64.from_arg_list, 281 "COLLECT_LIST": exp.ArrayAgg.from_arg_list, 282 "COLLECT_SET": exp.ArrayUniqueAgg.from_arg_list, 283 "DATE_ADD": lambda args: exp.TsOrDsAdd( 284 this=seq_get(args, 0), expression=seq_get(args, 1), unit=exp.Literal.string("DAY") 285 ), 286 "DATE_FORMAT": lambda args: build_formatted_time(exp.TimeToStr, "hive")( 287 [ 288 exp.TimeStrToTime(this=seq_get(args, 0)), 289 seq_get(args, 1), 290 ] 291 ), 292 "DATE_SUB": lambda args: exp.TsOrDsAdd( 293 this=seq_get(args, 0), 294 expression=exp.Mul(this=seq_get(args, 1), expression=exp.Literal.number(-1)), 295 unit=exp.Literal.string("DAY"), 296 ), 297 "DATEDIFF": lambda args: exp.DateDiff( 298 this=exp.TsOrDsToDate(this=seq_get(args, 0)), 299 expression=exp.TsOrDsToDate(this=seq_get(args, 1)), 300 ), 301 "DAY": lambda args: exp.Day(this=exp.TsOrDsToDate(this=seq_get(args, 0))), 302 "FIRST": _build_with_ignore_nulls(exp.First), 303 "FIRST_VALUE": _build_with_ignore_nulls(exp.FirstValue), 304 "FROM_UNIXTIME": build_formatted_time(exp.UnixToStr, "hive", True), 305 "GET_JSON_OBJECT": exp.JSONExtractScalar.from_arg_list, 306 "LAST": _build_with_ignore_nulls(exp.Last), 307 "LAST_VALUE": _build_with_ignore_nulls(exp.LastValue), 308 "LOCATE": locate_to_strposition, 309 "MAP": parser.build_var_map, 310 "MONTH": lambda args: exp.Month(this=exp.TsOrDsToDate.from_arg_list(args)), 311 "PERCENTILE": exp.Quantile.from_arg_list, 312 "PERCENTILE_APPROX": exp.ApproxQuantile.from_arg_list, 313 "REGEXP_EXTRACT": lambda args: exp.RegexpExtract( 314 this=seq_get(args, 0), expression=seq_get(args, 1), group=seq_get(args, 2) 315 ), 316 "SEQUENCE": exp.GenerateSeries.from_arg_list, 317 "SIZE": exp.ArraySize.from_arg_list, 318 "SPLIT": exp.RegexpSplit.from_arg_list, 319 "STR_TO_MAP": lambda args: exp.StrToMap( 320 this=seq_get(args, 0), 321 pair_delim=seq_get(args, 1) or exp.Literal.string(","), 322 key_value_delim=seq_get(args, 2) or exp.Literal.string(":"), 323 ), 324 "TO_DATE": build_formatted_time(exp.TsOrDsToDate, "hive"), 325 "TO_JSON": exp.JSONFormat.from_arg_list, 326 "TRUNC": exp.TimestampTrunc.from_arg_list, 327 "UNBASE64": exp.FromBase64.from_arg_list, 328 "UNIX_TIMESTAMP": lambda args: build_formatted_time(exp.StrToUnix, "hive", True)( 329 args or [exp.CurrentTimestamp()] 330 ), 331 "YEAR": lambda args: exp.Year(this=exp.TsOrDsToDate.from_arg_list(args)), 332 } 333 334 NO_PAREN_FUNCTION_PARSERS = { 335 **parser.Parser.NO_PAREN_FUNCTION_PARSERS, 336 "TRANSFORM": lambda self: self._parse_transform(), 337 } 338 339 PROPERTY_PARSERS = { 340 **parser.Parser.PROPERTY_PARSERS, 341 "SERDEPROPERTIES": lambda self: exp.SerdeProperties( 342 expressions=self._parse_wrapped_csv(self._parse_property) 343 ), 344 } 345 346 def _parse_transform(self) -> t.Optional[exp.Transform | exp.QueryTransform]: 347 if not self._match(TokenType.L_PAREN, advance=False): 348 self._retreat(self._index - 1) 349 return None 350 351 args = self._parse_wrapped_csv(self._parse_lambda) 352 row_format_before = self._parse_row_format(match_row=True) 353 354 record_writer = None 355 if self._match_text_seq("RECORDWRITER"): 356 record_writer = self._parse_string() 357 358 if not self._match(TokenType.USING): 359 return exp.Transform.from_arg_list(args) 360 361 command_script = self._parse_string() 362 363 self._match(TokenType.ALIAS) 364 schema = self._parse_schema() 365 366 row_format_after = self._parse_row_format(match_row=True) 367 record_reader = None 368 if self._match_text_seq("RECORDREADER"): 369 record_reader = self._parse_string() 370 371 return self.expression( 372 exp.QueryTransform, 373 expressions=args, 374 command_script=command_script, 375 schema=schema, 376 row_format_before=row_format_before, 377 record_writer=record_writer, 378 row_format_after=row_format_after, 379 record_reader=record_reader, 380 ) 381 382 def _parse_types( 383 self, check_func: bool = False, schema: bool = False, allow_identifiers: bool = True 384 ) -> t.Optional[exp.Expression]: 385 """ 386 Spark (and most likely Hive) treats casts to CHAR(length) and VARCHAR(length) as casts to 387 STRING in all contexts except for schema definitions. For example, this is in Spark v3.4.0: 388 389 spark-sql (default)> select cast(1234 as varchar(2)); 390 23/06/06 15:51:18 WARN CharVarcharUtils: The Spark cast operator does not support 391 char/varchar type and simply treats them as string type. Please use string type 392 directly to avoid confusion. Otherwise, you can set spark.sql.legacy.charVarcharAsString 393 to true, so that Spark treat them as string type as same as Spark 3.0 and earlier 394 395 1234 396 Time taken: 4.265 seconds, Fetched 1 row(s) 397 398 This shows that Spark doesn't truncate the value into '12', which is inconsistent with 399 what other dialects (e.g. postgres) do, so we need to drop the length to transpile correctly. 400 401 Reference: https://spark.apache.org/docs/latest/sql-ref-datatypes.html 402 """ 403 this = super()._parse_types( 404 check_func=check_func, schema=schema, allow_identifiers=allow_identifiers 405 ) 406 407 if this and not schema: 408 return this.transform( 409 lambda node: ( 410 node.replace(exp.DataType.build("text")) 411 if isinstance(node, exp.DataType) and node.is_type("char", "varchar") 412 else node 413 ), 414 copy=False, 415 ) 416 417 return this 418 419 def _parse_partition_and_order( 420 self, 421 ) -> t.Tuple[t.List[exp.Expression], t.Optional[exp.Expression]]: 422 return ( 423 ( 424 self._parse_csv(self._parse_assignment) 425 if self._match_set({TokenType.PARTITION_BY, TokenType.DISTRIBUTE_BY}) 426 else [] 427 ), 428 super()._parse_order(skip_order_token=self._match(TokenType.SORT_BY)), 429 ) 430 431 def _parse_parameter(self) -> exp.Parameter: 432 self._match(TokenType.L_BRACE) 433 this = self._parse_identifier() or self._parse_primary_or_var() 434 expression = self._match(TokenType.COLON) and ( 435 self._parse_identifier() or self._parse_primary_or_var() 436 ) 437 self._match(TokenType.R_BRACE) 438 return self.expression(exp.Parameter, this=this, 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'>>, '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'>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayAgg'>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Chr'>>, 'CHAR': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Chr'>>, 'COALESCE': <function Parser.<lambda>>, 'IFNULL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Coalesce'>>, 'NVL': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Coalesce'>>, 'COLLATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Collate'>>, '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'>>, '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': <bound method Func.from_arg_list of <class 'sqlglot.expressions.Count'>>, '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_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>>, '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'>>, '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'>>, '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'>>, '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'>>, '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_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'>>, 'JSON_EXTRACT': <function build_extract_json_with_path.<locals>._builder>, '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'>>, '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'>>, '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'>>, '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'>>, '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'>>, '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'>>, '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 Hive.Parser.<lambda>>, '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'>>, '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_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'>>, '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_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_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'>>, 'UNIX_DATE': <bound method Func.from_arg_list of <class 'sqlglot.expressions.UnixDate'>>, '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'>>, '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'>>, 'WHEN': <bound method Func.from_arg_list of <class 'sqlglot.expressions.When'>>, '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>>, '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>>, 'MOD': <function build_mod>, 'RPAD': <function Parser.<lambda>>, 'RIGHTPAD': <function Parser.<lambda>>, 'SCOPE_RESOLUTION': <function Parser.<lambda>>, 'TO_HEX': <function build_hex>, 'BASE64': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ToBase64'>>, 'COLLECT_LIST': <bound method Func.from_arg_list of <class 'sqlglot.expressions.ArrayAgg'>>, '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'>>, 'LOCATE': <function locate_to_strposition>, '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_formatted_time.<locals>._builder>, '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>>, 'NEXT': <function Parser.<lambda>>, 'TRANSFORM': <function Hive.Parser.<lambda>>}
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>>, '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>>, '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.ROLLUP: 'ROLLUP'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.UINT128: 'UINT128'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.SOME: 'SOME'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.RENAME: 'RENAME'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.NAME: 'NAME'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.IS: 'IS'>, <TokenType.INET: 'INET'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.FIRST: 'FIRST'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.NATURAL: 'NATURAL'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.CASE: 'CASE'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.ROWS: 'ROWS'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.YEAR: 'YEAR'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.ANY: 'ANY'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.ALL: 'ALL'>, <TokenType.TABLE: 'TABLE'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.RANGE: 'RANGE'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.IPV6: 'IPV6'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.SHOW: 'SHOW'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.UINT: 'UINT'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.RIGHT: 'RIGHT'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.BIT: 'BIT'>, <TokenType.TIME: 'TIME'>, <TokenType.CUBE: 'CUBE'>, <TokenType.CHAR: 'CHAR'>, <TokenType.KILL: 'KILL'>, <TokenType.END: 'END'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.WINDOW: 'WINDOW'>, <TokenType.ASC: 'ASC'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.INT256: 'INT256'>, <TokenType.MERGE: 'MERGE'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.JSONB: 'JSONB'>, <TokenType.ANTI: 'ANTI'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.MODEL: 'MODEL'>, <TokenType.DATE: 'DATE'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.ENUM: 'ENUM'>, <TokenType.CACHE: 'CACHE'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.APPLY: 'APPLY'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.COPY: 'COPY'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.VAR: 'VAR'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.XML: 'XML'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.TEXT: 'TEXT'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.DATE32: 'DATE32'>, <TokenType.LOAD: 'LOAD'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.DELETE: 'DELETE'>, <TokenType.ROW: 'ROW'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.MAP: 'MAP'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.SEMI: 'SEMI'>, <TokenType.TAG: 'TAG'>, <TokenType.LEFT: 'LEFT'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.UINT256: 'UINT256'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.BINARY: 'BINARY'>, <TokenType.OFFSET: 'OFFSET'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.ASOF: 'ASOF'>, <TokenType.INDEX: 'INDEX'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.INT: 'INT'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.FILTER: 'FILTER'>, <TokenType.SET: 'SET'>, <TokenType.TRUE: 'TRUE'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.UUID: 'UUID'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.JSON: 'JSON'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.MONEY: 'MONEY'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.FULL: 'FULL'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.DESC: 'DESC'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.USE: 'USE'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.FINAL: 'FINAL'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.SUPER: 'SUPER'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.IPV4: 'IPV4'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.NEXT: 'NEXT'>, <TokenType.KEEP: 'KEEP'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.VIEW: 'VIEW'>, <TokenType.NULL: 'NULL'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.LIST: 'LIST'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.DIV: 'DIV'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.FALSE: 'FALSE'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.INT128: 'INT128'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.TOP: 'TOP'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.ORDINALITY: 'ORDINALITY'>}
TABLE_ALIAS_TOKENS =
{<TokenType.ROLLUP: 'ROLLUP'>, <TokenType.INTERVAL: 'INTERVAL'>, <TokenType.UINT128: 'UINT128'>, <TokenType.UNIQUE: 'UNIQUE'>, <TokenType.NESTED: 'NESTED'>, <TokenType.RECURSIVE: 'RECURSIVE'>, <TokenType.SOME: 'SOME'>, <TokenType.TIMESTAMP_MS: 'TIMESTAMP_MS'>, <TokenType.PROCEDURE: 'PROCEDURE'>, <TokenType.UNNEST: 'UNNEST'>, <TokenType.STORAGE_INTEGRATION: 'STORAGE_INTEGRATION'>, <TokenType.PRAGMA: 'PRAGMA'>, <TokenType.ENUM8: 'ENUM8'>, <TokenType.RENAME: 'RENAME'>, <TokenType.VARIANT: 'VARIANT'>, <TokenType.NAME: 'NAME'>, <TokenType.VECTOR: 'VECTOR'>, <TokenType.IMAGE: 'IMAGE'>, <TokenType.CURRENT_DATE: 'CURRENT_DATE'>, <TokenType.IS: 'IS'>, <TokenType.INET: 'INET'>, <TokenType.SCHEMA: 'SCHEMA'>, <TokenType.FIRST: 'FIRST'>, <TokenType.CURRENT_DATETIME: 'CURRENT_DATETIME'>, <TokenType.TRUNCATE: 'TRUNCATE'>, <TokenType.ARRAY: 'ARRAY'>, <TokenType.FORMAT: 'FORMAT'>, <TokenType.FOREIGN_KEY: 'FOREIGN_KEY'>, <TokenType.MEDIUMTEXT: 'MEDIUMTEXT'>, <TokenType.HSTORE: 'HSTORE'>, <TokenType.CASE: 'CASE'>, <TokenType.TIMESTAMP_NS: 'TIMESTAMP_NS'>, <TokenType.PARTITION: 'PARTITION'>, <TokenType.DICTIONARY: 'DICTIONARY'>, <TokenType.INT4RANGE: 'INT4RANGE'>, <TokenType.SIMPLEAGGREGATEFUNCTION: 'SIMPLEAGGREGATEFUNCTION'>, <TokenType.COMMIT: 'COMMIT'>, <TokenType.ROWS: 'ROWS'>, <TokenType.GEOGRAPHY: 'GEOGRAPHY'>, <TokenType.NVARCHAR: 'NVARCHAR'>, <TokenType.VARBINARY: 'VARBINARY'>, <TokenType.INT4MULTIRANGE: 'INT4MULTIRANGE'>, <TokenType.YEAR: 'YEAR'>, <TokenType.UMEDIUMINT: 'UMEDIUMINT'>, <TokenType.ANY: 'ANY'>, <TokenType.FUNCTION: 'FUNCTION'>, <TokenType.ALL: 'ALL'>, <TokenType.TABLE: 'TABLE'>, <TokenType.COLUMN: 'COLUMN'>, <TokenType.RANGE: 'RANGE'>, <TokenType.LONGBLOB: 'LONGBLOB'>, <TokenType.IPV6: 'IPV6'>, <TokenType.COMMAND: 'COMMAND'>, <TokenType.SHOW: 'SHOW'>, <TokenType.SETTINGS: 'SETTINGS'>, <TokenType.IPPREFIX: 'IPPREFIX'>, <TokenType.UINT: 'UINT'>, <TokenType.UNIQUEIDENTIFIER: 'UNIQUEIDENTIFIER'>, <TokenType.UNKNOWN: 'UNKNOWN'>, <TokenType.UBIGINT: 'UBIGINT'>, <TokenType.UTINYINT: 'UTINYINT'>, <TokenType.TSTZMULTIRANGE: 'TSTZMULTIRANGE'>, <TokenType.COLLATE: 'COLLATE'>, <TokenType.BIT: 'BIT'>, <TokenType.TIME: 'TIME'>, <TokenType.CUBE: 'CUBE'>, <TokenType.CHAR: 'CHAR'>, <TokenType.KILL: 'KILL'>, <TokenType.END: 'END'>, <TokenType.NUMRANGE: 'NUMRANGE'>, <TokenType.DATERANGE: 'DATERANGE'>, <TokenType.ASC: 'ASC'>, <TokenType.OBJECT_IDENTIFIER: 'OBJECT_IDENTIFIER'>, <TokenType.IDENTIFIER: 'IDENTIFIER'>, <TokenType.AUTO_INCREMENT: 'AUTO_INCREMENT'>, <TokenType.INT256: 'INT256'>, <TokenType.MERGE: 'MERGE'>, <TokenType.BEGIN: 'BEGIN'>, <TokenType.DEFAULT: 'DEFAULT'>, <TokenType.LONGTEXT: 'LONGTEXT'>, <TokenType.TINYTEXT: 'TINYTEXT'>, <TokenType.DATEMULTIRANGE: 'DATEMULTIRANGE'>, <TokenType.GEOMETRY: 'GEOMETRY'>, <TokenType.ESCAPE: 'ESCAPE'>, <TokenType.TINYBLOB: 'TINYBLOB'>, <TokenType.JSONB: 'JSONB'>, <TokenType.EXISTS: 'EXISTS'>, <TokenType.FLOAT: 'FLOAT'>, <TokenType.CURRENT_USER: 'CURRENT_USER'>, <TokenType.MODEL: 'MODEL'>, <TokenType.DATE: 'DATE'>, <TokenType.SMALLMONEY: 'SMALLMONEY'>, <TokenType.ENUM: 'ENUM'>, <TokenType.CACHE: 'CACHE'>, <TokenType.INT8RANGE: 'INT8RANGE'>, <TokenType.FIXEDSTRING: 'FIXEDSTRING'>, <TokenType.TSTZRANGE: 'TSTZRANGE'>, <TokenType.COMMENT: 'COMMENT'>, <TokenType.TDIGEST: 'TDIGEST'>, <TokenType.COPY: 'COPY'>, <TokenType.DESCRIBE: 'DESCRIBE'>, <TokenType.VAR: 'VAR'>, <TokenType.ISNULL: 'ISNULL'>, <TokenType.PERCENT: 'PERCENT'>, <TokenType.TIMESTAMPTZ: 'TIMESTAMPTZ'>, <TokenType.OPERATOR: 'OPERATOR'>, <TokenType.CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'>, <TokenType.XML: 'XML'>, <TokenType.IPADDRESS: 'IPADDRESS'>, <TokenType.OVERWRITE: 'OVERWRITE'>, <TokenType.DOUBLE: 'DOUBLE'>, <TokenType.TEXT: 'TEXT'>, <TokenType.DATETIME: 'DATETIME'>, <TokenType.DATE32: 'DATE32'>, <TokenType.LOAD: 'LOAD'>, <TokenType.INT8MULTIRANGE: 'INT8MULTIRANGE'>, <TokenType.BPCHAR: 'BPCHAR'>, <TokenType.NULLABLE: 'NULLABLE'>, <TokenType.NCHAR: 'NCHAR'>, <TokenType.BIGINT: 'BIGINT'>, <TokenType.DELETE: 'DELETE'>, <TokenType.ROW: 'ROW'>, <TokenType.WAREHOUSE: 'WAREHOUSE'>, <TokenType.TIMETZ: 'TIMETZ'>, <TokenType.MAP: 'MAP'>, <TokenType.DATABASE: 'DATABASE'>, <TokenType.CURRENT_TIME: 'CURRENT_TIME'>, <TokenType.USERDEFINED: 'USERDEFINED'>, <TokenType.DATETIME64: 'DATETIME64'>, <TokenType.ENUM16: 'ENUM16'>, <TokenType.AGGREGATEFUNCTION: 'AGGREGATEFUNCTION'>, <TokenType.TEMPORARY: 'TEMPORARY'>, <TokenType.TAG: 'TAG'>, <TokenType.OVERLAPS: 'OVERLAPS'>, <TokenType.UINT256: 'UINT256'>, <TokenType.NUMMULTIRANGE: 'NUMMULTIRANGE'>, <TokenType.STRAIGHT_JOIN: 'STRAIGHT_JOIN'>, <TokenType.TIMESTAMPLTZ: 'TIMESTAMPLTZ'>, <TokenType.BINARY: 'BINARY'>, <TokenType.SEQUENCE: 'SEQUENCE'>, <TokenType.INDEX: 'INDEX'>, <TokenType.MEDIUMINT: 'MEDIUMINT'>, <TokenType.CONSTRAINT: 'CONSTRAINT'>, <TokenType.INT: 'INT'>, <TokenType.LOWCARDINALITY: 'LOWCARDINALITY'>, <TokenType.SMALLINT: 'SMALLINT'>, <TokenType.FILTER: 'FILTER'>, <TokenType.SET: 'SET'>, <TokenType.TRUE: 'TRUE'>, <TokenType.UNPIVOT: 'UNPIVOT'>, <TokenType.TSRANGE: 'TSRANGE'>, <TokenType.UUID: 'UUID'>, <TokenType.DECIMAL: 'DECIMAL'>, <TokenType.JSON: 'JSON'>, <TokenType.VARCHAR: 'VARCHAR'>, <TokenType.MONEY: 'MONEY'>, <TokenType.PSEUDO_TYPE: 'PSEUDO_TYPE'>, <TokenType.SMALLSERIAL: 'SMALLSERIAL'>, <TokenType.DESC: 'DESC'>, <TokenType.MEDIUMBLOB: 'MEDIUMBLOB'>, <TokenType.USE: 'USE'>, <TokenType.REPLACE: 'REPLACE'>, <TokenType.FINAL: 'FINAL'>, <TokenType.OBJECT: 'OBJECT'>, <TokenType.SUPER: 'SUPER'>, <TokenType.REFERENCES: 'REFERENCES'>, <TokenType.IPV4: 'IPV4'>, <TokenType.BOOLEAN: 'BOOLEAN'>, <TokenType.NEXT: 'NEXT'>, <TokenType.KEEP: 'KEEP'>, <TokenType.REFRESH: 'REFRESH'>, <TokenType.BIGDECIMAL: 'BIGDECIMAL'>, <TokenType.VIEW: 'VIEW'>, <TokenType.NULL: 'NULL'>, <TokenType.SERIAL: 'SERIAL'>, <TokenType.USMALLINT: 'USMALLINT'>, <TokenType.UPDATE: 'UPDATE'>, <TokenType.HLLSKETCH: 'HLLSKETCH'>, <TokenType.EXECUTE: 'EXECUTE'>, <TokenType.ROWVERSION: 'ROWVERSION'>, <TokenType.LIST: 'LIST'>, <TokenType.BIGSERIAL: 'BIGSERIAL'>, <TokenType.TIMESTAMPNTZ: 'TIMESTAMPNTZ'>, <TokenType.TIMESTAMP_S: 'TIMESTAMP_S'>, <TokenType.DIV: 'DIV'>, <TokenType.STRUCT: 'STRUCT'>, <TokenType.TINYINT: 'TINYINT'>, <TokenType.FALSE: 'FALSE'>, <TokenType.PIVOT: 'PIVOT'>, <TokenType.INT128: 'INT128'>, <TokenType.VOLATILE: 'VOLATILE'>, <TokenType.UDECIMAL: 'UDECIMAL'>, <TokenType.STREAMLIT: 'STREAMLIT'>, <TokenType.TIMESTAMP: 'TIMESTAMP'>, <TokenType.TOP: 'TOP'>, <TokenType.TSMULTIRANGE: 'TSMULTIRANGE'>, <TokenType.ORDINALITY: 'ORDINALITY'>}
SET_TRIE: Dict =
{'GLOBAL': {0: True}, 'LOCAL': {0: True}, 'SESSION': {0: True}, 'TRANSACTION': {0: True}}
Inherited Members
- sqlglot.parser.Parser
- Parser
- NO_PAREN_FUNCTIONS
- 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
- INTERVAL_VARS
- 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
- 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
- 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
- error_level
- error_message_context
- max_errors
- dialect
- reset
- parse
- parse_into
- check_errors
- raise_error
- expression
- validate_expression
- errors
- sql
440 class Generator(generator.Generator): 441 LIMIT_FETCH = "LIMIT" 442 TABLESAMPLE_WITH_METHOD = False 443 JOIN_HINTS = False 444 TABLE_HINTS = False 445 QUERY_HINTS = False 446 INDEX_ON = "ON TABLE" 447 EXTRACT_ALLOWS_QUOTES = False 448 NVL2_SUPPORTED = False 449 LAST_DAY_SUPPORTS_DATE_PART = False 450 JSON_PATH_SINGLE_QUOTE_ESCAPE = True 451 SUPPORTS_TO_NUMBER = False 452 WITH_PROPERTIES_PREFIX = "TBLPROPERTIES" 453 PARSE_JSON_NAME = None 454 PAD_FILL_PATTERN_IS_REQUIRED = True 455 456 EXPRESSIONS_WITHOUT_NESTED_CTES = { 457 exp.Insert, 458 exp.Select, 459 exp.Subquery, 460 exp.SetOperation, 461 } 462 463 SUPPORTED_JSON_PATH_PARTS = { 464 exp.JSONPathKey, 465 exp.JSONPathRoot, 466 exp.JSONPathSubscript, 467 exp.JSONPathWildcard, 468 } 469 470 TYPE_MAPPING = { 471 **generator.Generator.TYPE_MAPPING, 472 exp.DataType.Type.BIT: "BOOLEAN", 473 exp.DataType.Type.DATETIME: "TIMESTAMP", 474 exp.DataType.Type.ROWVERSION: "BINARY", 475 exp.DataType.Type.TEXT: "STRING", 476 exp.DataType.Type.TIME: "TIMESTAMP", 477 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", 478 exp.DataType.Type.UTINYINT: "SMALLINT", 479 exp.DataType.Type.VARBINARY: "BINARY", 480 } 481 482 TRANSFORMS = { 483 **generator.Generator.TRANSFORMS, 484 exp.Group: transforms.preprocess([transforms.unalias_group]), 485 exp.Select: transforms.preprocess( 486 [ 487 transforms.eliminate_qualify, 488 transforms.eliminate_distinct_on, 489 transforms.unnest_to_explode, 490 ] 491 ), 492 exp.Property: _property_sql, 493 exp.AnyValue: rename_func("FIRST"), 494 exp.ApproxDistinct: approx_count_distinct_sql, 495 exp.ArgMax: arg_max_or_min_no_count("MAX_BY"), 496 exp.ArgMin: arg_max_or_min_no_count("MIN_BY"), 497 exp.ArrayConcat: rename_func("CONCAT"), 498 exp.ArrayToString: lambda self, e: self.func("CONCAT_WS", e.expression, e.this), 499 exp.ArraySize: rename_func("SIZE"), 500 exp.ArraySort: _array_sort_sql, 501 exp.With: no_recursive_cte_sql, 502 exp.DateAdd: _add_date_sql, 503 exp.DateDiff: _date_diff_sql, 504 exp.DateStrToDate: datestrtodate_sql, 505 exp.DateSub: _add_date_sql, 506 exp.DateToDi: lambda self, 507 e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Hive.DATEINT_FORMAT}) AS INT)", 508 exp.DiToDate: lambda self, 509 e: f"TO_DATE(CAST({self.sql(e, 'this')} AS STRING), {Hive.DATEINT_FORMAT})", 510 exp.FileFormatProperty: lambda self, 511 e: f"STORED AS {self.sql(e, 'this') if isinstance(e.this, exp.InputOutputFormat) else e.name.upper()}", 512 exp.FromBase64: rename_func("UNBASE64"), 513 exp.GenerateSeries: sequence_sql, 514 exp.GenerateDateArray: sequence_sql, 515 exp.If: if_sql(), 516 exp.ILike: no_ilike_sql, 517 exp.IsNan: rename_func("ISNAN"), 518 exp.JSONExtract: lambda self, e: self.func("GET_JSON_OBJECT", e.this, e.expression), 519 exp.JSONExtractScalar: lambda self, e: self.func( 520 "GET_JSON_OBJECT", e.this, e.expression 521 ), 522 exp.JSONFormat: _json_format_sql, 523 exp.Left: left_to_substring_sql, 524 exp.Map: var_map_sql, 525 exp.Max: max_or_greatest, 526 exp.MD5Digest: lambda self, e: self.func("UNHEX", self.func("MD5", e.this)), 527 exp.Min: min_or_least, 528 exp.MonthsBetween: lambda self, e: self.func("MONTHS_BETWEEN", e.this, e.expression), 529 exp.NotNullColumnConstraint: lambda _, e: ( 530 "" if e.args.get("allow_null") else "NOT NULL" 531 ), 532 exp.VarMap: var_map_sql, 533 exp.Create: preprocess( 534 [ 535 remove_unique_constraints, 536 ctas_with_tmp_tables_to_create_tmp_view, 537 move_schema_columns_to_partitioned_by, 538 ] 539 ), 540 exp.Quantile: rename_func("PERCENTILE"), 541 exp.ApproxQuantile: rename_func("PERCENTILE_APPROX"), 542 exp.RegexpExtract: regexp_extract_sql, 543 exp.RegexpReplace: regexp_replace_sql, 544 exp.RegexpLike: lambda self, e: self.binary(e, "RLIKE"), 545 exp.RegexpSplit: rename_func("SPLIT"), 546 exp.Right: right_to_substring_sql, 547 exp.SafeDivide: no_safe_divide_sql, 548 exp.SchemaCommentProperty: lambda self, e: self.naked_property(e), 549 exp.ArrayUniqueAgg: rename_func("COLLECT_SET"), 550 exp.Split: lambda self, e: self.func( 551 "SPLIT", e.this, self.func("CONCAT", "'\\\\Q'", e.expression) 552 ), 553 exp.StrPosition: strposition_to_locate_sql, 554 exp.StrToDate: _str_to_date_sql, 555 exp.StrToTime: _str_to_time_sql, 556 exp.StrToUnix: _str_to_unix_sql, 557 exp.StructExtract: struct_extract_sql, 558 exp.Table: transforms.preprocess([transforms.unnest_generate_series]), 559 exp.TimeStrToDate: rename_func("TO_DATE"), 560 exp.TimeStrToTime: timestrtotime_sql, 561 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), 562 exp.TimestampTrunc: lambda self, e: self.func("TRUNC", e.this, unit_to_str(e)), 563 exp.TimeToStr: lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e)), 564 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), 565 exp.ToBase64: rename_func("BASE64"), 566 exp.TsOrDiToDi: lambda self, 567 e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS STRING), '-', ''), 1, 8) AS INT)", 568 exp.TsOrDsAdd: _add_date_sql, 569 exp.TsOrDsDiff: _date_diff_sql, 570 exp.TsOrDsToDate: _to_date_sql, 571 exp.TryCast: no_trycast_sql, 572 exp.UnixToStr: lambda self, e: self.func( 573 "FROM_UNIXTIME", e.this, time_format("hive")(self, e) 574 ), 575 exp.UnixToTime: _unix_to_time_sql, 576 exp.UnixToTimeStr: rename_func("FROM_UNIXTIME"), 577 exp.Unnest: rename_func("EXPLODE"), 578 exp.PartitionedByProperty: lambda self, e: f"PARTITIONED BY {self.sql(e, 'this')}", 579 exp.NumberToStr: rename_func("FORMAT_NUMBER"), 580 exp.National: lambda self, e: self.national_sql(e, prefix=""), 581 exp.ClusteredColumnConstraint: lambda self, 582 e: f"({self.expressions(e, 'this', indent=False)})", 583 exp.NonClusteredColumnConstraint: lambda self, 584 e: f"({self.expressions(e, 'this', indent=False)})", 585 exp.NotForReplicationColumnConstraint: lambda *_: "", 586 exp.OnProperty: lambda *_: "", 587 exp.PrimaryKeyColumnConstraint: lambda *_: "PRIMARY KEY", 588 exp.WeekOfYear: rename_func("WEEKOFYEAR"), 589 exp.DayOfMonth: rename_func("DAYOFMONTH"), 590 exp.DayOfWeek: rename_func("DAYOFWEEK"), 591 } 592 593 PROPERTIES_LOCATION = { 594 **generator.Generator.PROPERTIES_LOCATION, 595 exp.FileFormatProperty: exp.Properties.Location.POST_SCHEMA, 596 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, 597 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, 598 exp.WithDataProperty: exp.Properties.Location.UNSUPPORTED, 599 } 600 601 def unnest_sql(self, expression: exp.Unnest) -> str: 602 return rename_func("EXPLODE")(self, expression) 603 604 def _jsonpathkey_sql(self, expression: exp.JSONPathKey) -> str: 605 if isinstance(expression.this, exp.JSONPathWildcard): 606 self.unsupported("Unsupported wildcard in JSONPathKey expression") 607 return "" 608 609 return super()._jsonpathkey_sql(expression) 610 611 def parameter_sql(self, expression: exp.Parameter) -> str: 612 this = self.sql(expression, "this") 613 expression_sql = self.sql(expression, "expression") 614 615 parent = expression.parent 616 this = f"{this}:{expression_sql}" if expression_sql else this 617 618 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 619 # We need to produce SET key = value instead of SET ${key} = value 620 return this 621 622 return f"${{{this}}}" 623 624 def schema_sql(self, expression: exp.Schema) -> str: 625 for ordered in expression.find_all(exp.Ordered): 626 if ordered.args.get("desc") is False: 627 ordered.set("desc", None) 628 629 return super().schema_sql(expression) 630 631 def constraint_sql(self, expression: exp.Constraint) -> str: 632 for prop in list(expression.find_all(exp.Properties)): 633 prop.pop() 634 635 this = self.sql(expression, "this") 636 expressions = self.expressions(expression, sep=" ", flat=True) 637 return f"CONSTRAINT {this} {expressions}" 638 639 def rowformatserdeproperty_sql(self, expression: exp.RowFormatSerdeProperty) -> str: 640 serde_props = self.sql(expression, "serde_properties") 641 serde_props = f" {serde_props}" if serde_props else "" 642 return f"ROW FORMAT SERDE {self.sql(expression, 'this')}{serde_props}" 643 644 def arrayagg_sql(self, expression: exp.ArrayAgg) -> str: 645 return self.func( 646 "COLLECT_LIST", 647 expression.this.this if isinstance(expression.this, exp.Order) else expression.this, 648 ) 649 650 def datatype_sql(self, expression: exp.DataType) -> str: 651 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 652 not expression.expressions or expression.expressions[0].name == "MAX" 653 ): 654 expression = exp.DataType.build("text") 655 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 656 expression.set("this", exp.DataType.Type.VARCHAR) 657 elif expression.this in exp.DataType.TEMPORAL_TYPES: 658 expression = exp.DataType.build(expression.this) 659 elif expression.is_type("float"): 660 size_expression = expression.find(exp.DataTypeParam) 661 if size_expression: 662 size = int(size_expression.name) 663 expression = ( 664 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 665 ) 666 667 return super().datatype_sql(expression) 668 669 def version_sql(self, expression: exp.Version) -> str: 670 sql = super().version_sql(expression) 671 return sql.replace("FOR ", "", 1) 672 673 def struct_sql(self, expression: exp.Struct) -> str: 674 values = [] 675 676 for i, e in enumerate(expression.expressions): 677 if isinstance(e, exp.PropertyEQ): 678 self.unsupported("Hive does not support named structs.") 679 values.append(e.expression) 680 else: 681 values.append(e) 682 683 return self.func("STRUCT", *values) 684 685 def alterset_sql(self, expression: exp.AlterSet) -> str: 686 exprs = self.expressions(expression, flat=True) 687 exprs = f" {exprs}" if exprs else "" 688 location = self.sql(expression, "location") 689 location = f" LOCATION {location}" if location else "" 690 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 691 file_format = f" FILEFORMAT {file_format}" if file_format else "" 692 serde = self.sql(expression, "serde") 693 serde = f" SERDE {serde}" if serde else "" 694 tags = self.expressions(expression, key="tag", flat=True, sep="") 695 tags = f" TAGS {tags}" if tags else "" 696 697 return f"SET{serde}{exprs}{location}{file_format}{tags}" 698 699 def serdeproperties_sql(self, expression: exp.SerdeProperties) -> str: 700 prefix = "WITH " if expression.args.get("with") else "" 701 exprs = self.expressions(expression, flat=True) 702 703 return f"{prefix}SERDEPROPERTIES ({exprs})"
Generator converts a given syntax tree to the corresponding SQL string.
Arguments:
- pretty: Whether to format the produced SQL string. Default: False.
- identify: Determines when an identifier should be quoted. Possible values are: False (default): Never quote, except in cases where it's mandatory by the dialect. True or 'always': Always quote. 'safe': Only quote identifiers that are case insensitive.
- normalize: Whether to normalize identifiers to lowercase. Default: False.
- pad: The pad size in a formatted string. For example, this affects the indentation of a projection in a query, relative to its nesting level. Default: 2.
- indent: The indentation size in a formatted string. For example, this affects the
indentation of subqueries and filters under a
WHERE
clause. Default: 2. - normalize_functions: How to normalize function names. Possible values are: "upper" or True (default): Convert names to uppercase. "lower": Convert names to lowercase. False: Disables function name normalization.
- unsupported_level: Determines the generator's behavior when it encounters unsupported expressions. Default ErrorLevel.WARN.
- max_unsupported: Maximum number of unsupported messages to include in a raised UnsupportedError. This is only relevant if unsupported_level is ErrorLevel.RAISE. Default: 3
- leading_comma: Whether the comma is leading or trailing in select expressions. This is only relevant when generating in pretty mode. Default: False
- max_text_width: The max number of characters in a segment before creating new lines in pretty mode. The default is on the smaller end because the length only represents a segment and not the true line length. Default: 80
- comments: Whether to preserve comments in the output SQL code. Default: True
EXPRESSIONS_WITHOUT_NESTED_CTES =
{<class 'sqlglot.expressions.Insert'>, <class 'sqlglot.expressions.Select'>, <class 'sqlglot.expressions.Subquery'>, <class 'sqlglot.expressions.SetOperation'>}
SUPPORTED_JSON_PATH_PARTS =
{<class 'sqlglot.expressions.JSONPathSubscript'>, <class 'sqlglot.expressions.JSONPathRoot'>, <class 'sqlglot.expressions.JSONPathKey'>, <class 'sqlglot.expressions.JSONPathWildcard'>}
TYPE_MAPPING =
{<Type.NCHAR: 'NCHAR'>: 'CHAR', <Type.NVARCHAR: 'NVARCHAR'>: 'VARCHAR', <Type.MEDIUMTEXT: 'MEDIUMTEXT'>: 'TEXT', <Type.LONGTEXT: 'LONGTEXT'>: 'TEXT', <Type.TINYTEXT: 'TINYTEXT'>: 'TEXT', <Type.MEDIUMBLOB: 'MEDIUMBLOB'>: 'BLOB', <Type.LONGBLOB: 'LONGBLOB'>: 'BLOB', <Type.TINYBLOB: 'TINYBLOB'>: 'BLOB', <Type.INET: 'INET'>: 'INET', <Type.ROWVERSION: 'ROWVERSION'>: 'BINARY', <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.AutoRefreshProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.BackupProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.CaseSpecificColumnConstraint'>: <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.ExternalProperty'>: <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.IntervalSpan'>: <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.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.TemporaryProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.TagColumnConstraint'>: <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.UppercaseColumnConstraint'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.UnloggedProperty'>: <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.WithSchemaBindingProperty'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.WithOperator'>: <function Generator.<lambda>>, <class 'sqlglot.expressions.Group'>: <function preprocess.<locals>._to_sql>, <class 'sqlglot.expressions.Select'>: <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.ArraySize'>: <function rename_func.<locals>.<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.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.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.SafeDivide'>: <function no_safe_divide_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.StrPosition'>: <function strposition_to_locate_sql>, <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.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.TimeToStr'>: <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.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>>}
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.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.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.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.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.StreamingTableProperty'>: <Location.POST_CREATE: 'POST_CREATE'>, <class 'sqlglot.expressions.StrictProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <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.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.WithSchemaBindingProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>, <class 'sqlglot.expressions.WithSystemVersioningProperty'>: <Location.POST_SCHEMA: 'POST_SCHEMA'>}
611 def parameter_sql(self, expression: exp.Parameter) -> str: 612 this = self.sql(expression, "this") 613 expression_sql = self.sql(expression, "expression") 614 615 parent = expression.parent 616 this = f"{this}:{expression_sql}" if expression_sql else this 617 618 if isinstance(parent, exp.EQ) and isinstance(parent.parent, exp.SetItem): 619 # We need to produce SET key = value instead of SET ${key} = value 620 return this 621 622 return f"${{{this}}}"
def
rowformatserdeproperty_sql(self, expression: sqlglot.expressions.RowFormatSerdeProperty) -> str:
650 def datatype_sql(self, expression: exp.DataType) -> str: 651 if expression.this in self.PARAMETERIZABLE_TEXT_TYPES and ( 652 not expression.expressions or expression.expressions[0].name == "MAX" 653 ): 654 expression = exp.DataType.build("text") 655 elif expression.is_type(exp.DataType.Type.TEXT) and expression.expressions: 656 expression.set("this", exp.DataType.Type.VARCHAR) 657 elif expression.this in exp.DataType.TEMPORAL_TYPES: 658 expression = exp.DataType.build(expression.this) 659 elif expression.is_type("float"): 660 size_expression = expression.find(exp.DataTypeParam) 661 if size_expression: 662 size = int(size_expression.name) 663 expression = ( 664 exp.DataType.build("float") if size <= 32 else exp.DataType.build("double") 665 ) 666 667 return super().datatype_sql(expression)
673 def struct_sql(self, expression: exp.Struct) -> str: 674 values = [] 675 676 for i, e in enumerate(expression.expressions): 677 if isinstance(e, exp.PropertyEQ): 678 self.unsupported("Hive does not support named structs.") 679 values.append(e.expression) 680 else: 681 values.append(e) 682 683 return self.func("STRUCT", *values)
685 def alterset_sql(self, expression: exp.AlterSet) -> str: 686 exprs = self.expressions(expression, flat=True) 687 exprs = f" {exprs}" if exprs else "" 688 location = self.sql(expression, "location") 689 location = f" LOCATION {location}" if location else "" 690 file_format = self.expressions(expression, key="file_format", flat=True, sep=" ") 691 file_format = f" FILEFORMAT {file_format}" if file_format else "" 692 serde = self.sql(expression, "serde") 693 serde = f" SERDE {serde}" if serde else "" 694 tags = self.expressions(expression, key="tag", flat=True, sep="") 695 tags = f" TAGS {tags}" if tags else "" 696 697 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
- EXPLICIT_SET_OP
- 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
- TIME_PART_SINGULARS
- AFTER_HAVING_MODIFIER_TRANSFORMS
- TOKEN_MAPPING
- STRUCT_DELIMITER
- PARAMETER_TOKEN
- NAMED_PLACEHOLDER_TOKEN
- 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
- except_sql
- except_op
- fetch_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
- intersect_sql
- intersect_op
- introducer_sql
- kill_sql
- pseudotype_sql
- objectidentifier_sql
- onconflict_sql
- returning_sql
- rowformatdelimitedproperty_sql
- withtablehint_sql
- indextablehint_sql
- historicaldata_sql
- table_parts
- table_sql
- tablesample_sql
- pivot_sql
- tuple_sql
- update_sql
- values_sql
- var_sql
- into_sql
- from_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
- set_operations
- union_sql
- union_op
- prewhere_sql
- where_sql
- window_sql
- partition_by_sql
- windowspec_sql
- withingroup_sql
- between_sql
- bracket_offset_expressions
- bracket_sql
- all_sql
- any_sql
- exists_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
- alterdiststyle_sql
- altersortkey_sql
- renametable_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
- 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
- try_sql
- log_sql
- use_sql
- binary
- 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
- merge_sql
- tochar_sql
- tonumber_sql
- dictproperty_sql
- dictrange_sql
- dictsubproperty_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
- 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