sqlglot 27.4.1__py3-none-any.whl → 27.5.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.
@@ -655,12 +655,6 @@ class Snowflake(Dialect):
655
655
 
656
656
  TIMESTAMPS = parser.Parser.TIMESTAMPS - {TokenType.TIME}
657
657
 
658
- RANGE_PARSERS = {
659
- **parser.Parser.RANGE_PARSERS,
660
- TokenType.LIKE_ANY: parser.binary_range_parser(exp.LikeAny),
661
- TokenType.ILIKE_ANY: parser.binary_range_parser(exp.ILikeAny),
662
- }
663
-
664
658
  ALTER_PARSERS = {
665
659
  **parser.Parser.ALTER_PARSERS,
666
660
  "UNSET": lambda self: self.expression(
@@ -1133,8 +1127,6 @@ class Snowflake(Dialect):
1133
1127
  "EXCLUDE": TokenType.EXCEPT,
1134
1128
  "FILE FORMAT": TokenType.FILE_FORMAT,
1135
1129
  "GET": TokenType.GET,
1136
- "ILIKE ANY": TokenType.ILIKE_ANY,
1137
- "LIKE ANY": TokenType.LIKE_ANY,
1138
1130
  "MATCH_CONDITION": TokenType.MATCH_CONDITION,
1139
1131
  "MATCH_RECOGNIZE": TokenType.MATCH_RECOGNIZE,
1140
1132
  "MINUS": TokenType.EXCEPT,
sqlglot/expressions.py CHANGED
@@ -4546,6 +4546,7 @@ class DataType(Expression):
4546
4546
  FIXEDSTRING = auto()
4547
4547
  FLOAT = auto()
4548
4548
  GEOGRAPHY = auto()
4549
+ GEOGRAPHYPOINT = auto()
4549
4550
  GEOMETRY = auto()
4550
4551
  POINT = auto()
4551
4552
  RING = auto()
@@ -5093,10 +5094,6 @@ class ILike(Binary, Predicate):
5093
5094
  pass
5094
5095
 
5095
5096
 
5096
- class ILikeAny(Binary, Predicate):
5097
- pass
5098
-
5099
-
5100
5097
  class IntDiv(Binary):
5101
5098
  pass
5102
5099
 
@@ -5113,10 +5110,6 @@ class Like(Binary, Predicate):
5113
5110
  pass
5114
5111
 
5115
5112
 
5116
- class LikeAny(Binary, Predicate):
5117
- pass
5118
-
5119
-
5120
5113
  class LT(Binary, Predicate):
5121
5114
  pass
5122
5115
 
sqlglot/generator.py CHANGED
@@ -491,6 +491,9 @@ class Generator(metaclass=_Generator):
491
491
  # Whether SYMMETRIC and ASYMMETRIC flags are supported with BETWEEN expression
492
492
  SUPPORTS_BETWEEN_FLAGS = False
493
493
 
494
+ # Whether LIKE and ILIKE support quantifiers such as LIKE ANY/ALL/SOME
495
+ SUPPORTS_LIKE_QUANTIFIERS = True
496
+
494
497
  TYPE_MAPPING = {
495
498
  exp.DataType.Type.DATETIME2: "TIMESTAMP",
496
499
  exp.DataType.Type.NCHAR: "CHAR",
@@ -2898,7 +2901,10 @@ class Generator(metaclass=_Generator):
2898
2901
  return f"{self.sql(expression, 'this')}[{expressions_sql}]"
2899
2902
 
2900
2903
  def all_sql(self, expression: exp.All) -> str:
2901
- return f"ALL {self.wrap(expression)}"
2904
+ this = self.sql(expression, "this")
2905
+ if not isinstance(expression.this, (exp.Tuple, exp.Paren)):
2906
+ this = self.wrap(this)
2907
+ return f"ALL {this}"
2902
2908
 
2903
2909
  def any_sql(self, expression: exp.Any) -> str:
2904
2910
  this = self.sql(expression, "this")
@@ -3648,12 +3654,6 @@ class Generator(metaclass=_Generator):
3648
3654
  def gte_sql(self, expression: exp.GTE) -> str:
3649
3655
  return self.binary(expression, ">=")
3650
3656
 
3651
- def ilike_sql(self, expression: exp.ILike) -> str:
3652
- return self.binary(expression, "ILIKE")
3653
-
3654
- def ilikeany_sql(self, expression: exp.ILikeAny) -> str:
3655
- return self.binary(expression, "ILIKE ANY")
3656
-
3657
3657
  def is_sql(self, expression: exp.Is) -> str:
3658
3658
  if not self.IS_BOOL_ALLOWED and isinstance(expression.expression, exp.Boolean):
3659
3659
  return self.sql(
@@ -3661,11 +3661,38 @@ class Generator(metaclass=_Generator):
3661
3661
  )
3662
3662
  return self.binary(expression, "IS")
3663
3663
 
3664
+ def _like_sql(self, expression: exp.Like | exp.ILike) -> str:
3665
+ this = expression.this
3666
+ rhs = expression.expression
3667
+
3668
+ if isinstance(expression, exp.Like):
3669
+ exp_class: t.Type[exp.Like | exp.ILike] = exp.Like
3670
+ op = "LIKE"
3671
+ else:
3672
+ exp_class = exp.ILike
3673
+ op = "ILIKE"
3674
+
3675
+ if isinstance(rhs, (exp.All, exp.Any)) and not self.SUPPORTS_LIKE_QUANTIFIERS:
3676
+ exprs = rhs.this.unnest()
3677
+
3678
+ if isinstance(exprs, exp.Tuple):
3679
+ exprs = exprs.expressions
3680
+
3681
+ connective = exp.or_ if isinstance(rhs, exp.Any) else exp.and_
3682
+
3683
+ like_expr: exp.Expression = exp_class(this=this, expression=exprs[0])
3684
+ for expr in exprs[1:]:
3685
+ like_expr = connective(like_expr, exp_class(this=this, expression=expr))
3686
+
3687
+ return self.sql(like_expr)
3688
+
3689
+ return self.binary(expression, op)
3690
+
3664
3691
  def like_sql(self, expression: exp.Like) -> str:
3665
- return self.binary(expression, "LIKE")
3692
+ return self._like_sql(expression)
3666
3693
 
3667
- def likeany_sql(self, expression: exp.LikeAny) -> str:
3668
- return self.binary(expression, "LIKE ANY")
3694
+ def ilike_sql(self, expression: exp.ILike) -> str:
3695
+ return self._like_sql(expression)
3669
3696
 
3670
3697
  def similarto_sql(self, expression: exp.SimilarTo) -> str:
3671
3698
  return self.binary(expression, "SIMILAR TO")
@@ -32,6 +32,9 @@ def eliminate_joins(expression):
32
32
 
33
33
  # Reverse the joins so we can remove chains of unused joins
34
34
  for join in reversed(joins):
35
+ if join.is_semi_or_anti_join:
36
+ continue
37
+
35
38
  alias = join.alias_or_name
36
39
  if _should_eliminate_join(scope, join, alias):
37
40
  join.pop()
@@ -523,6 +523,12 @@ class Scope:
523
523
  for _, source in scope.selected_sources.values():
524
524
  scope_ref_count[id(source)] += 1
525
525
 
526
+ for name in scope._semi_anti_join_tables:
527
+ # semi/anti join sources are not actually selected but we still need to
528
+ # increment their ref count to avoid them being optimized away
529
+ if name in scope.sources:
530
+ scope_ref_count[id(scope.sources[name])] += 1
531
+
526
532
  return scope_ref_count
527
533
 
528
534
 
sqlglot/parser.py CHANGED
@@ -380,6 +380,7 @@ class Parser(metaclass=_Parser):
380
380
  TokenType.BIGDECIMAL,
381
381
  TokenType.UUID,
382
382
  TokenType.GEOGRAPHY,
383
+ TokenType.GEOGRAPHYPOINT,
383
384
  TokenType.GEOMETRY,
384
385
  TokenType.POINT,
385
386
  TokenType.RING,
@@ -1136,7 +1137,14 @@ class Parser(metaclass=_Parser):
1136
1137
  "TRUNCATE": lambda self: self._parse_partitioned_by_bucket_or_truncate(),
1137
1138
  }
1138
1139
 
1139
- def _parse_partitioned_by_bucket_or_truncate(self) -> exp.Expression:
1140
+ def _parse_partitioned_by_bucket_or_truncate(self) -> t.Optional[exp.Expression]:
1141
+ if not self._match(TokenType.L_PAREN, advance=False):
1142
+ # Partitioning by bucket or truncate follows the syntax:
1143
+ # PARTITION BY (BUCKET(..) | TRUNCATE(..))
1144
+ # If we don't have parenthesis after each keyword, we should instead parse this as an identifier
1145
+ self._retreat(self._index - 1)
1146
+ return None
1147
+
1140
1148
  klass = (
1141
1149
  exp.PartitionedByBucket
1142
1150
  if self._prev.text.upper() == "BUCKET"
@@ -5767,6 +5775,7 @@ class Parser(metaclass=_Parser):
5767
5775
  return None
5768
5776
 
5769
5777
  comments = self._curr.comments
5778
+ prev = self._prev
5770
5779
  token = self._curr
5771
5780
  token_type = self._curr.token_type
5772
5781
  this = self._curr.text
@@ -5798,12 +5807,19 @@ class Parser(metaclass=_Parser):
5798
5807
  else:
5799
5808
  subquery_predicate = self.SUBQUERY_PREDICATES.get(token_type)
5800
5809
 
5801
- if subquery_predicate and self._curr.token_type in (TokenType.SELECT, TokenType.WITH):
5802
- this = self.expression(
5803
- subquery_predicate, comments=comments, this=self._parse_select()
5804
- )
5805
- self._match_r_paren()
5806
- return this
5810
+ if subquery_predicate:
5811
+ expr = None
5812
+ if self._curr.token_type in (TokenType.SELECT, TokenType.WITH):
5813
+ expr = self._parse_select()
5814
+ self._match_r_paren()
5815
+ elif prev and prev.token_type in (TokenType.LIKE, TokenType.ILIKE):
5816
+ # Backtrack one token since we've consumed the L_PAREN here. Instead, we'd like
5817
+ # to parse "LIKE [ANY | ALL] (...)" as a whole into an exp.Tuple or exp.Paren
5818
+ self._advance(-1)
5819
+ expr = self._parse_bitwise()
5820
+
5821
+ if expr:
5822
+ return self.expression(subquery_predicate, comments=comments, this=expr)
5807
5823
 
5808
5824
  if functions is None:
5809
5825
  functions = self.FUNCTIONS
@@ -6194,7 +6210,7 @@ class Parser(metaclass=_Parser):
6194
6210
  return self._parse_id_var(any_token=False)
6195
6211
 
6196
6212
  def _parse_unique(self) -> exp.UniqueColumnConstraint:
6197
- self._match_text_seq("KEY")
6213
+ self._match_texts(("KEY", "INDEX"))
6198
6214
  return self.expression(
6199
6215
  exp.UniqueColumnConstraint,
6200
6216
  nulls=self._match_text_seq("NULLS", "NOT", "DISTINCT"),
sqlglot/tokens.py CHANGED
@@ -39,6 +39,8 @@ class TokenType(AutoName):
39
39
  COLON = auto()
40
40
  DOTCOLON = auto()
41
41
  DCOLON = auto()
42
+ DCOLONDOLLAR = auto()
43
+ DCOLONPERCENT = auto()
42
44
  DQMARK = auto()
43
45
  SEMICOLON = auto()
44
46
  STAR = auto()
@@ -53,6 +55,8 @@ class TokenType(AutoName):
53
55
  NEQ = auto()
54
56
  NULLSAFE_EQ = auto()
55
57
  COLON_EQ = auto()
58
+ COLON_GT = auto()
59
+ NCOLON_GT = auto()
56
60
  AND = auto()
57
61
  OR = auto()
58
62
  AMP = auto()
@@ -183,6 +187,7 @@ class TokenType(AutoName):
183
187
  DATEMULTIRANGE = auto()
184
188
  UUID = auto()
185
189
  GEOGRAPHY = auto()
190
+ GEOGRAPHYPOINT = auto()
186
191
  NULLABLE = auto()
187
192
  GEOMETRY = auto()
188
193
  POINT = auto()
@@ -301,7 +306,6 @@ class TokenType(AutoName):
301
306
  HINT = auto()
302
307
  IGNORE = auto()
303
308
  ILIKE = auto()
304
- ILIKE_ANY = auto()
305
309
  IN = auto()
306
310
  INDEX = auto()
307
311
  INNER = auto()
@@ -322,7 +326,6 @@ class TokenType(AutoName):
322
326
  LATERAL = auto()
323
327
  LEFT = auto()
324
328
  LIKE = auto()
325
- LIKE_ANY = auto()
326
329
  LIMIT = auto()
327
330
  LIST = auto()
328
331
  LOAD = auto()
sqlglot/transforms.py CHANGED
@@ -990,7 +990,7 @@ def any_to_exists(expression: exp.Expression) -> exp.Expression:
990
990
  if isinstance(expression, exp.Select):
991
991
  for any_expr in expression.find_all(exp.Any):
992
992
  this = any_expr.this
993
- if isinstance(this, exp.Query):
993
+ if isinstance(this, exp.Query) or isinstance(any_expr.parent, (exp.Like, exp.ILike)):
994
994
  continue
995
995
 
996
996
  binop = any_expr.parent
@@ -1,30 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.4.1
3
+ Version: 27.5.0
4
4
  Summary: An easily customizable SQL parser and transpiler
5
5
  Author-email: Toby Mao <toby.mao@gmail.com>
6
- License: MIT License
7
-
8
- Copyright (c) 2023 Toby Mao
9
-
10
- Permission is hereby granted, free of charge, to any person obtaining a copy
11
- of this software and associated documentation files (the "Software"), to deal
12
- in the Software without restriction, including without limitation the rights
13
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
- copies of the Software, and to permit persons to whom the Software is
15
- furnished to do so, subject to the following conditions:
16
-
17
- The above copyright notice and this permission notice shall be included in all
18
- copies or substantial portions of the Software.
19
-
20
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
- SOFTWARE.
27
-
28
6
  Project-URL: Homepage, https://sqlglot.com/
29
7
  Project-URL: Documentation, https://sqlglot.com/sqlglot.html
30
8
  Project-URL: Repository, https://github.com/tobymao/sqlglot
@@ -32,7 +10,6 @@ Project-URL: Issues, https://github.com/tobymao/sqlglot/issues
32
10
  Classifier: Development Status :: 5 - Production/Stable
33
11
  Classifier: Intended Audience :: Developers
34
12
  Classifier: Intended Audience :: Science/Research
35
- Classifier: License :: OSI Approved :: MIT License
36
13
  Classifier: Operating System :: OS Independent
37
14
  Classifier: Programming Language :: SQL
38
15
  Classifier: Programming Language :: Python :: 3 :: Only
@@ -1,22 +1,22 @@
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=jOZXO_b65dIa3g-RaYPPvo31yJxPamFz_P4zbdxLZ2o,513
4
+ sqlglot/_version.py,sha256=zqDjFH3faLguEvf_f792g1gYdgebwWpzAVmR4ZkPuxs,513
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=Q52dXK5i-R4jtqHd2-Tj533GiOHxATrPxot68oV7Vfc,246122
8
- sqlglot/generator.py,sha256=6SXy3-2Lnn1UGPTe6aMKzeNJxU7mZwJaQcrBLHCVL_c,216858
7
+ sqlglot/expressions.py,sha256=yGIiFDjD0fqm39iVIZHw6APLCws8LDsPkQNGPxBFvhM,246063
8
+ sqlglot/generator.py,sha256=HgUGW8vGaSTRIbGz9aCpK7uOcGlt7UdPWhcYqHZSB0w,217786
9
9
  sqlglot/helper.py,sha256=9nZjFVRBtMKFC3EdzpDQ6jkazFO19po6BF8xHiNGZIo,15111
10
10
  sqlglot/jsonpath.py,sha256=jneO-A57n4ojVT2drCn2HBlx_Ka8wLcGpemW1JgvbjA,7666
11
11
  sqlglot/lineage.py,sha256=Qj5ykuDNcATppb9vOjoIKBqRVLbu3OMPiZk9f3iyv40,15312
12
- sqlglot/parser.py,sha256=LpUn9mCDkYfJPjzNRx9vHKl0tfYzhWSbCn_76yybbvY,326921
12
+ sqlglot/parser.py,sha256=IGRj3zKCRpKolV8srQvBOsQCF_iH27N2Lb3qpefJPg0,327777
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
16
16
  sqlglot/serde.py,sha256=DQVJ95WrIvhYfe02Ytb4NQug2aMwDCEwpMBW1LKDqzE,2031
17
17
  sqlglot/time.py,sha256=Q62gv6kL40OiRBF6BMESxKJcMVn7ZLNw7sv8H34z5FI,18400
18
- sqlglot/tokens.py,sha256=q9L6YtVIMLUDcl652eWFXMsa5lsrGECcHQpDy_9BDF0,48856
19
- sqlglot/transforms.py,sha256=s96QMtR7rJbcLAU1I_IF1xLNxno6yvEbhERgbS5xmJ4,41164
18
+ sqlglot/tokens.py,sha256=ibw_XDjfMgX80ScCwXXrxKLyKCSmHWwZhxPkmKF7q3I,48937
19
+ sqlglot/transforms.py,sha256=utNDsCBsA7hPUK3-aby3DDgiY_XVMAKQqeoLm1EyihI,41218
20
20
  sqlglot/trie.py,sha256=v27uXMrHfqrXlJ6GmeTSMovsB_3o0ctnlKhdNt7W6fI,2245
21
21
  sqlglot/dialects/__init__.py,sha256=BQUv9EuMmvhP_wVitGLo0PlCi15atvfXgvREpsTsxeQ,3799
22
22
  sqlglot/dialects/athena.py,sha256=ofArmayYLev4qZQ15GM8mevG04qqR5WGFb2ZcuYm6x4,10966
@@ -28,21 +28,21 @@ sqlglot/dialects/doris.py,sha256=g6KGYu01nUsvz_wjZkZbI0tiPg-ZUKyr7a-yGaw5Kec,198
28
28
  sqlglot/dialects/dremio.py,sha256=FbBTri3KPD4oJMKV9Qdnh7_EgLJUZZB8iDzUlDE26h4,4077
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=MUGm1cqpWHBrQBefwPXq2F96G-Tthshcp97hGhVt4Bs,51376
31
+ sqlglot/dialects/duckdb.py,sha256=X4nY2ZjUSGZZ3pCqUraGxIYXVA-gzB134qV0TeyMmqQ,51418
32
32
  sqlglot/dialects/dune.py,sha256=gALut-fFfN2qMsr8LvZ1NQK3F3W9z2f4PwMvTMXVVVg,375
33
- sqlglot/dialects/exasol.py,sha256=imRzqWpgcQK0E5WrBTSy3JvTYs9zgkD3TC5Qbe4Hb7Y,10127
33
+ sqlglot/dialects/exasol.py,sha256=EMA9hBttHHnt0lIj0BN5_se8x-ve7TrKrhIfmbVkaaQ,11968
34
34
  sqlglot/dialects/fabric.py,sha256=4Sng2ZhQSaf6eK3ituR9DqDZERaVwYS_UfdpusjsISg,10220
35
35
  sqlglot/dialects/hive.py,sha256=bAZz0qnaOH9f5FyIMkqBu3XB2Cj7y-xnCPbxPsk8U9I,31959
36
- sqlglot/dialects/materialize.py,sha256=_DPLPt8YrdQIIXNrGJw1IMcGOoAEJ9NO9X9pDfy4hxs,3494
36
+ sqlglot/dialects/materialize.py,sha256=LD2q1kTRrCwkIu1BfoBvnjTGbupDtoQ8JQMDCIYAXHg,3533
37
37
  sqlglot/dialects/mysql.py,sha256=J_88qeXxC_oD09yMiNgw_so3x2QlaqL5l7CRku1R6wo,49280
38
- sqlglot/dialects/oracle.py,sha256=lzjL13ALnAEAQYSvqhLJINnDCaTLllYP3CUqVPtdZ2o,16003
39
- sqlglot/dialects/postgres.py,sha256=Kkebjjhiw3HsyJJSQ63-S4uo3QmOR53nVuLpNBGNJi8,33982
38
+ sqlglot/dialects/oracle.py,sha256=DpckKjR3FauVmXDIDaNTFqJE0KzXnW4sUlnZjQC8z0Y,15735
39
+ sqlglot/dialects/postgres.py,sha256=8QF9uEXXFAGCXQah1n8mv4fonF58o0n59Il66hOZYqI,33942
40
40
  sqlglot/dialects/presto.py,sha256=Tm3Bx9AJilT1xlgunTpF0wUhIZBOPS-rB5Iwitnygxc,33462
41
41
  sqlglot/dialects/prql.py,sha256=fwN-SPEGx-drwf1K0U2MByN-PkW3C_rOgQ3xeJeychg,7908
42
- sqlglot/dialects/redshift.py,sha256=PAet4ka9JWyZImRl_b4qucgDGMrMlUt_pqry3XxZc1w,15783
43
- sqlglot/dialects/risingwave.py,sha256=fEB3ySAcF2N1UjwD_JjcOkRu3F6DQ852XBrwava-CjY,3250
44
- sqlglot/dialects/singlestore.py,sha256=S_NRGnHrzyDh5J8_NUs5fKACB7BL7t5SnkZ_0l0Cf0E,102
45
- sqlglot/dialects/snowflake.py,sha256=PuAvhs6dhDg3Dwnygi6OBy9cxp7My2ZUH0j27eWnM8E,70805
42
+ sqlglot/dialects/redshift.py,sha256=MXI9W7CgKCtMNjNRPcZPxO8NBA9_PxZx14HB52o-aUc,15822
43
+ sqlglot/dialects/risingwave.py,sha256=BqWwW1iT_OIVMwfRamaww79snnBwIgCfr22Go-ggO68,3289
44
+ sqlglot/dialects/singlestore.py,sha256=TyvnHVCfVRSFU5cXmNGUIQiOj7ma1dIT8_EeGZmEP3E,29237
45
+ sqlglot/dialects/snowflake.py,sha256=iIBtw6FFgkyksGXiNagirQ8rl1SFf_Vu5mtpEVh7sx0,70487
46
46
  sqlglot/dialects/spark.py,sha256=hTumyd46Cc3HEl9KvlTla2eq_NKBI3w5Jis3FeMt_R8,8886
47
47
  sqlglot/dialects/spark2.py,sha256=aCwPqLduLRSUSPtbI1VtBjydK6haKgEy3iahmueGRo4,14742
48
48
  sqlglot/dialects/sqlite.py,sha256=XIDmiNTswWcrDwlFm8gOODCrJ_rPmXQKkm9U_-YAlVs,13183
@@ -60,7 +60,7 @@ sqlglot/optimizer/__init__.py,sha256=FdAvVz6rQLLkiiH21-SD4RxB5zS3WDeU-s03PZkJ-F4
60
60
  sqlglot/optimizer/annotate_types.py,sha256=mEhUmD6CBZ1HIgYJMvfMTIivoB-6nKHiDAvoktobocM,25025
61
61
  sqlglot/optimizer/canonicalize.py,sha256=RJpUbWDudjknRMtO_Kf8MGZ5Hv1twpPWac2u5kpV4Vw,7719
62
62
  sqlglot/optimizer/eliminate_ctes.py,sha256=fUBM0RUnPrm2sYptEWBux98B7fcx7W-BM1zVqfgDz9c,1448
63
- sqlglot/optimizer/eliminate_joins.py,sha256=5Whliegc7U8BnS6tlrl9wkeAgyP1NpgCCAPxChHzFfw,5874
63
+ sqlglot/optimizer/eliminate_joins.py,sha256=2iYtG93aJGxvURqm1BVPosrnnnQ_IXI14RcD4pM8eHc,5942
64
64
  sqlglot/optimizer/eliminate_subqueries.py,sha256=sAB_Pk94_n2n1PIaZ2Mc3M-n2TV-JmjjaomaY14u0Og,6292
65
65
  sqlglot/optimizer/isolate_table_selects.py,sha256=_8rIKVMoL7eY3rrJsmgIdTRvfmBSLUxeHg42q1JW990,1464
66
66
  sqlglot/optimizer/merge_subqueries.py,sha256=lg6Is78nUM2MbqbRjE6xapgErIO-5pteBE74Qh3z4Zk,15211
@@ -73,11 +73,11 @@ sqlglot/optimizer/pushdown_projections.py,sha256=7NoK5NAUVYVhs0YnYyo6WuXfaO-BShS
73
73
  sqlglot/optimizer/qualify.py,sha256=oAPfwub7dEkrlCrsptcJWpLya4BgKhN6M5SwIs_86LY,4002
74
74
  sqlglot/optimizer/qualify_columns.py,sha256=epPE7HjnJ1yQCmy_QTzsjze7uM79BNsvzBem3gx4L3Q,43275
75
75
  sqlglot/optimizer/qualify_tables.py,sha256=rRo0rXMMDAloG_ut7nGPtIO3e__ooM2PqShxWECKQbo,6965
76
- sqlglot/optimizer/scope.py,sha256=HI3TZ4VWTgM6_x8k5ClA0lA0xidaKv4xgn8iGERJRjk,30824
76
+ sqlglot/optimizer/scope.py,sha256=T6iVYnYwubt-WB1BOFsFYdJ-D7WtWZGL37SuCRQK23s,31154
77
77
  sqlglot/optimizer/simplify.py,sha256=-_yus42OYwqjQ9a2TSGhtG2G0pSkInUry1z7hEMz2pY,51062
78
78
  sqlglot/optimizer/unnest_subqueries.py,sha256=kzWUVDlxs8z9nmRx-8U-pHXPtVZhEIwkKqmKhr2QLvc,10908
79
- sqlglot-27.4.1.dist-info/licenses/LICENSE,sha256=AI3__mHZfOtzY3EluR_pIYBm3_pE7TbVx7qaHxoZ114,1065
80
- sqlglot-27.4.1.dist-info/METADATA,sha256=QgRU7ePRB-jDv1RMJMz1ey_5cK8TZqrmeJ5XKosvD7o,20731
81
- sqlglot-27.4.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
82
- sqlglot-27.4.1.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
83
- sqlglot-27.4.1.dist-info/RECORD,,
79
+ sqlglot-27.5.0.dist-info/licenses/LICENSE,sha256=p1Yk0B4oa0l8Rh-_dYyy75d8spjPd_vTloXfz4FWxys,1065
80
+ sqlglot-27.5.0.dist-info/METADATA,sha256=SspHxQsSmW6W61kDt4YpS2y4q0fchhQiSVjQWqE9uRY,19437
81
+ sqlglot-27.5.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
82
+ sqlglot-27.5.0.dist-info/top_level.txt,sha256=5kRskCGA_gVADF9rSfSzPdLHXqvfMusDYeHePfNY2nQ,8
83
+ sqlglot-27.5.0.dist-info/RECORD,,
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 Toby Mao
3
+ Copyright (c) 2025 Toby Mao
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal