sqlglot 27.16.3__py3-none-any.whl → 27.17.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
sqlglot/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '27.16.3'
32
- __version_tuple__ = version_tuple = (27, 16, 3)
31
+ __version__ = version = '27.17.0'
32
+ __version_tuple__ = version_tuple = (27, 17, 0)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -332,7 +332,6 @@ class ClickHouse(Dialect):
332
332
  "PARSEDATETIME": _build_datetime_format(exp.ParseDatetime),
333
333
  "RANDCANONICAL": exp.Rand.from_arg_list,
334
334
  "STR_TO_DATE": _build_str_to_date,
335
- "TUPLE": exp.Struct.from_arg_list,
336
335
  "TIMESTAMP_SUB": build_date_delta(exp.TimestampSub, default_unit=None),
337
336
  "TIMESTAMPSUB": build_date_delta(exp.TimestampSub, default_unit=None),
338
337
  "TIMESTAMP_ADD": build_date_delta(exp.TimestampAdd, default_unit=None),
@@ -505,14 +504,13 @@ class ClickHouse(Dialect):
505
504
  }
506
505
  )(AGG_FUNCTIONS, AGG_FUNCTIONS_SUFFIXES)
507
506
 
508
- FUNCTIONS_WITH_ALIASED_ARGS = {*parser.Parser.FUNCTIONS_WITH_ALIASED_ARGS, "TUPLE"}
509
-
510
507
  FUNCTION_PARSERS = {
511
508
  **parser.Parser.FUNCTION_PARSERS,
512
509
  "ARRAYJOIN": lambda self: self.expression(exp.Explode, this=self._parse_expression()),
513
510
  "QUANTILE": lambda self: self._parse_quantile(),
514
511
  "MEDIAN": lambda self: self._parse_quantile(),
515
512
  "COLUMNS": lambda self: self._parse_columns(),
513
+ "TUPLE": lambda self: exp.Struct.from_arg_list(self._parse_function_args(alias=True)),
516
514
  }
517
515
 
518
516
  FUNCTION_PARSERS.pop("MATCH")
@@ -1126,6 +1124,7 @@ class ClickHouse(Dialect):
1126
1124
  exp.RegexpLike: lambda self, e: self.func("match", e.this, e.expression),
1127
1125
  exp.Rand: rename_func("randCanonical"),
1128
1126
  exp.StartsWith: rename_func("startsWith"),
1127
+ exp.Struct: rename_func("tuple"),
1129
1128
  exp.EndsWith: rename_func("endsWith"),
1130
1129
  exp.EuclideanDistance: rename_func("L2Distance"),
1131
1130
  exp.StrPosition: lambda self, e: strposition_sql(
@@ -1296,3 +1296,9 @@ class DuckDB(Dialect):
1296
1296
  return self.sql(exp.Cast(this=func, to=this.type))
1297
1297
 
1298
1298
  return self.sql(func)
1299
+
1300
+ def format_sql(self, expression: exp.Format) -> str:
1301
+ if expression.name.lower() == "%s" and len(expression.expressions) == 1:
1302
+ return self.func("FORMAT", "'{}'", expression.expressions[0])
1303
+
1304
+ return self.function_fallback_sql(expression)
@@ -375,6 +375,8 @@ class Postgres(Dialect):
375
375
  VAR_SINGLE_TOKENS = {"$"}
376
376
 
377
377
  class Parser(parser.Parser):
378
+ SUPPORTS_OMITTED_INTERVAL_SPAN_UNIT = True
379
+
378
380
  PROPERTY_PARSERS = {
379
381
  **parser.Parser.PROPERTY_PARSERS,
380
382
  "SET": lambda self: self.expression(exp.SetConfigProperty, this=self._parse_set()),
@@ -426,7 +428,7 @@ class Postgres(Dialect):
426
428
  "DATE_PART": lambda self: self._parse_date_part(),
427
429
  "JSON_AGG": lambda self: self.expression(
428
430
  exp.JSONArrayAgg,
429
- this=self._parse_bitwise(),
431
+ this=self._parse_lambda(),
430
432
  order=self._parse_order(),
431
433
  ),
432
434
  "JSONB_EXISTS": lambda self: self._parse_jsonb_exists(),
@@ -324,6 +324,15 @@ def _build_regexp_extract(expr_type: t.Type[E]) -> t.Callable[[t.List], E]:
324
324
  return _builder
325
325
 
326
326
 
327
+ def _build_like(expr_type: t.Type[E]) -> t.Callable[[t.List], E | exp.Escape]:
328
+ def _builder(args: t.List) -> E | exp.Escape:
329
+ like_expr = expr_type(this=args[0], expression=args[1])
330
+ escape = seq_get(args, 2)
331
+ return exp.Escape(this=like_expr, expression=escape) if escape else like_expr
332
+
333
+ return _builder
334
+
335
+
327
336
  def _regexpextract_sql(self, expression: exp.RegexpExtract | exp.RegexpExtractAll) -> str:
328
337
  # Other dialects don't support all of the following parameters, so we need to
329
338
  # generate default values as necessary to ensure the transpilation is correct
@@ -522,14 +531,24 @@ class Snowflake(Dialect):
522
531
  **Dialect.TYPE_TO_EXPRESSIONS,
523
532
  exp.DataType.Type.INT: {
524
533
  *Dialect.TYPE_TO_EXPRESSIONS[exp.DataType.Type.INT],
534
+ exp.Ascii,
525
535
  exp.Length,
536
+ exp.BitLength,
537
+ exp.Levenshtein,
526
538
  },
527
539
  exp.DataType.Type.VARCHAR: {
528
540
  *Dialect.TYPE_TO_EXPRESSIONS[exp.DataType.Type.VARCHAR],
541
+ exp.Base64DecodeString,
542
+ exp.Base64Encode,
529
543
  exp.MD5,
530
544
  exp.AIAgg,
531
545
  exp.AIClassify,
532
546
  exp.AISummarizeAgg,
547
+ exp.Chr,
548
+ exp.Collate,
549
+ exp.HexDecodeString,
550
+ exp.HexEncode,
551
+ exp.Initcap,
533
552
  exp.RegexpExtract,
534
553
  exp.RegexpReplace,
535
554
  exp.Repeat,
@@ -541,9 +560,12 @@ class Snowflake(Dialect):
541
560
  },
542
561
  exp.DataType.Type.BINARY: {
543
562
  *Dialect.TYPE_TO_EXPRESSIONS[exp.DataType.Type.BINARY],
563
+ exp.Base64DecodeBinary,
564
+ exp.Compress,
544
565
  exp.MD5Digest,
545
566
  exp.SHA1Digest,
546
567
  exp.SHA2Digest,
568
+ exp.Unhex,
547
569
  },
548
570
  exp.DataType.Type.BIGINT: {
549
571
  *Dialect.TYPE_TO_EXPRESSIONS[exp.DataType.Type.BIGINT],
@@ -678,6 +700,7 @@ class Snowflake(Dialect):
678
700
  "DATE_TRUNC": _date_trunc_to_time,
679
701
  "DATEADD": _build_date_time_add(exp.DateAdd),
680
702
  "DATEDIFF": _build_datediff,
703
+ "DAYOFWEEKISO": exp.DayOfWeekIso.from_arg_list,
681
704
  "DIV0": _build_if_from_div0,
682
705
  "EDITDISTANCE": lambda args: exp.Levenshtein(
683
706
  this=seq_get(args, 0), expression=seq_get(args, 1), max_dist=seq_get(args, 2)
@@ -746,6 +769,8 @@ class Snowflake(Dialect):
746
769
  "TO_JSON": exp.JSONFormat.from_arg_list,
747
770
  "VECTOR_L2_DISTANCE": exp.EuclideanDistance.from_arg_list,
748
771
  "ZEROIFNULL": _build_if_from_zeroifnull,
772
+ "LIKE": _build_like(exp.Like),
773
+ "ILIKE": _build_like(exp.ILike),
749
774
  }
750
775
  FUNCTIONS.pop("PREDICT")
751
776
 
@@ -1816,3 +1841,9 @@ class Snowflake(Dialect):
1816
1841
 
1817
1842
  def modelattribute_sql(self, expression: exp.ModelAttribute) -> str:
1818
1843
  return f"{self.sql(expression, 'this')}!{self.sql(expression, 'expression')}"
1844
+
1845
+ def format_sql(self, expression: exp.Format) -> str:
1846
+ if expression.name.lower() == "%s" and len(expression.expressions) == 1:
1847
+ return self.func("TO_CHAR", expression.expressions[0])
1848
+
1849
+ return self.function_fallback_sql(expression)
sqlglot/expressions.py CHANGED
@@ -6414,6 +6414,19 @@ class ToBase64(Func):
6414
6414
  pass
6415
6415
 
6416
6416
 
6417
+ # https://docs.snowflake.com/en/sql-reference/functions/base64_decode_binary
6418
+ class Base64DecodeBinary(Func):
6419
+ arg_types = {"this": True, "alphabet": False}
6420
+
6421
+
6422
+ class Base64DecodeString(Func):
6423
+ arg_types = {"this": True, "alphabet": False}
6424
+
6425
+
6426
+ class Base64Encode(Func):
6427
+ arg_types = {"this": True, "max_line_length": False, "alphabet": False}
6428
+
6429
+
6417
6430
  # https://trino.io/docs/current/functions/datetime.html#from_iso8601_timestamp
6418
6431
  class FromISO8601Timestamp(Func):
6419
6432
  _sql_names = ["FROM_ISO8601_TIMESTAMP"]
@@ -6465,6 +6478,21 @@ class Hex(Func):
6465
6478
  pass
6466
6479
 
6467
6480
 
6481
+ # https://docs.snowflake.com/en/sql-reference/functions/hex_decode_string
6482
+ class HexDecodeString(Func):
6483
+ pass
6484
+
6485
+
6486
+ class HexEncode(Func):
6487
+ arg_types = {"this": True, "case": False}
6488
+
6489
+
6490
+ # T-SQL: https://learn.microsoft.com/en-us/sql/t-sql/functions/compress-transact-sql?view=sql-server-ver17
6491
+ # Snowflake: https://docs.snowflake.com/en/sql-reference/functions/compress
6492
+ class Compress(Func):
6493
+ arg_types = {"this": True, "method": False}
6494
+
6495
+
6468
6496
  class LowerHex(Hex):
6469
6497
  pass
6470
6498
 
@@ -6871,6 +6899,10 @@ class Length(Func):
6871
6899
  _sql_names = ["LENGTH", "LEN", "CHAR_LENGTH", "CHARACTER_LENGTH"]
6872
6900
 
6873
6901
 
6902
+ class BitLength(Func):
6903
+ pass
6904
+
6905
+
6874
6906
  class Levenshtein(Func):
6875
6907
  arg_types = {
6876
6908
  "this": True,
@@ -8557,6 +8589,19 @@ def parse_identifier(name: str | Identifier, dialect: DialectType = None) -> Ide
8557
8589
 
8558
8590
  INTERVAL_STRING_RE = re.compile(r"\s*(-?[0-9]+(?:\.[0-9]+)?)\s*([a-zA-Z]+)\s*")
8559
8591
 
8592
+ # Matches day-time interval strings that contain
8593
+ # - A number of days (possibly negative or with decimals)
8594
+ # - At least one space
8595
+ # - Portions of a time-like signature, potentially negative
8596
+ # - Standard format [-]h+:m+:s+[.f+]
8597
+ # - Just minutes/seconds/frac seconds [-]m+:s+.f+
8598
+ # - Just hours, minutes, maybe colon [-]h+:m+[:]
8599
+ # - Just hours, maybe colon [-]h+[:]
8600
+ # - Just colon :
8601
+ INTERVAL_DAY_TIME_RE = re.compile(
8602
+ r"\s*-?\s*\d+(?:\.\d+)?\s+(?:-?(?:\d+:)?\d+:\d+(?:\.\d+)?|-?(?:\d+:){1,2}|:)\s*"
8603
+ )
8604
+
8560
8605
 
8561
8606
  def to_interval(interval: str | Literal) -> Interval:
8562
8607
  """Builds an interval expression from a string like '1 day' or '5 months'."""
sqlglot/generator.py CHANGED
@@ -727,6 +727,7 @@ class Generator(metaclass=_Generator):
727
727
  "dialect",
728
728
  "unsupported_messages",
729
729
  "_escaped_quote_end",
730
+ "_escaped_byte_quote_end",
730
731
  "_escaped_identifier_end",
731
732
  "_next_name",
732
733
  "_identifier_start",
@@ -773,6 +774,11 @@ class Generator(metaclass=_Generator):
773
774
  self._escaped_quote_end: str = (
774
775
  self.dialect.tokenizer_class.STRING_ESCAPES[0] + self.dialect.QUOTE_END
775
776
  )
777
+ self._escaped_byte_quote_end: str = (
778
+ self.dialect.tokenizer_class.STRING_ESCAPES[0] + self.dialect.BYTE_END
779
+ if self.dialect.BYTE_END
780
+ else ""
781
+ )
776
782
  self._escaped_identifier_end = self.dialect.IDENTIFIER_END * 2
777
783
 
778
784
  self._next_name = name_sequence("_t")
@@ -1376,7 +1382,13 @@ class Generator(metaclass=_Generator):
1376
1382
  def bytestring_sql(self, expression: exp.ByteString) -> str:
1377
1383
  this = self.sql(expression, "this")
1378
1384
  if self.dialect.BYTE_START:
1379
- return f"{self.dialect.BYTE_START}{this}{self.dialect.BYTE_END}"
1385
+ escaped_byte_string = self.escape_str(
1386
+ this,
1387
+ escape_backslash=False,
1388
+ delimiter=self.dialect.BYTE_END,
1389
+ escaped_delimiter=self._escaped_byte_quote_end,
1390
+ )
1391
+ return f"{self.dialect.BYTE_START}{escaped_byte_string}{self.dialect.BYTE_END}"
1380
1392
  return this
1381
1393
 
1382
1394
  def unicodestring_sql(self, expression: exp.UnicodeString) -> str:
@@ -2475,16 +2487,23 @@ class Generator(metaclass=_Generator):
2475
2487
  text = f"{self.dialect.QUOTE_START}{self.escape_str(text)}{self.dialect.QUOTE_END}"
2476
2488
  return text
2477
2489
 
2478
- def escape_str(self, text: str, escape_backslash: bool = True) -> str:
2490
+ def escape_str(
2491
+ self,
2492
+ text: str,
2493
+ escape_backslash: bool = True,
2494
+ delimiter: t.Optional[str] = None,
2495
+ escaped_delimiter: t.Optional[str] = None,
2496
+ ) -> str:
2479
2497
  if self.dialect.ESCAPED_SEQUENCES:
2480
2498
  to_escaped = self.dialect.ESCAPED_SEQUENCES
2481
2499
  text = "".join(
2482
2500
  to_escaped.get(ch, ch) if escape_backslash or ch != "\\" else ch for ch in text
2483
2501
  )
2484
2502
 
2485
- return self._replace_line_breaks(text).replace(
2486
- self.dialect.QUOTE_END, self._escaped_quote_end
2487
- )
2503
+ delimiter = delimiter or self.dialect.QUOTE_END
2504
+ escaped_delimiter = escaped_delimiter or self._escaped_quote_end
2505
+
2506
+ return self._replace_line_breaks(text).replace(delimiter, escaped_delimiter)
2488
2507
 
2489
2508
  def loaddata_sql(self, expression: exp.LoadData) -> str:
2490
2509
  local = " LOCAL" if expression.args.get("local") else ""
@@ -3256,14 +3275,19 @@ class Generator(metaclass=_Generator):
3256
3275
  return f"(SELECT {self.sql(unnest)})"
3257
3276
 
3258
3277
  def interval_sql(self, expression: exp.Interval) -> str:
3259
- unit = self.sql(expression, "unit")
3278
+ unit_expression = expression.args.get("unit")
3279
+ unit = self.sql(unit_expression) if unit_expression else ""
3260
3280
  if not self.INTERVAL_ALLOWS_PLURAL_FORM:
3261
3281
  unit = self.TIME_PART_SINGULARS.get(unit, unit)
3262
3282
  unit = f" {unit}" if unit else ""
3263
3283
 
3264
3284
  if self.SINGLE_STRING_INTERVAL:
3265
3285
  this = expression.this.name if expression.this else ""
3266
- return f"INTERVAL '{this}{unit}'" if this else f"INTERVAL{unit}"
3286
+ if this:
3287
+ if unit_expression and isinstance(unit_expression, exp.IntervalSpan):
3288
+ return f"INTERVAL '{this}'{unit}"
3289
+ return f"INTERVAL '{this}{unit}'"
3290
+ return f"INTERVAL{unit}"
3267
3291
 
3268
3292
  this = self.sql(expression, "this")
3269
3293
  if this:
sqlglot/parser.py CHANGED
@@ -1561,6 +1561,10 @@ class Parser(metaclass=_Parser):
1561
1561
  # Adding an ON TRUE, makes transpilation semantically correct for other dialects
1562
1562
  ADD_JOIN_ON_TRUE = False
1563
1563
 
1564
+ # Whether INTERVAL spans with literal format '\d+ hh:[mm:[ss[.ff]]]'
1565
+ # can omit the span unit `DAY TO MINUTE` or `DAY TO SECOND`
1566
+ SUPPORTS_OMITTED_INTERVAL_SPAN_UNIT = False
1567
+
1564
1568
  __slots__ = (
1565
1569
  "error_level",
1566
1570
  "error_message_context",
@@ -4613,7 +4617,7 @@ class Parser(metaclass=_Parser):
4613
4617
 
4614
4618
  def _parse_grouping_set(self) -> t.Optional[exp.Expression]:
4615
4619
  if self._match(TokenType.L_PAREN):
4616
- grouping_set = self._parse_csv(self._parse_column)
4620
+ grouping_set = self._parse_csv(self._parse_bitwise)
4617
4621
  self._match_r_paren()
4618
4622
  return self.expression(exp.Tuple, expressions=grouping_set)
4619
4623
 
@@ -5105,9 +5109,37 @@ class Parser(metaclass=_Parser):
5105
5109
  self._retreat(index)
5106
5110
  return None
5107
5111
 
5108
- unit = self._parse_function() or (
5109
- not self._match(TokenType.ALIAS, advance=False)
5110
- and self._parse_var(any_token=True, upper=True)
5112
+ # handle day-time format interval span with omitted units:
5113
+ # INTERVAL '<number days> hh[:][mm[:ss[.ff]]]' <maybe `unit TO unit`>
5114
+ interval_span_units_omitted = None
5115
+ if (
5116
+ this
5117
+ and this.is_string
5118
+ and self.SUPPORTS_OMITTED_INTERVAL_SPAN_UNIT
5119
+ and exp.INTERVAL_DAY_TIME_RE.match(this.name)
5120
+ ):
5121
+ index = self._index
5122
+
5123
+ # Var "TO" Var
5124
+ first_unit = self._parse_var(any_token=True, upper=True)
5125
+ second_unit = None
5126
+ if first_unit and self._match_text_seq("TO"):
5127
+ second_unit = self._parse_var(any_token=True, upper=True)
5128
+
5129
+ interval_span_units_omitted = not (first_unit and second_unit)
5130
+
5131
+ self._retreat(index)
5132
+
5133
+ unit = (
5134
+ None
5135
+ if interval_span_units_omitted
5136
+ else (
5137
+ self._parse_function()
5138
+ or (
5139
+ not self._match(TokenType.ALIAS, advance=False)
5140
+ and self._parse_var(any_token=True, upper=True)
5141
+ )
5142
+ )
5111
5143
  )
5112
5144
 
5113
5145
  # Most dialects support, e.g., the form INTERVAL '5' day, thus we try to parse
@@ -5124,6 +5156,7 @@ class Parser(metaclass=_Parser):
5124
5156
  if len(parts) == 1:
5125
5157
  this = exp.Literal.string(parts[0][0])
5126
5158
  unit = self.expression(exp.Var, this=parts[0][1].upper())
5159
+
5127
5160
  if self.INTERVAL_SPANS and self._match_text_seq("TO"):
5128
5161
  unit = self.expression(
5129
5162
  exp.IntervalSpan, this=unit, expression=self._parse_var(any_token=True, upper=True)
@@ -5490,6 +5523,11 @@ class Parser(metaclass=_Parser):
5490
5523
 
5491
5524
  type_token = unsigned_type_token or type_token
5492
5525
 
5526
+ # NULLABLE without parentheses can be a column (Presto/Trino)
5527
+ if type_token == TokenType.NULLABLE and not expressions:
5528
+ self._retreat(index)
5529
+ return None
5530
+
5493
5531
  this = exp.DataType(
5494
5532
  this=exp.DataType.Type[type_token.value],
5495
5533
  expressions=expressions,
@@ -5760,6 +5798,10 @@ class Parser(metaclass=_Parser):
5760
5798
  this.add_comments(comments)
5761
5799
 
5762
5800
  self._match_r_paren(expression=this)
5801
+
5802
+ if isinstance(this, exp.Paren) and isinstance(this.this, exp.AggFunc):
5803
+ return self._parse_window(this)
5804
+
5763
5805
  return this
5764
5806
 
5765
5807
  def _parse_primary(self) -> t.Optional[exp.Expression]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.16.3
3
+ Version: 27.17.0
4
4
  Summary: An easily customizable SQL parser and transpiler
5
5
  Author-email: Toby Mao <toby.mao@gmail.com>
6
6
  License-Expression: MIT
@@ -1,15 +1,15 @@
1
1
  sqlglot/__init__.py,sha256=za08rtdPh2v7dOpGdNomttlIVGgTrKja7rPd6sQwaTg,5391
2
2
  sqlglot/__main__.py,sha256=022c173KqxsiABWTEpUIq_tJUxuNiW7a7ABsxBXqvu8,2069
3
3
  sqlglot/_typing.py,sha256=-1HPyr3w5COlSJWqlgt8jhFk2dyMvBuvVBqIX1wyVCM,642
4
- sqlglot/_version.py,sha256=BtxvTN4ZIXvi5Rf3fZO9Rg6s_6zmGod22E1mXw7N_x8,708
4
+ sqlglot/_version.py,sha256=RQW_jRqTjxNrqe9v5PCSBGQGoLKZnnPnQlpUKXMTiY8,708
5
5
  sqlglot/diff.py,sha256=PtOllQMQa1Sw1-V2Y8eypmDqGujXYPaTOp_WLsWkAWk,17314
6
6
  sqlglot/errors.py,sha256=QNKMr-pzLUDR-tuMmn_GK6iMHUIVdb_YSJ_BhGEvuso,2126
7
- sqlglot/expressions.py,sha256=Qp0u8vmU9M7AV-iAqjd_0EQJQsO3VjyyHvZ4sQfQZdo,256153
8
- sqlglot/generator.py,sha256=Twp2rdS57BxztRQx9z6d_e-GOAd4hW0UeSnywiIrbws,225487
7
+ sqlglot/expressions.py,sha256=CXkTw8G84YP32iuWBAaRsGEg7MUTlvsDUgE7IF_pKgY,257541
8
+ sqlglot/generator.py,sha256=ZHFzi6_EOJl5V-dnz71QJOIwtxj66oJdF6tUQoxBpck,226436
9
9
  sqlglot/helper.py,sha256=9nZjFVRBtMKFC3EdzpDQ6jkazFO19po6BF8xHiNGZIo,15111
10
10
  sqlglot/jsonpath.py,sha256=SQgaxzaEYBN7At9dkTK4N1Spk6xHxvHL6QtCIP6iM30,7905
11
11
  sqlglot/lineage.py,sha256=Qj5ykuDNcATppb9vOjoIKBqRVLbu3OMPiZk9f3iyv40,15312
12
- sqlglot/parser.py,sha256=Zzu2OOp5z9mvUrD7niyK6iIPZODLsL41pJnAjAgNtLQ,335392
12
+ sqlglot/parser.py,sha256=-zOjkGkInw1Bu-OnrVPlhLP0VDJPCTKlgqxuEpS9IXk,336855
13
13
  sqlglot/planner.py,sha256=ql7Li-bWJRcyXzNaZy_n6bQ6B2ZfunEIB8Ztv2xaxq4,14634
14
14
  sqlglot/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  sqlglot/schema.py,sha256=13H2qKQs27EKdTpDLOvcNnSTDAUbYNKjWtJs4aQCSOA,20509
@@ -21,14 +21,14 @@ sqlglot/trie.py,sha256=v27uXMrHfqrXlJ6GmeTSMovsB_3o0ctnlKhdNt7W6fI,2245
21
21
  sqlglot/dialects/__init__.py,sha256=e3K2NHrZO7oXfBzEpRsvgWAgJ_UCEyg7SlUCRqvnPj4,3799
22
22
  sqlglot/dialects/athena.py,sha256=ofArmayYLev4qZQ15GM8mevG04qqR5WGFb2ZcuYm6x4,10966
23
23
  sqlglot/dialects/bigquery.py,sha256=9Q-oCXcpa2vrT2eMgVGHWwEvECMm4RQeV1XkjJj0nPA,72483
24
- sqlglot/dialects/clickhouse.py,sha256=OzcDAS7pWs889gu0aLYn_HIjTLiPRjGFG61p6-84stE,58574
24
+ sqlglot/dialects/clickhouse.py,sha256=6kx1cm0YhtHbg5kvcY64Hau2KdeC7Y26SVlVHGLyPEA,58579
25
25
  sqlglot/dialects/databricks.py,sha256=H4QTq7gg6tJylKc_YWsGp6049KydoI_wlQUHM7iCJtI,4753
26
26
  sqlglot/dialects/dialect.py,sha256=BU4-x1d8tRCSAfdpeP5b86me0wXfgpcEPdyk27wLgg4,73293
27
27
  sqlglot/dialects/doris.py,sha256=CFnF955Oav3IjZWA80ickOI8tPpCjxk7BN5R4Z6pA1U,25263
28
28
  sqlglot/dialects/dremio.py,sha256=nOMxu_4xVKSOmMGNSwdxXSPc243cNbbpb-xXzYdgdeg,8460
29
29
  sqlglot/dialects/drill.py,sha256=FOh7_KjPx_77pv0DiHKZog0CcmzqeF9_PEmGnJ1ESSM,5825
30
30
  sqlglot/dialects/druid.py,sha256=kh3snZtneehNOWqs3XcPjsrhNaRbkCQ8E4hHbWJ1fHM,690
31
- sqlglot/dialects/duckdb.py,sha256=GylLuN7ANQmC-1o-8k51T4nIP4r5LbLOpZ-JBr13j0E,54328
31
+ sqlglot/dialects/duckdb.py,sha256=hLbLqkh5X5Nx3y5yfbBc5h9ye6UWTiZr_VsS4BMY5Rw,54612
32
32
  sqlglot/dialects/dune.py,sha256=gALut-fFfN2qMsr8LvZ1NQK3F3W9z2f4PwMvTMXVVVg,375
33
33
  sqlglot/dialects/exasol.py,sha256=ay3g_VyT5WvHTgNyJuCQu0nBt4bpllLZ9IdMBizEgYM,15761
34
34
  sqlglot/dialects/fabric.py,sha256=BdkvzM8s-m5DIdBwdjEYskp32ub7aHCAex_xlhQn92I,10222
@@ -36,13 +36,13 @@ sqlglot/dialects/hive.py,sha256=UGIkXjMCk5a9ndUXQtvfG560oi3emdpqOYLQCmGabBk,3204
36
36
  sqlglot/dialects/materialize.py,sha256=LD2q1kTRrCwkIu1BfoBvnjTGbupDtoQ8JQMDCIYAXHg,3533
37
37
  sqlglot/dialects/mysql.py,sha256=0s7RIpWPCaBYvxgR8Z6JWPub1BHBB_0Th7KHCIXVfms,49702
38
38
  sqlglot/dialects/oracle.py,sha256=zWPCpzGiTlgCJ5E6FjfX3Rszjcw4SnHg6xeVboMYIyo,15972
39
- sqlglot/dialects/postgres.py,sha256=sjqHOabifDKaG-OZB_ZxhShPcWrGOI4yRWZliVAfUaE,34802
39
+ sqlglot/dialects/postgres.py,sha256=_pXSu29684utgeuzPziSJ0Sw54WEIIunwLugJw7KFD8,34853
40
40
  sqlglot/dialects/presto.py,sha256=XVeYr2NP86x5enlRqI7MYR6le85_ucYg_BBRocGN3jM,33413
41
41
  sqlglot/dialects/prql.py,sha256=fwN-SPEGx-drwf1K0U2MByN-PkW3C_rOgQ3xeJeychg,7908
42
42
  sqlglot/dialects/redshift.py,sha256=FIwtP3yEg-way9pa32kxCJc6IaFkHVIvgYKZA-Ilmi0,15919
43
43
  sqlglot/dialects/risingwave.py,sha256=BqWwW1iT_OIVMwfRamaww79snnBwIgCfr22Go-ggO68,3289
44
44
  sqlglot/dialects/singlestore.py,sha256=0QqNYOucNklPQuyeGcsisLI97qPGx_RfWKOFarJz2qw,61711
45
- sqlglot/dialects/snowflake.py,sha256=VcQxRiy7KV7EtOp4IXe9Vx7qEjqf4ltpRKV2xAYNZbs,76311
45
+ sqlglot/dialects/snowflake.py,sha256=JK7FursV_ZdHU0UolaZFOy4TtEFqHTySZa1zxocCUww,77433
46
46
  sqlglot/dialects/spark.py,sha256=PzyhkelDzbCMgJ3RVHD6yyzLIFp9NdZfwVas5IymowM,10147
47
47
  sqlglot/dialects/spark2.py,sha256=qz36FT9k4iuiqboRpyG4VpKGkPR0P2fifmqgZ9gNUEU,14851
48
48
  sqlglot/dialects/sqlite.py,sha256=zzXEbnaLjJeg6hPLHricjpfSkuf8tpXECnjcHtoqIbw,13263
@@ -76,8 +76,8 @@ sqlglot/optimizer/qualify_tables.py,sha256=dA4ZazL7ShQh2JgBwpHuG-4c5lBw1TNzCnuN7
76
76
  sqlglot/optimizer/scope.py,sha256=UOTrbwqcTc5iRQf0WStgYWXpE24w6riZy-tJYA18yTw,31229
77
77
  sqlglot/optimizer/simplify.py,sha256=-_yus42OYwqjQ9a2TSGhtG2G0pSkInUry1z7hEMz2pY,51062
78
78
  sqlglot/optimizer/unnest_subqueries.py,sha256=kzWUVDlxs8z9nmRx-8U-pHXPtVZhEIwkKqmKhr2QLvc,10908
79
- sqlglot-27.16.3.dist-info/licenses/LICENSE,sha256=p1Yk0B4oa0l8Rh-_dYyy75d8spjPd_vTloXfz4FWxys,1065
80
- sqlglot-27.16.3.dist-info/METADATA,sha256=6KC1cCyCXpopLrMeA2rn-Z595AJ3fV_OaMH-i0Mg_G0,20682
81
- sqlglot-27.16.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
82
- sqlglot-27.16.3.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
83
- sqlglot-27.16.3.dist-info/RECORD,,
79
+ sqlglot-27.17.0.dist-info/licenses/LICENSE,sha256=p1Yk0B4oa0l8Rh-_dYyy75d8spjPd_vTloXfz4FWxys,1065
80
+ sqlglot-27.17.0.dist-info/METADATA,sha256=XAZqZw1-AFuV3rTul6kbEoI8BzcX6_QnF1rChBhRyzQ,20682
81
+ sqlglot-27.17.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
82
+ sqlglot-27.17.0.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
83
+ sqlglot-27.17.0.dist-info/RECORD,,